如何将Recyclerview物品保持在同一位置?

时间:2016-03-27 18:27:35

标签: android android-recyclerview

我有以下问题。我从Fragment类中填充了Recyclerview。到目前为止一切顺利。然而,当我测试我的应用程序并向上和向下滚动填充的回收列表时,每个项目的内容都会改变a.k.a.它们会被回收......

滚动后,如何保存每个项目的位置并将其内容恢复到相同的位置?

有什么建议吗?

5 个答案:

答案 0 :(得分:6)

好问题,这是你的答案 holder.setIsRecyclable(false)

@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    LayoutInflater inflater = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View view = inflater.inflate(R.layout.product_recycle_buyer_list_item, parent, false);
    MyViewHolder holder = new MyViewHolder(view);

    holder.setIsRecyclable(false);

    return holder;
}

答案 1 :(得分:2)

setIsRecyclable(false)是一个糟糕的解决方案,因为它会在您滚动时创建越来越多的视图,这会破坏使用RecyclerView的整个过程。不仅需要更多CPU,而且滚动和查看新项目越多,它将使用的内存就越多。更糟糕的是,如果显示位图,则位图往往会占用大量内存。

您应该做的是实现onBindViewHolder以将视图绑定到它应该具有的数据。在使用位图的情况下也使用缓存。

您可以查看我制作的示例代码here,该代码会询问我想要解决的其他问题。

答案 2 :(得分:0)

执行holder.setIsRecyclable(false);会将您的RecyclerView转换为ListView

相反,这样做

只需在RecyclerAdapter中覆盖这两个方法

  @Override
    public int getItemViewType(int position) {
        return position;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

答案 3 :(得分:0)

万一有人遇到这种情况,holder.setIsRecyclable(false)会这样做,但是,这只会使回收者视图成为列表视图,并且还会消耗更多资源。覆盖getItemViewTypegetItemId应该可以解决。

答案 4 :(得分:-1)

如果我正确理解了这个问题,那么当您调用 set adapter 时,您不想滚动到上方。 我发现的最好方法是调用

YourRcv.swapAdapter(YourAdapter, Bolean removeAndRecycleExistingViews); // true if yes false if no

我在包 androidx.recyclerview.widget 的第 1142 行找到了这个方法,类 RecyclerView.java