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