当前位置: 首页 > 知识库问答 >
问题:

滚动时重用视图时,保存在RecyclerView中所选项目的状态

周墨一
2023-03-14

我已经为recyclerView创建了一个适配器和ViewHolder。我将itemView的imageButton绑定到Viewholder中。并在onBindViewHolder中设置了onClickListener。

一切正常,但问题是,当我向下滚动列表时,imageButton的选定状态会因选定项目而改变,列表底部的一些项目已显示为选中。

下面是一些代码

public class ListViewHolder extends RecyclerView.ViewHolder {
    TextView textViewUserName;
    ImageButton imageButtonCheckMark;

    public ListViewHolder(View itemView) {
        super(itemView);
        textViewUserName = (TextView) itemView.findViewById(R.id.textView_user_name);
        imageButtonCheckMark = (ImageButton) itemView.findViewById(R.id.imageButton_add_user);
    }
}

适配器类

public class ListAdapter extends RecyclerView.Adapter<ListAdapter.ListViewHolder> {

    private LayoutInflater inflater;
    private Context context;
    private List<Metadata> list;
    public static boolean isUserSelected = false;
    ListInterface listener;

    public ListAdapter(Context context, List<Metadata> data, ListInterface listener) {
        Log.d(TAG, "Passed list to adapter : " + data.size());
        inflater = LayoutInflater.from(context);
        this.context = context;
        this.list = data;
        this.listener = listener;
    }

    @Override
    public ListViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = inflater.inflate(R.layout.item_following_people, parent, false);
        return new ListViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ListViewHolder holder, int position) {

        holder.textViewUserName.setText(list.get(position).name);

        holder.imageButtonCheckMark.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (!isUserSelected) {
                    holder.imageButtonCheckMark.setImageResource(R.drawable.checkmark_green);
                    isUserSelected = true;
                } else {
                    holder.imageButtonCheckMark.setImageResource(R.drawable.checkmark_grey);
                    isUserSelected = false;
                }
                listener.onUserSelected(isUserSelected, holder.getLayoutPosition());
            }
        });
    }


    @Override
    public int getItemCount() {
        return list.size();
    }
}

接口类

public interface ListInterface {
    public void onUserSelected(boolean userStatus, int listPosition);
}

活动内的接口回调侦听器

// Interface callback listener implemented in the activity class
private ArrayList<Metadata> metadataList = new ArrayList<>();
ArrayList<String> selectedUserIdList = new ArrayList<>();

@Override
public void onUserSelected(boolean isUserSelected, int pos) {
    if (isUserSelected) {
        Log.d(TAG, "Selected user Id: " + metadataList.get(pos).userID);
        followersSelectedIdList.add(metadataList.get(pos).userID);
    } else {
        Log.d(TAG, "Removed user Id: " + metadataList.get(pos).userID);
        followersSelectedIdList.remove(metadataList.get(pos).userID);
    }
}

共有2个答案

狄令
2023-03-14

模型类中添加一个属性,该属性将在按钮被选中或未选中时保存状态,请在onBindViewHolder()中编写代码,以如下方式管理按钮视图,

if(yourModel.getIsSelected()){
   // positive view
} else { 
   //negative view
} 
籍英叡
2023-03-14

您之所以会看到这种行为,是因为视图在滚动时会被重用(回收)。您需要保存列表中所有按钮的状态,并在onBindViewHolder()中设置每个按钮的状态。

 类似资料:
  • 下面是我要做的:我在屏幕底部有一个水平的RecyclerView。当我单击一个项目时,我希望在该特定项目上方显示一个弧形菜单(类似于此http://www.andbrain.com/wp-content/uploads/2015/04/device-2015-04-07-165251.png),该菜单允许一些操作: 由于弧形菜单不能包含在item视图中,所以我使用了item视图管理的PopupWi

  • 问题内容: 我有一个RecyclerView,每个元素代表一个事件。我想让用户通过单击选择事件。选择后,事件和报告按钮将变为彩色: 进行点击之前的用户界面:点击此处。 用户界面执行单击后:单击此处。 这非常简单,并且据称有效。我为每个负责为项目着色的对象设置了一个,并在触发时触发了名为的拥有活动中的另一个事件,该事件负责更改按钮的状态。 但是,滚动浏览RecyclerView的项目时,其他不相关的

  • 我有一个问题与自动滚动在滚动视图。 在我的例子中,有两个Recyclerview。第一个循环视图,水平滚动,第二个垂直滚动。第一个循环视图仅用于拖动,第二个循环视图只用于拖放。两个循环视图都在ScrollView中,所以我在第二个循环视图中禁用了垂直滚动。我在第二个Recyclerview的项目中添加了DragListener。每个项目都有一个拖动侦听器,因此我在拖放项目时添加/替换项目。 所以我

  • 我已经设置了一个回收器视图,每行都有文本视图和隐藏按钮。 如果用户单击该项,就会显示按钮。 如果用户单击其他项,则按钮将被隐藏。 再循环视图将位置发送到每个接口的活动,该活动更改其属性。 只要不滚动recyclerview,一切都能完美运行。 Layoutmanager.getchildat(职位) 现在,当项目超出视图时,用户滚动recyclerview,位置就会出错。每向下滚动一个用户单击的项

  • 我有一个带有CardViews的RecyclerView列表,它运行良好。当用户在名为ActActivity的输入UI上输入数据时,创建CardViews。当用户稍后单击CardView以编辑原始数据时,onItemClick方法使用捕获适配器中正确CardView项位置的start方法再次启动ActActivity。 当用户单击UI上的Save按钮以保存编辑的数据时,ActActivity UI

  • 我已经设法让我的应用程序在复选框状态更改时更新数据库,但当我滚动应用程序时,复选框的状态会更改。 我的问题是:如何保存复选框的状态,以便在滚动视图时它们不会更改? 这是我的光标适配器。