2015-03-15 24 views
6

nếu tôi mở rộng bất kỳ mục trong recyclerview nó giãn nở tốt nhưng khi tôi di chuyển xuống các recylerview tôi tìm thấy các mặt hàng khác cũng được mở rộng, do tái chế phải mất kích thước mở rộng không phải là gốc mộtmở rộng recyclerview mục

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

     } 
    } 
} 

vì vậy làm cách nào để khắc phục điều đó và cũng có cách nào tốt hơn để mở rộng và thu gọn các mục?

+0

Bạn có thể giải thích cách bạn đạt được hiệu quả không? – borax12

+0

mã tôi sử dụng không hiệu quả vì nó mở rộng ô thành một kích thước cụ thể. Cách tốt hơn để mở rộng các ô là sử dụng mã [Here] (http://stackoverflow.com/a/13381228/4561402/) làm nó mở rộng nó để bọc nội dung, bởi vì các tế bào không có cùng chiều cao –

+0

@mohabelmahdy bạn có thể cung cấp toàn bộ giải pháp làm việc được không? Xin vui lòng – goonerDroid

Trả lời

8

Tôi đã gặp sự cố tương tự. Điều này xảy ra vì ViewHolderPattern.

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

Android sẽ tái chế xem, regardlessly nếu nó mở rộng hay không. Vì vậy, hãy cho android biết rằng nếu chế độ xem của bạn được mở rộng, nó không thể tái chế được.

Trong ViewHolder Your Class thêm:

public MyViewHolder(View itemView) { 

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

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

Trong Phương pháp OnClick của bạn thêm:

@Override 

public void onClick(final View v) { 

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


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

này nên giải quyết vấn đề của bạn. Hãy nhớ đặt "setIsRecyclable()" thành true sau khi chế độ xem không được mở rộng nữa để android có thể tái chế nó. Hy vọng tôi có thể giúp.

Cheers

Florestan

+0

cảm ơn, đã làm việc tốt –

0

Bạn chỉ có thể thay đổi mã của bạn để có được khả năng đọc tối đa. Vì vậy, bạn phải sử dụng phương thức notifyItemChanged() thay vì trình làm hoạt ảnh giá trị. Kiểm tra my answer cho việc này. Bạn có thể tiết kiệm rất nhiều thời gian bằng cách thực hiện nó.

Các vấn đề liên quan