【问题标题】:expanding recyclerview item扩大回收站查看项目
【发布时间】:2023-03-27 18:17:01
【问题描述】:

如果我扩展 recyclerview 中的任何项目,它会很好地扩展,但是当我向下滚动 recyclerview 时,我发现其他项目也扩展了,由于回收,它采用了扩展尺寸而不是原来的尺寸

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

        }
    }
}

所以 我该如何解决这个问题,还有没有更好的方法来展开和折叠项目?

【问题讨论】:

  • 你能详细说明你是如何达到这个效果的吗?
  • 我使用的代码效率不高,因为它将单元格扩展为特定大小。扩展单元格的更好方法是使用代码Here 将其扩展为包装内容,因为单元格高度不一样
  • @mohabelmahdy 你能提供整个工作解决方案吗!!请

标签: android android-animation android-recyclerview


【解决方案1】:

我遇到了同样的问题。发生这种情况是因为 ViewHolderPattern。

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

无论视图是否扩展,Android 都会回收视图。 所以告诉android,如果你的视图被展开,它是不可回收的。

在您的 ViewHolder 类中添加:

public MyViewHolder(View itemView) {

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

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

在您的 OnClick 方法中添加:

@Override

public void onClick(final View v) {

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


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

这应该可以解决您的问题。 请记住在视图不再展开后再次将“setIsRecyclable()”设置为 true,以便 android 可以回收它。 希望我能帮上忙。

干杯

弗洛雷斯坦

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 2020-11-26
    • 1970-01-01
    相关资源
    最近更新 更多