Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/215.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在RecyclerView OnClickListener中管理多个职位_Java_Android_Android Recyclerview - Fatal编程技术网

Java 如何在RecyclerView OnClickListener中管理多个职位

Java 如何在RecyclerView OnClickListener中管理多个职位,java,android,android-recyclerview,Java,Android,Android Recyclerview,我想知道如何在这个onclicklistener视图中访问数组的其他元素。具体来说,我希望能够更改除当前侦听器位置之外的位置的启用状态,但在单击事件中 我试图使它这样,如果三种颜色被选中(那些是复选框),每个未选中的框将被禁用,直到选中的框数小于3 我编写的for循环是有意义的,但由于某些原因,我无法以编程方式更改onClickListener中的启用状态 private void buildRecyclerView() { mRecyclerView = find

我想知道如何在这个onclicklistener视图中访问数组的其他元素。具体来说,我希望能够更改除当前侦听器位置之外的位置的启用状态,但在单击事件中

我试图使它这样,如果三种颜色被选中(那些是复选框),每个未选中的框将被禁用,直到选中的框数小于3

我编写的for循环是有意义的,但由于某些原因,我无法以编程方式更改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);

                        }

                    }

                }

            });

        }


换句话说,我正在尝试禁用蓝色以下的所有内容,直到取消选中红色、绿色或蓝色

您需要为Adpater类中的“mExampleList”创建一个setter函数,以更新适配器正在使用的数据集。如果您在活动中对“mExampleList”进行更改,而不更新适配器使用的列表,则显然不会更改任何内容

因此,在单击侦听器的末尾,您会有如下内容:

mAdapter.setExampleList(mExampleList)
mAdapter.notifyDataSetChanged()

您需要为Adpater类中的“mExampleList”创建一个setter函数,以更新适配器正在使用的数据集。如果您在活动中对“mExampleList”进行更改,而不更新适配器使用的列表,则显然不会更改任何内容

因此,在单击侦听器的末尾,您会有如下内容:

mAdapter.setExampleList(mExampleList)
mAdapter.notifyDataSetChanged()
请尝试以下操作:

在适配器中,添加以下代码:

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);
}
    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);
            }
        }
    });
然后在Activity/Fragment中,将mAdapter.setOnItemClickListener(新示例Adapter.OnItemClickListener()…更改为:

@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);
}
    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);
            }
        }
    });
请注意,无需在示例项类中设置菜单启用字段。希望对您有所帮助

解释: 关于onClick:-这是因为复选框完全覆盖了布局,所以itemView无法接收单击事件。关于RecyclerView:-想法很简单,在修改数据集后[非列表,这里我指的是mExampleList和selectedCount],然后调用notifyDataSetChanged()将重新绘制所有回收项目视图。

请尝试以下操作:

在适配器中,添加以下代码:

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);
}
    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);
            }
        }
    });
然后在Activity/Fragment中,将mAdapter.setOnItemClickListener(新示例Adapter.OnItemClickListener()…更改为:

@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);
}
    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);
            }
        }
    });
请注意,无需在示例项类中设置菜单启用字段。希望对您有所帮助

解释:

关于onClick:-这是因为复选框完全覆盖了布局,所以itemView无法接收单击事件。关于RecyclerView:-想法很简单,在修改数据集后[非列表,这里我指的是mExampleList和selectedCount],然后调用notifyDataSetChanged()这将重新绘制所有回收器项目视图。

尝试使用
singleItemSelection
RecycleService简单的方法是在底部回调中添加mAdapter.notifyDataSetChange。单击,您已经将enable设置为data,但view不设置为NotifyThank。谢谢,聪。我将其放在for循环的正下方,没有任何更改。实际上,我以前只使用了mExampleList.get(任意位置).setEnabled1(false);和mAdapter.notifyItemChanged(相同的任意位置);不走运。我可以在onCreate中启用它们,但这是一次性的。我需要它是onClick事件。尝试使用
singleItemSelection
RecycleService简易方法是添加mAdapter.notifyDataSetChange在底部回调onItemClick中,您已经将enable设置为data,但不查看NotifyThank,Cong。我将其放在for循环的正下方,而不是hing改变了。事实上,我以前只是用mExampleList.get(任意位置)、setEnabled1(false)和mAdapter.notifyItemChanged(相同的任意位置)尝试过;不走运。我可以在onCreate中启用它们,但这是一次性的。我需要它是一个onClick事件。谢谢!我将尝试以某种方式实现它,看看它是否能正常工作。这似乎无法正常工作:public void setExampleList(ArrayList mExampleList){this.mExampleList=mExampleList;}放置在适配器中。在单击事件期间仍无法更新列表的其他部分。谢谢!将尝试以某种方式实现此功能,并查看是否可以使其正常工作。这似乎无法正常工作:public void setExampleList(ArrayList mExampleList){this.mExampleList=mExampleList;}放置在适配器中。在单击事件期间仍然无法更新列表的其他部分。尝试了此操作。不幸的是,它不允许我在单击任何其他位置时有条件地修改列表的其他部分。onClickListener仅允许您修改单击事件发生的特定位置。它不允许您跳出该位置t定位并更改其他视图状态。在选择3个项目后是否禁用其他复选框?在取消选择项目后是否启用复选框?之后是否可以选择新项目?我认为在单击带有禁用复选框的项目时没有任何操作,否则我不知道为什么禁用复选框。其他复选框未禁用,但这就是我想要的。虽然我可以禁用主活动onCreate中的特定框,但如果我转到主活动中的mAdapter onClickListener,mExampleList.get(3)。setEnabled1不做任何事情。事实上,我甚至不能在该onClick中祝酒。在适配器中,更改
itemView.setOnClickListener(new View.onClickListener()){
to
mCheckBox.setOnClickListener(new View.OnClickListener(){
@i_A_mok!!!你是真正的耶稣兄弟。它成功了。很久以来一直在试图解决这个问题。谢谢!你能解释一下它是如何工作的以及为什么以前不工作吗?尝试过这个。不幸的是,它不让我相信