如何在2个recyclerviews中只选择一个复选框



我在一个片段上得到了2个recyclerviews。两个recyclerview都包含项和复选框。在两个recyclerview中,只有一个复选框是可选的。因此,如果选中了一个复选框,那么在BOTH RECYCLERVIEWS等中所有其他复选框都应该关闭。

这是我当前的代码。这段代码意味着在每个recyclerview中当前只能选中一个复选框。

我的两个recylcerviewadapter看起来像这样(注意:两者都是相同的,所以我只发布其中一个):

@Override
public void onBindViewHolder(@NonNull NameViewHolder holder, @SuppressLint("RecyclerView") int position) {
//getting broadcast from 1st recyclerviewadapter
LocalBroadcastManager.getInstance(context).registerReceiver(mNameReceiver, new IntentFilter("checkbox_first_adapter"));
String name = namesArrayList.get(position);
holder.nameView.setText(name);

holder.checkBox.setVisibility(View.VISIBLE);
holder.checkBox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
rowIndex = position;
notifyDataSetChanged();
//If checkbox is checked, send broadcast to 2nd recyclerviewadapter
sendCheckBoxBroadCast();
isClicked = true;
}
});

if (isCheckBoxChecked) {
holder.checkBox.setChecked(false);
}

if (!isClicked) {
if (selectedName != null) {
if (name.equals(selectedName.getName())) {
holder.checkBox.setChecked(true);
sendCheckBoxBroadCast();
}
}
} else {
if (rowIndex == position) {
holder.checkBox.setChecked(true);
} else {
holder.checkBox.setChecked(false);
}
}
}

public BroadcastReceiver mNameReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
isCheckBoxChecked = intent.getBooleanExtra("isCheckBoxChecked", false);
}
};
private void sendCheckBoxBroadCast() {
Intent intent = new Intent("checkbox_second_adapter");
intent.putExtra("isCheckBoxChecked", true);
LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
}

我如何向第二个recyclerview适配器发送一个复选框已被选中的信号,以便它知道取消选中所有复选框?

有三种方法:

第一种肮脏的方法是将一个适配器传递给另一个适配器,反之亦然,当一个适配器有复选框事件时,它回调另一个适配器。

第二种方法是实现某种接口。你说两个适配器是相似的,所以这应该不是问题。这个接口只有一个方法,即更新复选框的回调。在调用者活动类中,您应该能够同时管理它们(如果需要添加更多的话,您也可以将它们放入数组中),并从任何一个适配器获得回调。

第三种,也许是最干净的方法是合并recylcerviews:因为一个recyclerview可以显示不同类型的视图(你只需要摆弄一下onBindViewHolder方法),它可能(取决于情况,你没有提供足够的信息,这是可能的或完全排除)只使用一个适配器类。

相关内容

最新更新