2015-03-15 15 views
6

genişleyen i diğer öğeler de bağlı genişletilmiş boyutu değil özgün biri recyclerview gayet genişler ama herhangi bir öğeyi genişletmek eğer recyclerview öğeyi

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); 

     } 
    } 
} 

aldı geri dönüşüm için, genişletilmiş bulundu recylerview aşağı kaydırırken bunu nasıl düzeltir ve öğeleri genişletmek ve daraltmak için daha iyi bir yol var mı?

+0

Bu efekti nasıl elde ettiğinizi detaylandırabilir misiniz? – borax12

+0

kullandığınız kod, hücreyi belirli bir boyuta genişlettikçe etkili değildi. Hücreleri genişletmenin daha iyi bir yolu, kodu [Here] (http://stackoverflow.com/a/13381228/4561402/) olarak kullanmaktır. Bu içeriği genişletmek için genişletir, çünkü hücreler aynı yükseklikte değil –

+0

@mohabelmahdy tüm çalışma çözümünü sağlayabilir misiniz? PLease – goonerDroid

cevap

8

Aynı konuyla karşılaştım. Bu ViewHolderPattern nedeniyle olur.

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

Android genişletilmiş veya değil regardlessly eğer görünümü geri dönüştürür. Android'e, görüşünüz genişlediyse, geri dönüştürülemez olduğunu söyleyin. Kişisel ViewHolder sınıfındaki

ekleyin: OnClick Yöntemi

public MyViewHolder(View itemView) { 

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

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

ekleyin:

@Override 

public void onClick(final View v) { 

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


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

Bu sorunu çözmek gerekir. "setIsRecyclable()" ifadesini, görünümün genişletilmesinden sonra tekrar true olarak ayarlamayı unutmayın. Böylece, android bunu geri dönüştürebilir. Umarım yardımcı olabilirim.

Alkış

Florestan

+0

teşekkürler, iyi çalıştı –

0

sadece maksimum okunabilirliği almak için kodunuzu değiştirebilirsiniz. Yani, değer animatörü yerine notifyItemChanged() yöntemini kullanmalısınız. Bunun için my answer kontrol edin. Bunu yaparak çok zaman kazanabilirsiniz.