it-swarm.com.ru

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

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

mListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

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

24
Spike Flail

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

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

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

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

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

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

28
CommonsWare

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

4
Nanda Gopal

Я создал библиотеку для этого режима выбора, примененного к 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" />

Instanciate вы возражаете и соединяете представление

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

1
dvdciri

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

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

- Адаптер с 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 и этот пост для множественного выбора , и этот пост для одиночного выбора Счастливый код !!!

0
Cabezas