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