Режим выбора в RecyclerView?

Я пытаюсь понять, как добиться такого же эффекта

mListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

В реализации RecyclerView. Пожалуйста помоги.

Solutions Collecting From Web of "Режим выбора в RecyclerView?"

Нет встроенной поддержки структуры «режима выбора» с помощью RecyclerView . Ваши варианты – либо бросить их самостоятельно, либо использовать стороннюю библиотеку, которая его предлагает. Библиотека DynamicRecyclerView предлагает варианты выбора, но я не пробовал.

Это примерное приложение демонстрирует его реализацию самостоятельно, в этом случае используя активированное состояние, чтобы указать, какой из них является текущим. Общая картина:

  • Попросите RecyclerView.ViewHolder определить операцию пользовательского интерфейса, которая указывает на выбор (щелкните по строке? Нажмите на RadioButton в строке? И т. Д.).

  • Следите за выбором на уровне вашего RecyclerView.Adapter . В моем случае, ChoiceCapableAdapter обрабатывает это в сочетании с классом SingleChoiceMode который реализует стратегию ChoiceMode .

  • Когда выбор сделан, обновите вновь выбранную строку, чтобы отразить выбор и обновить ранее выбранную строку, чтобы отразить, что она больше не выбрана. findViewHolderForPosition() в RecyclerView может помочь здесь – если вы отслеживаете position последнего выбора, findViewHolderForPosition() может предоставить вам ViewHolder для этого выбора, чтобы вы могли « ViewHolder его».

  • Отслеживайте выбор между изменениями конфигурации, помещая его в состояние сохраненного экземпляра активности или фрагмента, который управляет RecyclerView .

В режиме recycliewiew нет вариантов выбора режима. Мы должны добавить свою собственную логику как для одного выбора, так и для множественного выбора. Для Single Choice Recyclerview я добавил свой источник в gitHub , просто взгляните на это.

Вы можете следить за этим:

– Данные (имя строки, логическое значение выбрано)

– Адаптер с 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)

 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.thedeveloperworldisyours.fullrecycleview.multiple.MultipleFragment"> <android.support.v7.widget.RecyclerView android:id="@+id/multiple_fragment_recycler_view" android:layout_width="match_parent" android:layout_height="match_parent" /> </FrameLayout> 

И list_item.xml (TextView, CheckBox)

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/multiple_list_item_text" android:layout_width="match_parent" android:layout_height="90dp" android:text="@string/app_name" android:typeface="monospace" android:layout_toLeftOf="@+id/multiple_list_item_check_button" android:gravity="center" android:textSize="@dimen/multiple_list_item_size_rock_stars"/> <RadioButton android:id="@+id/multiple_list_item_check_button" android:layout_width="wrap_content" android:layout_height="90dp" android:layout_alignParentRight="true" android:checked="false" android:clickable="false" android:focusable="false" /> </RelativeLayout> 

Адаптер с ClickListener

 public class MultipleRecyclerViewAdapter extends RecyclerView .Adapter<MultipleRecyclerViewAdapter .DataObjectHolder> { private List<MultipleData> mList; private static MultipleClickListener sClickListener; MultipleRecyclerViewAdapter(List<MultipleData> 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<MultipleData> 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 и этот пост для множественного выбора , и этот пост для одного выбора Happy code !!!

Я создал библиотеку для такого режима выбора, применяемого к RecyclerView, возможно, это может помочь:

Описание

Эта библиотека была создана, чтобы помочь интегрировать выбор из нескольких вариантов в RecyclerView

Реализация

Интеграция с Gradle очень проста, вам просто нужен репозиторий jcenter и библиотека:

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

Основные этапы использования

Добавьте MultiChoiceRecyclerView в свой XML-файл

 <com.davidecirillo.multichoicesample.MultiChoiceRecyclerView android:id="@+id/multiChoiceRecyclerView" android:layout_width="match_parent" android:layout_height="match_parent" /> 

Превратите объект в объект и подключите его

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

Расширьте свой адаптер в MultiChoiceAdapter и добавьте его в RecyclerView в соответствии с обычным использованием

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

Для получения дополнительной информации и настроек: https://github.com/dvdciri/MultiChoiceRecyclerView