在recyclerview中的Android水平滚动位置与膨胀的线性布局丢失

时间:2017-11-06 10:41:35

标签: android android-recyclerview

我目前正处理一个相当复杂的RecyclerView: 我填充RecyclerView的每个项目内部都有LinearLayout,我需要在" onBindViewHolder"方法,包含自定义项目。因此它最终成为RecyclerView linearLayouts内部的项目(我的RecyclerView的垂直滚动,每个linearLayouts的水平滚动)。

当我点击其中一个LinearLayouts内的项目时,我需要在其上放置一些UI图像,以表明它是当前所选项目。在每个膨胀的项目上都没有太难,OnClickListener,然后我设置了UI资源。但是当我需要从PREVIOUS选择的项目中删除UI资源时,它开始变得棘手(只能有一个选定的项目)。

调用notifyDataSetChangednotifyItemChanged会使整个RecyclerView数据(或行)刷新,重新创建每个布局(或行的布局)中动态膨胀的项目,并重置水平滚动位置(我想要保留,以便用户不会被带回水平滚动0)。

每次LinearLayouts notifyDataSetChanged我的RecyclerView时,是否有一个简单的解决方案可以保持Comparable的水平滚动状态,以便保留它们?提前致谢

2 个答案:

答案 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;得到卷轴,这本可以救我,哈哈。

感谢您的快速回答。