Режим выбора в RecyclerView?
Я пытаюсь понять, как добиться такого же эффекта
mListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
в реализации RecyclerView. Пожалуйста, помогите.
Ответы
Ответ 1
Нет встроенной поддержки структуры "режим выбора" с RecyclerView
. Ваши варианты - либо бросить их самостоятельно, либо использовать стороннюю библиотеку, которая его предлагает.
библиотека DynamicRecyclerView предлагает варианты выбора, но я не пробовал.
Это пример приложения демонстрирует его реализацию самостоятельно, в этом случае используя активированное состояние, чтобы указать, какой из них является текущим. Общий шаблон:
-
У вас RecyclerView.ViewHolder
обнаружение операции пользовательского интерфейса, которая указывает на выбор (щелкните по строке? щелкните по RadioButton
в строке? и т.д.).
-
Отслеживайте выбор на уровне вашего RecyclerView.Adapter
. В моем случае a ChoiceCapableAdapter
обрабатывает это в сочетании с классом SingleChoiceMode
, реализующим стратегию ChoiceMode
.
-
Когда выбор сделан, обновите вновь выбранную строку, чтобы отобразить выбор и обновить ранее выбранную строку, чтобы отразить, что она больше не выбрана. findViewHolderForPosition()
on RecyclerView
может помочь здесь - если вы отслеживаете position
последнего выбора, findViewHolderForPosition()
может предоставить вам ViewHolder
для этого выбора, поэтому вы можете "отменить его".
-
Отслеживайте выбор между изменениями конфигурации, помещая его в состояние сохраненного экземпляра активности или фрагмента, который управляет RecyclerView
.
Ответ 2
В режиме recycliewiew нет параметров для режима выбора. Мы должны добавить свою собственную логику как для одного выбора, так и для множественного выбора. Для Single Choice Recyclerview, я добавил свой источник в gitHub, просто взгляните на это.
Ответ 3
Вы можете следить за этим:
- Данные (имя строки, логическое значение выбрано)
- Адаптер с 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 и этот пост для множественный выбор и этот пост для одного выбора Счастливый код!!!
Ответ 4
Я создал библиотеку для такого режима выбора, применяемого к 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