Java 如何在RecyclerView OnClickListener中管理多个职位
我想知道如何在这个onclicklistener视图中访问数组的其他元素。具体来说,我希望能够更改除当前侦听器位置之外的位置的启用状态,但在单击事件中 我试图使它这样,如果三种颜色被选中(那些是复选框),每个未选中的框将被禁用,直到选中的框数小于3 我编写的for循环是有意义的,但由于某些原因,我无法以编程方式更改onClickListener中的启用状态Java 如何在RecyclerView OnClickListener中管理多个职位,java,android,android-recyclerview,Java,Android,Android Recyclerview,我想知道如何在这个onclicklistener视图中访问数组的其他元素。具体来说,我希望能够更改除当前侦听器位置之外的位置的启用状态,但在单击事件中 我试图使它这样,如果三种颜色被选中(那些是复选框),每个未选中的框将被禁用,直到选中的框数小于3 我编写的for循环是有意义的,但由于某些原因,我无法以编程方式更改onClickListener中的启用状态 private void buildRecyclerView() { mRecyclerView = find
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()){
tomCheckBox.setOnClickListener(new View.OnClickListener(){
@i_A_mok!!!你是真正的耶稣兄弟。它成功了。很久以来一直在试图解决这个问题。谢谢!你能解释一下它是如何工作的以及为什么以前不工作吗?尝试过这个。不幸的是,它不让我相信