我目前正处理一个相当复杂的RecyclerView
:
我填充RecyclerView
的每个项目内部都有LinearLayout
,我需要在" onBindViewHolder
"方法,包含自定义项目。因此它最终成为RecyclerView
linearLayouts
内部的项目(我的RecyclerView
的垂直滚动,每个linearLayouts
的水平滚动)。
当我点击其中一个LinearLayouts
内的项目时,我需要在其上放置一些UI
图像,以表明它是当前所选项目。在每个膨胀的项目上都没有太难,OnClickListener
,然后我设置了UI
资源。但是当我需要从PREVIOUS选择的项目中删除UI
资源时,它开始变得棘手(只能有一个选定的项目)。
调用notifyDataSetChanged
或notifyItemChanged
会使整个RecyclerView
数据(或行)刷新,重新创建每个布局(或行的布局)中动态膨胀的项目,并重置水平滚动位置(我想要保留,以便用户不会被带回水平滚动0)。
每次LinearLayouts
notifyDataSetChanged
我的RecyclerView
时,是否有一个简单的解决方案可以保持Comparable
的水平滚动状态,以便保留它们?提前致谢
答案 0 :(得分:0)
您应该保存水平滚动位置,例如数组甚至对象属性,并在bindviewholder上滚动它。
int[] scrollXState = new int[<data size>];
@Override
public void onViewRecycled(MyViewHolder holder) {
scrollXState[holder.getAdapterPosition()] =
holder.nestedRecyclerView.getScrollX();
super.onViewRecycled(holder);
}
和onBindViewHolder
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
holder.nestedRecyclerView.post(() ->
holder.nestedRecyclerView.setScrollX(scrollXState[holder.getAdapterPosition()]));
}
答案 1 :(得分:0)
好吧,通过一些调整,我做了它的工作:我创建了一个我称之为&#34; onItemClicked&#34;的接口,它有两个功能&#34; select(int position)&#34;和&#34;取消选择()&#34;。此接口由ViewHolder实现,每当单击一个项目时,我选择该项目,并使适配器取消选择每个其他项目。通过这样做,我摆脱了&#34; notifyDataSetChanged()&#34;这困扰我,它按预期工作!
您的解决方案似乎正常工作,我没有检查&#34; nestedRecyclerView&#34;得到卷轴,这本可以救我,哈哈。
感谢您的快速回答。