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

时间:2016-02-08 14:08:58

标签: android android-recyclerview

我需要显示具有单一选项项目的recyclelerview。但Recyclerview没有选择模式。

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

提前致谢。

5 个答案:

答案 0 :(得分:2)

states的已检查项目存储在SparseBooleanArray中,并将该位置作为键。当您更改state的{​​{1}}时,请更新它button中的状态并调用booleanArray。并在notifyItemChanged(position)方法中加载来自BindviewHolder(ViewHolder viewholder,int position)的状态,例如booleanArray。请查看this基本想法

答案 1 :(得分:1)

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

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);
        }
    }
}

答案 2 :(得分:0)

显示已经检查 -

您可以维护列表大小的布尔数组。在绑定视图上处理布尔(true / false)逻辑,就像设置单选按钮的检查true / false一样。

处理新点击次数 -

然后在单选按钮的onclick上,将每个数组元素的值设置为false,然后将当前数组位置设置为true。现在请致电notifyDatatSetChanged()

答案 3 :(得分:0)

你甚至可以只使用一个整数变量而不是维护一个数组,这在像android这样的设备中是很昂贵的,其中空间是一个约束。

所以,只需维护一个整数变量,最初可以说int selectedPosition = -1 。 在onBind中检查位置== selectedPosition ,如果为true则选中其他按钮取消选中。 每当用户选中/取消选中该按钮时,只需更新 selectedPosition

即可

像这样,

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

答案 4 :(得分:0)

请在onBindViewHolder中设置位置的ID,然后您也可以在此方法中处理操作。更新数据集并致电notifyDataSetChanged

The result as below

这是我的示例代码

@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()

祝你好运