【问题标题】:Android RecyclerView - scrolling changes itemsAndroid RecyclerView - 滚动更改项目
【发布时间】:2016-10-13 10:38:53
【问题描述】:

我有一个带有线性布局管理器的回收视图,它包含不同的项目。 其中一项具有隐藏或显示该项的嵌套布局的按钮。

所以我添加了类似 10 行的特定类型,当我点击特定项目时,它的嵌套布局被显示,但我看到另一个项目显示它自己的嵌套布局。 第二次尝试是单击某个按钮并滚动,嵌套布局显示在不同的项目上。

从代码中可以看出,我尝试调用方法 - notifyDataSetChanged(),但没有帮助。 我知道有扩展的回收器视图,但就我而言,我想在不更改整个代码的情况下解决它..

布局:

<RelativeLayout 
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
>
    <TextView 
        android:id = "@+id/tv"
        android:layout_height="wrap_content"
        android:layout_width = "wrap_content"
        android:text = "click on the button"
    />
    <Button 
        android:id = "@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Click Me"
        android:layout_toRightOf="@+id/tv"
    />

    <RelativeLayout
        android:id = "@+id/nested"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/tv"
        android:visibility="gone"
    >

        <TextView 
           android:id = "@+id/tv1"
           android:layout_height="wrap_content"
           android:layout_width = "wrap_content"
           android:text = "click on the button"
       />   
    </RelativeLayout>
</RelativeLayout>

适配器中的代码(onBind)

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position)
    {
        int type = getItemViewType(position);
        ViewType viewType = ViewType.values()[type];
        try
        {
            switch (viewType)
            {
                case VIEW1:
                  // code for view 1
                break;
                case VIEW2:

                    final ViewHolder viewHolder = (ViewHolder) holder;

                    viewHolder.tv.setText("TV1");
                    viewHolder.btn.setOnClickListener(new View.OnClickListener()
                    {
                        @Override
                        public void onClick(View v)
                        {

                            viewHolder.nestedLayout.setVisibility(!isVisible ? View.VISIBLE : View.GONE );
                            viewHolder.isVisible = !viewHolder.isVisible;

                            // notifyDataSetChanged();
                        }
                    });


                break;

            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
            Log.d("ChatListAdapter","chat list adapter ioexception" + e.getMessage());
        }
    }

【问题讨论】:

  • 这个 RecyclerView 是在你的活动上还是在片段上?
  • @SamuelRobert,关于活动
  • 您的数据模型应该保留您想要操作的视图的可见性状态。否则滚动时会丢失它。
  • 试试this 回答。就我而言,它有效。

标签: android android-recyclerview


【解决方案1】:

正如 Samuel Robert 所指出的,您需要在模型类中跟踪扩展项的可见性:

假设您正在使用模型类项目,其中有一个字段来跟踪嵌套布局的可见性。

试试这个:

Item item = itemList.get(position);
final ViewHolder viewHolder = (ViewHolder) holder;
viewHolder.tv.setText("TV1");
viewHolder.nestedLayout.setVisibility(!item.isVisible ? View.VISIBLE : View.GONE );
viewHolder.btn.setOnClickListener(new View.OnClickListener()
    {
       @Override
       public void onClick(View v)
       {
        int position = getAdapterPosition();
        if( position != RecyclerView.NO_POSITION ) {
          Item item = itemList.get(position)
          item.isVisible = !item.isVisible;
          notifyItemChanged(position);
        }
       }
     });

【讨论】:

    【解决方案2】:

    在数据模型中有 id 字段并覆盖 getItemId() 如下所示,

    @Override
        public long getItemId(int position) {
            return yourList.get(position).getId();
        }
    

    【讨论】:

      【解决方案3】:

      您必须为每个视图设置可见性状态(每次调用 onBindViewHolder)。我想你会发生什么是你设置了一个视图的可见性,该视图稍后被回收并设置了可见性。

      【讨论】:

      • 对于每个嵌套布局,可见性的默认值为“gone”。所以如果用户点击第二个项目按钮,这个特定嵌套布局的可见性值将是“可见的”,而所有其他的都将保持“消失”
      • 也许我当时没有遇到问题。如果您有多个视图向您显示视图持有者设置值的问题或您具有相同的 viewId,我猜后者是不可能的。我建议您尝试将每个视图的值打印为调试。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-10
      • 1970-01-01
      • 2022-01-01
      • 2016-03-20
      • 1970-01-01
      • 2021-12-28
      • 1970-01-01
      相关资源
      最近更新 更多