【问题标题】:Items of RecyclerView are not showing correctlyRecyclerView 的项目未正确显示
【发布时间】:2016-08-17 20:57:05
【问题描述】:

在我的RecyclerView.Adapter<SearchAdapter.ViewHolder> 中的onBindViewHolder 中,当用户单击cardview 时,一个按钮变得可见。但是当我滚动 recyclerview 时,其他一些项目按钮也显示为可见。为什么会这样?

这是我的代码:

@Override
public void onBindViewHolder(final ViewHolder viewHolder, final int position) {
    viewHolder.card.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (viewHolder.content_layout.getVisibility() == View.VISIBLE) {
                viewHolder.content_layout.setVisibility(View.GONE);
                viewHolder.address.setMaxLines(2);
                viewHolder.attribute.setMaxLines(2);
            } else {
                viewHolder.content_layout.setVisibility(View.VISIBLE);
                viewHolder.address.setMaxLines(8);
                viewHolder.attribute.setMaxLines(8);
            }
        }
    });
    ...
}

【问题讨论】:

  • 请在此处发布您的代码

标签: java android android-recyclerview


【解决方案1】:

创建一个数组,例如布尔数组,并在每个位置单击时,在数组的相同位置设置为true。并在 onBindViewHolder 检查该 array[position] 是否为 true 设置该项目是否可见。

【讨论】:

  • 我正在和arraylist.get(position).type一起做这个
【解决方案2】:

一旦您开始向下滚动列表,您的视图就会被回收。这意味着之前膨胀的 ViewHolder(一些在 onCreateViewHolder 中创建)被重用。
所以你要做的是记住点击的位置(例如通过SparseBooleanArray)并检查onBindViewHolder视图是否应该可见(之前点击)。

您可以在this StackOverflow 帖子中找到SparseBooleanArray 的基本用法示例

【讨论】:

    【解决方案3】:

    “其他”可见项目按钮是使用在回调中修改的相同视图的按钮。所以因为viewholders(和views)被回收了:

    • 它们应该只存储每次将 viewholder 绑定到某个位置时可以检索到的信息。

    • 视图状态中可能发生的任何更改都应在onBindViewHolder()中刷新

    在您的情况下,您应该将“被选中”存储在其他地方重置 onBindViewHolder() 中的可见性和 maxlines(不仅在回调中)

    【讨论】:

      【解决方案4】:

      好主意是在回收站视图中创建一个包含一个项目所需的所有数据的类对象,还添加一个布尔值isItemWasClicked 并在onBindViewHolder() 内部检查此布尔值并使按钮可见或不可见。 例如:

      public class OneItemOfList{
          int priceToDisplay;
          String name;
          String date;
          boolean wasClicked;
      }
      
      public class YourAdapter extends RecyclerView.Adapter<OneItemOfList.ViewHolder> {
      ArrayList<OneItemOfList> items;
      ...
      @Override
      public void onBindViewHolder(ViewHolder viewHolder, final int position) {
          viewHolder.view.setText(items.get(position).name);
          if (items.get(position).wasClicked)
              viewHolder.button.setVisible(View.VISIBLE);
          else
              viewHolder.button.setVisible(View.GONE);
          viewHolder.view2.setOnClickListener(...
              OnClick(...){
                  items.get(position).wasClicked = !items.get(position).wasClicked;
              });
      }
      ...
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-20
        • 1970-01-01
        • 1970-01-01
        • 2019-09-09
        相关资源
        最近更新 更多