2015-03-15 2 views
6

, wenn ich ein Element in der recyclerview erweitern dehnt es sich gut, aber wenn ich nach unten scrollen die recylerview i andere Gegenstände auch erweitert gefunden, aufgrund Recycling es die erweiterte Größe nahm nicht das ursprünglicheerweitert recyclerview Artikel

public class FeedAdapter extends RecyclerView.Adapter<FeedAdapter.MyViewHolder> implements View.OnClickListener { 

    private LayoutInflater inflater; 
    private Context mcontext; 
    private int mOriginalHeight = 0; 
    private boolean mIsViewExpanded = false; 

    public FeedAdapter(Context context) { 
     inflater = LayoutInflater.from(context); 
     mcontext = context; 

    } 


    @Override 
    public MyViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 

     View view = inflater.inflate(R.layout.custom_row, viewGroup, false); 
     MyViewHolder holder = new MyViewHolder(view); 
     holder.frame.setOnClickListener(this); 


     return holder; 
    } 

    @Override 
    public void onBindViewHolder(MyViewHolder myViewHolder, int i) { 


    } 

    @Override 
    public int getItemCount() { 
     return 100; 
    } 

    @Override 
    public void onClick(final View v) { 
     if (mOriginalHeight == 0) { 
      mOriginalHeight = v.getHeight(); 
     } 
     ValueAnimator valueAnimator; 
     if (v.getHeight() < (mOriginalHeight + (int) (mOriginalHeight * 1.5))) { 
      valueAnimator = ValueAnimator.ofInt(mOriginalHeight, mOriginalHeight + (int) (mOriginalHeight * 1.5)); 
     } else { 
      valueAnimator = ValueAnimator.ofInt(mOriginalHeight + (int) (mOriginalHeight * 1.5), mOriginalHeight); 
     } 
     valueAnimator.setDuration(300); 
     valueAnimator.setInterpolator(new LinearInterpolator()); 
     valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
      public void onAnimationUpdate(ValueAnimator animation) { 
       Integer value = (Integer) animation.getAnimatedValue(); 
       v.getLayoutParams().height = value.intValue(); 
       v.requestLayout(); 
      } 
     }); 
     valueAnimator.start(); 

    } 

    class MyViewHolder extends RecyclerView.ViewHolder { 


     FrameLayout frame; 

     public MyViewHolder(View itemView) { 

      super(itemView); 
      frame = (FrameLayout) itemView.findViewById(R.id.base); 

     } 
    } 
} 

also Wie behebe ich das und gibt es auch eine bessere Möglichkeit, Elemente zu erweitern und zu reduzieren?

+0

Können Sie erläutern, wie Sie den Effekt erzielt haben? – borax12

+0

Der Code, den ich verwende, war nicht effizient, da er die Zelle auf eine bestimmte Größe erweitert. Eine bessere Möglichkeit, die Zellen zu erweitern, ist die Verwendung des Codes [Here] (http://stackoverflow.com/a/13381228/4561402/) als es erweitert es, um Inhalt zu wickeln, weil Zellen nicht die gleiche Höhe haben –

+0

@mohabelmahdy können Sie die gesamte Arbeitslösung zur Verfügung stellen !! Bitte – goonerDroid

Antwort

8

Ich stieß auf das gleiche Problem. Dies geschieht aufgrund des ViewHolderPatterns.

https://developer.android.com/reference/android/support/v7/widget/RecyclerView.ViewHolder.html#isRecyclable%28%29

Android wird die Ansicht recyceln, rücksichtslos, wenn es erweitert ist oder nicht. Also sagen Sie Android, wenn Ihre Ansicht erweitert wird, ist es nicht recycelbar.

in Ihrer ViewHolder Klasse hinzufügen:

public MyViewHolder(View itemView) { 

    super(itemView); 
    frame = (FrameLayout) itemView.findViewById(R.id.base); 

    frame.setTag(this); // to get a reference to viewholder later on 
} 

in Ihrer OnClick Methode hinzufügen:

@Override 

public void onClick(final View v) { 

    MyViewHolder holder = (MyViewHolder) v.getTag(); 
    holder.setIsRecyclable(false); 


    if (mOriginalHeight == 0) { 
     mOriginalHeight = v.getHeight(); 
    } 
    ValueAnimator valueAnimator; 
    ... 
} 

dies Ihr Problem lösen soll. Denken Sie daran, "setIsRecycable()" wieder auf "true" zu setzen, nachdem die Ansicht nicht mehr erweitert wurde, damit Android sie wiederverwenden kann. Ich hoffe, ich könnte helfen.

Prost

Flore

+0

danke, funktionierte gut –

0

Sie können nur Ihren Code ändern maximale Lesbarkeit zu erhalten. Sie müssen also notifyItemChanged() Methode anstelle von Wert Animator verwenden. Überprüfen Sie hierzu my answer. Sie können dadurch viel Zeit sparen.