RecyclerView中的选择模式?

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

mListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

在RecyclerView实现中。 请帮忙。

  • 另一个getView被多次调用
  • 列表项与CheckBox不可点击
  • 如何删除添加了addTextChangedListener的所有监听器
  • 如何在Android中使用多个列表视图构build复杂的布局
  • android滚动,而拖放
  • 如何为ListView中的每一行设置不同的高度?
  • 显示空白列表项目的ListView中的ViewPagers
  • Android Espresso ListView点击项目
  • 使用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可供单选快乐代码!!!