Android 如何使用具有单选按钮的项目和单选模式实现RecycerView

Android 如何使用具有单选按钮的项目和单选模式实现RecycerView,android,android-recyclerview,Android,Android Recyclerview,我需要显示一个带有单选项的回收视图。但Recyclerview没有选择模式 有人知道如何解决这个问题吗 提前谢谢 显示已检查- 您可以维护列表大小的布尔数组。在绑定视图上处理布尔(真/假)逻辑,如设置单选按钮的checktrue/false 处理新点击- 然后单击单选按钮,将每个数组元素的值设置为false,然后将当前数组位置设置为true。现在调用notifyDatatSetChanged()您可以使用类似的方法,它存储所选项目的位置,如果适配器重新排序,您可以添加更多的代码来存储项目本身 p

我需要显示一个带有单选项的回收视图。但Recyclerview没有选择模式

有人知道如何解决这个问题吗


提前谢谢

显示已检查-

您可以维护列表大小的布尔数组。在绑定视图上处理布尔(真/假)逻辑,如设置单选按钮的checktrue/false

处理新点击-


然后单击单选按钮,将每个数组元素的值设置为false,然后将当前数组位置设置为true。现在调用notifyDatatSetChanged()

您可以使用类似的方法,它存储所选项目的位置,如果适配器重新排序,您可以添加更多的代码来存储项目本身

public class SingleChoiceAdapter extends RecyclerView.Adapter<SingleChoiceAdapter.ItemViewHolder> {

    private static final int NO_POSITION = -1;
    private static final String SELECTED_ITEM_POSITION = "SELECTED_ITEM_POSITION";

    private final LayoutInflater inflater;
    private final List<Item> items;

    private int selectedItemPosition = NO_POSITION;

    public SingleChoiceAdapter(Context context, Bundle savedInstanceState) {
        inflater = LayoutInflater.from(context);
        items = new ArrayList<>();
        if (savedInstanceState != null) {
            selectedItemPosition = savedInstanceState.getInt(SELECTED_ITEM_POSITION, NO_POSITION);
        }
    }

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

    @Override
    public void onBindViewHolder(final ItemViewHolder holder, int position) {
        final Item item = items.get(position);
        holder.textView.setText(item.name);
        holder.textView.setBackgroundColor(position == selectedItemPosition
                ? Color.LTGRAY
                : Color.TRANSPARENT);
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                updateSelectedItem(holder.getAdapterPosition());
            }
        });
    }

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

    public void setItems(List<Item> items) {
        this.items.clear();
        this.items.addAll(items);
        notifyDataSetChanged();
    }

    public Item getSelectedItem() {
        if (selectedItemPosition == NO_POSITION) {
            return null;
        }
        return items.get(selectedItemPosition);
    }

    public void onSaveInstanceState(Bundle outState) {
        outState.putInt(SELECTED_ITEM_POSITION, selectedItemPosition);
    }

    private void updateSelectedItem(int newSelectedItemPosition) {
        if (selectedItemPosition != NO_POSITION) {
            notifyItemChanged(selectedItemPosition);
        }
        selectedItemPosition = newSelectedItemPosition;
        notifyItemChanged(newSelectedItemPosition);
    }

    public static class ItemViewHolder extends RecyclerView.ViewHolder {

        public final TextView textView;

        public ItemViewHolder(View itemView) {
            super(itemView);
            textView = (TextView) itemView.findViewById(R.id.text_view);
        }
    }
}
公共类SingleChoiceAdapter扩展了RecyclerView.Adapter{
私有静态最终int NO_位置=-1;
私有静态最终字符串SELECTED\u ITEM\u POSITION=“SELECTED\u ITEM\u POSITION”;
私人充气机;
私人最终清单项目;
private int selectedItemPosition=无位置;
公共SingleChoiceAdapter(上下文上下文,Bundle savedInstanceState){
充气器=充气器。从(上下文);
items=newarraylist();
如果(savedInstanceState!=null){
selectedItemPosition=savedInstanceState.getInt(所选项目位置,无位置);
}
}
@凌驾
public ItemViewHolder onCreateViewHolder(视图组父级,int-viewType){
最终视图=充气机充气(R.layout.item,父项,false);
返回新的ItemViewHolder(视图);
}
@凌驾
public void onBindViewHolder(最终ItemViewHolder,int位置){
最终项目=项目。获取(位置);
holder.textView.setText(item.name);
holder.textView.setBackgroundColor(位置==selectedItemPosition
?颜色为灰色
:颜色(透明);
holder.itemView.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
updateSelectedItem(holder.getAdapterPosition());
}
});
}
@凌驾
public int getItemCount(){
返回items.size();
}
公共无效集合项(列表项){
this.items.clear();
this.items.addAll(items);
notifyDataSetChanged();
}
公共项getSelectedItem(){
如果(选择编辑位置==无位置){
返回null;
}
返回项目。获取(选择编辑位置);
}
SaveInstanceState上的公共无效(束超出状态){
outState.putInt(所选项目位置,所选编辑位置);
}
私有void updateSelectedItem(int newSelectedItemPosition){
如果(选择编辑位置!=无位置){
notifyItemChanged(选择编辑位置);
}
selectedItemPosition=newSelectedItemPosition;
notifyItemChanged(newSelectedItemPosition);
}
公共静态类ItemViewHolder扩展了RecyclerView.ViewHolder{
公共最终文本视图文本视图;
公共项目视图持有者(查看项目视图){
超级(项目视图);
textView=(textView)itemView.findViewById(R.id.text\u视图);
}
}
}

将选中项目的
状态
存储在
SparseBooleanArray
中,位置为键。当您更改
按钮的
状态
时,更新其在
布尔数组
中的状态,并调用
notifyItemChanged(position)
。以及
BindviewHolder(ViewHolder ViewHolder,int position)
方法从
booleanArray
ViewHolder.radioButton.setChecked(boolean.get(position))加载状态
。了解一下基本想法

您甚至可以只使用一个整数变量,而不必维护数组,因为在android这样的设备中,空间是一个限制因素,所以维护数组的成本很高

因此,只需维护一个整数变量,比如intselectedPosition=-1。 在onBind中,如果位置==selectedPosition
,则检查按钮,如果为true,则取消选中按钮。 每当用户选中/取消选中按钮时,只需更新selectedPosition

像这样的,

if(selectedPosition==position)
   selectedPosition=-1
else{
   selectedPosition=position
   notifyItemChanged(selectedPosition);
}
notifyItemChanged(position);

请在
onBindViewHolder
中设置该职位的id,然后您也可以使用此方法处理操作。更新数据集并调用
notifyDataSetChanged

下面是我的示例代码

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    ItemObject itemObject = mDataset.get(position);
    ((ViewHolder)holder).mTextView.setText(itemObject.getTitle());
    Button mButton = ((ViewHolder) holder).mButton;


    mButton.setSelected(itemObject.isSelected());
    if(itemObject.isSelected()){

        ((ViewHolder)holder).mTextView.setText("OK");
    }
    mButton.setTag(position);
    mButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            updateDatset((Integer) v.getTag());
        }
    });
}
在updateDataset方法中,我更新此数据集的信息并调用
notifyDataSetChanged()


祝你好运

如果你不发代码,我们能帮你什么忙?