我需要显示具有单一选项项目的recyclelerview。但Recyclerview没有选择模式。
有人知道如何解决这个问题吗?
提前致谢。
答案 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
这是我的示例代码
@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()