RecyclerView中的选择模式?

我正试图弄清楚如何达到同样的效果

mListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

在RecyclerView实现中。 请帮忙。

Solutions Collecting From Web of "RecyclerView中的选择模式?"

使用RecyclerView的“选择模式”结构没有内置支持。 您可以选择自行滚动或使用提供它的第三方库。 DynamicRecyclerView库提供了选择模式,但我还没有尝试过。

此示例应用程序演示了如何自己实现它,在这种情况下使用激活状态来指示哪个是当前选择。 整体模式是:

  • 让您的RecyclerView.ViewHolder检测指示选择的UI操作(单击一行?单击行中的RadioButton等等)。

  • 跟踪RecyclerView.Adapter级别的选择。 在我的例子中, ChoiceCapableAdapter与实现ChoiceMode策略的SingleChoiceMode类一起处理。

  • 进行选择时,更新新选择的行以反映选择更新先前选择的行以反映不再选择它。 RecyclerView上的findViewHolderForPosition()可以在这里提供帮助 – 如果你跟踪最后一个选项的positionfindViewHolderForPosition()可以为你提供ViewHolder ,你可以“取消选择”它。

  • 通过将其置于管理RecyclerView的活动或片段的已保存实例状态,跟踪配置更改的选择。

在recyclerview中没有选择模式的选项。 我们必须为单选和多选添加我们自己的逻辑。 对于Single Choice Recyclerview ,我已将我的源添加到gitHub中 ,只需看一下即可。

我已经为这种应用于RecyclerView的选择模式创建了一个库,也许它可以帮助:

描述

创建此库是为了帮助将多项选择集成到RecyclerView中

履行

与Gradle的集成非常简单,您只需要jcenter存储库和库:

 repositories { jcenter() } ... dependencies { compile 'com.davidecirillo.multichoicerecyclerview:multichoicerecyclerview:1.0.1' } 

主要使用步骤

将MultiChoiceRecyclerView添加到xml文件中

  

Instanciate您对象并连接视图

 MultiChoiceRecyclerView mMultiChoiceRecyclerView = (MultiChoiceRecyclerView) findViewById(R.id.multiChoiceRecyclerView); 

将适配器扩展到MultiChoiceAdapter,并按照正常用法将其添加到RecyclerView

 public class MyAdapter extends MultiChoiceAdapter { public MyAdapter(ArrayList stringList, Context context) { this.mList = stringList; this.mContext = context; } ... } MyAdapter myAdapter = new MyAdapter(mList, getApplicationContext()); mMultiChoiceRecyclerView.setAdapter(myAdapter); 

有关更多信息和自定义: https : //github.com/dvdciri/MultiChoiceRecyclerView

你可以这样说:

– 数据(字符串名称,选择布尔值)

– 使用itemClickListener的适配器

– 活动或片段

– activity_main(recyclerView)

– list_item(TextView,CheckBox)

数据

 public class MultipleData { private String mTitle; private boolean mBoolean; public MultipleData(String title, boolean mBoolean) { this.mTitle = title; this.mBoolean = mBoolean; } public String getTitle() { return mTitle; } public void setTitle(String mTitle) { this.mTitle = mTitle; } public boolean isBoolean() { return mBoolean; } public void setBoolean(boolean mBoolean) { this.mBoolean = mBoolean; } } 

您的视图activity_main.xml(recyclerView)

    

和list_item.xml(TextView,CheckBox)

     

使用ClickListener的适配器

 public class MultipleRecyclerViewAdapter extends RecyclerView .Adapter { private List mList; private static MultipleClickListener sClickListener; MultipleRecyclerViewAdapter(List mList) { this.mList = mList; } static class DataObjectHolder extends RecyclerView.ViewHolder implements View .OnClickListener { TextView mTextView; RadioButton mRadioButton; DataObjectHolder(View itemView) { super(itemView); mTextView = (TextView) itemView.findViewById(R.id.multiple_list_item_text); mRadioButton = (RadioButton) itemView.findViewById(R.id.multiple_list_item_check_button); itemView.setOnClickListener(this); } @Override public void onClick(View v) { sClickListener.onItemClick(getAdapterPosition(), v); } } void changedData(int position) { if (mList.get(position).isBoolean()) { mList.get(position).setBoolean(false); } else { mList.get(position).setBoolean(true); } notifyDataSetChanged(); } void setOnItemClickListener(MultipleClickListener myClickListener) { this.sClickListener = myClickListener; } @Override public DataObjectHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()) .inflate(R.layout.multiple_list_item, parent, false); DataObjectHolder dataObjectHolder = new DataObjectHolder(view); return dataObjectHolder; } @Override public void onBindViewHolder(DataObjectHolder holder, int position) { holder.mTextView.setText(mList.get(position).getTitle()); holder.mRadioButton.setChecked(mList.get(position).isBoolean()); } @Override public int getItemCount() { return mList.size(); } interface MultipleClickListener { void onItemClick(int position, View v); } } 

活动或片段

 public class MultipleFragment extends Fragment implements MultipleRecyclerViewAdapter.MultipleClickListener{ MultipleRecyclerViewAdapter mAdapter; public MultipleFragment() { // Required empty public constructor } public static MultipleFragment newInstance() { return new MultipleFragment(); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment View view = inflater.inflate(R.layout.multiple_fragment, container, false); RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.multiple_fragment_recycler_view); MultipleData hendrix = new MultipleData("Jimi Hendrix", false); MultipleData bowie = new MultipleData("David Bowie", false); MultipleData morrison = new MultipleData("Jim Morrison", false); MultipleData presley = new MultipleData("Elvis Presley", false); MultipleData jagger = new MultipleData("Mick Jagger", false); MultipleData cobain = new MultipleData("Kurt Cobain", false); MultipleData dylan = new MultipleData("Bob Dylan", false); MultipleData lennon = new MultipleData("John Lennon", false); MultipleData mercury = new MultipleData("Freddie Mercury", false); MultipleData elton = new MultipleData("Elton John", false); MultipleData clapton = new MultipleData("Eric Clapton", false); List list = new ArrayList<>(); list.add(0, hendrix); list.add(1, bowie); list.add(2, morrison); list.add(3, presley); list.add(4, jagger); list.add(5, cobain); list.add(6, dylan); list.add(7, lennon); list.add(8, mercury); list.add(9, elton); list.add(10, clapton); mAdapter = new MultipleRecyclerViewAdapter(list); recyclerView.setAdapter(mAdapter); recyclerView.setHasFixedSize(true); RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity()); recyclerView.setLayoutManager(layoutManager); mAdapter.setOnItemClickListener(this); return view; } @Override public void onItemClick(int position, View v) { mAdapter.changedData(position); } } 

你可以在GitHub中看到这个例子, 这个post有多种选择 , 这个post可供单选快乐代码!!!