Android 如何使Recyclerview项目保持在同一位置?

Android 如何使Recyclerview项目保持在同一位置?,android,android-recyclerview,Android,Android Recyclerview,我有以下问题。我从片段类填充一个Recyclerview。到目前为止一切顺利。然而,当我测试我的应用程序并上下滚动填充的回收器列表时,每个项目的内容都会发生变化,也就是说,它们会被回收 如何保存每个项目的位置并在滚动后将其内容恢复到相同的位置 有什么建议吗?好问题,这是您的答案持有者。设置可循环(错误) @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { LayoutInf

我有以下问题。我从片段类填充一个Recyclerview。到目前为止一切顺利。然而,当我测试我的应用程序并上下滚动填充的回收器列表时,每个项目的内容都会发生变化,也就是说,它们会被回收

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


有什么建议吗?

好问题,这是您的答案持有者。设置可循环(错误)

@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;
}
setIsRecyclable(false)
是一个糟糕的解决方案,因为它会在滚动时创建越来越多的视图,这会破坏使用RecyclerView的整个意义。它不仅需要更多的CPU,而且滚动和查看新项目越多,它将使用的内存就越多。如果显示位图,情况更糟,因为位图往往占用大量内存

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


您可以查看我编写的示例代码,它要求我解决另一个问题。

执行此操作
holder.setIsRecyclable(false)
将把您的
回收视图
转换为
列表视图

而是这样做

只需在您的RecyclerAdapter中重写这两个方法

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

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

如果有人遇到这种情况,
holder.setIsRecyclable(false)
将执行此操作,但这样做只会使回收器视图成为列表视图,并消耗更多资源。覆盖
getItemViewType
getItemId
应该可以解决这个问题。

如果我正确理解了这个问题,在调用set adapter时,您不希望在上面滚动。 我找到的最好办法就是打电话

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

我在package
androidx.recyclerview.widget
,class recyclerview.java

中的第1142行找到了这个方法,显示您的适配器代码。您需要向我们展示您的recyclerview实现。首先,我初始化recyclerview,然后调用setLayoutManager(新的LinearLayoutManager(getActivity());最后调用setLayoutManager(新的LinearLayoutManager(getActivity());供任何打算使用的人使用。注意,这会将您的RecyclerView转换为ListView。我的意思是你的观点,回收能力已经消失了。RecyclerView的全部要点是具有“可回收性”,您只需使用
holder.setisRecyclerable(false)
:)销毁所有结构即可