如何管理RecyclerView的OnClickListener的多个位置。

问题描述 投票:0回答:1

我想知道如何才能访问Recycler视图的onclicklistener中数组的其他元素。具体来说,我希望能够改变一个位置的启用状态,而不是当前的Listener位置,但在点击事件中。

我试图使它成为这样的,如果三种颜色被选中(那些是复选框),每一个没有被选中的框将被禁用,直到被选中的框的数量是< 3。

我写的for-loops是有意义的,但由于某些原因,我不能在onClickListener内编程地改变启用状态。

  private void buildRecyclerView() {

            mRecyclerView = findViewById(R.id.recyclerView);
            mRecyclerView.setHasFixedSize(true);
            mLayoutManager = new LinearLayoutManager(this);
            mAdapter = new ExampleAdapter(mExampleList);

            mRecyclerView.setLayoutManager(mLayoutManager);
            mRecyclerView.setAdapter(mAdapter);

            mAdapter.setOnItemClickListener(new ExampleAdapter.OnItemClickListener() {
                @Override
                public void onItemClick(int position) {

                    boolean checkedState;

                    if (mExampleList.get(position).getChecked1() == false) {

                        checkedState = true;

                    } else {

                        checkedState = false;

                    }

                    changeItem(position, checkedState);

                    int sum = 0;

                    for (int i = 0; i < stringArray.length; i++) {

                        Boolean checked = mExampleList.get(i).getChecked1();

                        if (checked == true) {

                            sum = sum + 1;

                        }

                    }

                    for (int i = 0; i < stringArray.length; i++) {

                        Boolean checked = mExampleList.get(i).getChecked1();

                        if (!checked && sum == 3) {

                            mExampleList.get(i).setEnabled1(false);

                        } else {

                            mExampleList.get(i).setEnabled1(true);

                        }

                    }

                }

            });

        }

适配器

public class ExampleAdapter extends RecyclerView.Adapter<ExampleAdapter.ExampleViewHolder> {

    private ArrayList<ExampleItem> mExampleList;
    private OnItemClickListener mListener;

    public interface OnItemClickListener {

        void onItemClick(int position);

    }

    public void setOnItemClickListener(OnItemClickListener listener) {

        mListener = listener;

    }

    public static class ExampleViewHolder extends RecyclerView.ViewHolder {

        public CheckBox mCheckBox;

        public ExampleViewHolder(@NonNull View itemView, final OnItemClickListener listener) {
            super(itemView);

            mCheckBox = itemView.findViewById(R.id.checkBox);

            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    if (listener != null){

                        int position = getAdapterPosition();

                        if (position != RecyclerView.NO_POSITION);
                        listener.onItemClick(position);

                    }

                }
            });

        }
    }

    public ExampleAdapter(ArrayList<ExampleItem> exampleList) {

        mExampleList = exampleList;

    }

    @NonNull
    @Override
    public ExampleViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.example_item, parent, false);
        ExampleViewHolder evh = new ExampleViewHolder(v, mListener);
        return evh;

    }

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

        ExampleItem currentItem = mExampleList.get(position);

        holder.mCheckBox.setText(currentItem.getCheckText());
        holder.mCheckBox.setEnabled(currentItem.getEnabled1());
        holder.mCheckBox.setChecked(currentItem.getChecked1());

    }

    @Override
    public int getItemCount() {

        return mExampleList.size();

    }
}

项目类别

public class ExampleItem {

    public String mCheckText;
    public Boolean mEnabled;
    public Boolean mChecked;

    public ExampleItem(String mCheckText, Boolean mEnabled, Boolean mChecked) {

        this.mCheckText = mCheckText;
        this.mEnabled = mEnabled;
        this.mChecked = mChecked;
    }

    public ExampleItem(String mCheckText) {
        this.mCheckText = mCheckText;
    }

    public String getCheckText() {
        return mCheckText;
    }

    public void setCheckText(String mCheckText) {
        this.mCheckText = mCheckText;
    }

    public Boolean getEnabled1() {
        return mEnabled;
    }

    public void setEnabled1(Boolean mEnabled) {
        this.mEnabled = mEnabled;
    }

    public Boolean getChecked1() {
        return mChecked;
    }

    public void setChecked1(Boolean mChecked) {
        this.mChecked = mChecked;
    }

}

enter image description here

换句话说,我试图让蓝色以下的所有内容都被禁用,直到我取消选中红色、绿色或蓝色!我想知道如何在这个onclicklistener中为Recycler视图访问数组的其他元素。

java android android-recyclerview recycler-adapter
1个回答
0
投票

试试下面的方法。

在适配器中添加以下代码

private int selectedCount = 0;

public int getSelectedCount() {
    return selectedCount;
}

public void setSelectedCount(int selectedCount) {
    this.selectedCount = selectedCount;
    notifyDataSetChanged();
}

并改变 onBindViewHolder() 为。

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

    ExampleItem currentItem = mExampleList.get(position);

    holder.mCheckBox.setText(currentItem.getCheckText());
    holder.mCheckBox.setChecked(currentItem.getChecked1());
    if ((selectedCount == 3)) holder.mCheckBox.setEnabled(currentItem.getChecked1());
    else holder.mCheckBox.setEnabled(true);
}

然后在ActivityFragment中,将 MAdapter.setOnItemClickListener(new ExampleAdapter.OnItemClickListener().... 到:

    mAdapter.setOnItemClickListener(new ExampleAdapter.OnItemClickListener() {
        @Override
        public void onItemClick(int position) {
            boolean checkedState;
            int selectedCount = mAdapter.getSelectedCount();

            if ((selectedCount != 3) || (mExampleList.get(position).getChecked1())) {
                if (mExampleList.get(position).getChecked1() == false) {
                    checkedState = true;
                    selectedCount++;
                } else {
                    checkedState = false;
                    selectedCount--;
                }
                changeItem(position, checkedState);
                mAdapter.setSelectedCount(selectedCount);
            }
        }
    });

请注意,不需要有 mEnabled 领域中 示例项目 类。希望对大家有所帮助!

解释:关于onClick:-这是因为CheckBox完全覆盖了布局,所以...。itemView 不能接收点击事件。关于RecyclerView:-想法很简单,修改了数据后,就会有一个新的事件发生。设置 不是list,这里我指的是mExampleList,也是selectedCount],然后调用notifyDataSetChanged(),这将重新绘制所有回收器项目视图。


0
投票

你需要在你的Adpater类中为你的'mExampleList'创建一个setter函数,以更新适配器正在使用的数据集。如果你在你的活动中对'mExampleList'进行修改,而不更新适配器使用的列表,显然不会改变任何东西。

所以在你的点击监听器的最后,你会有这样的东西。

mAdapter.setExampleList(mExampleList)
mAdapter.notifyDataSetChanged()
© www.soinside.com 2019 - 2024. All rights reserved.