web-dev-qa-db-fra.com

Mode Choix dans un RecyclerView?

J'essaie de comprendre comment obtenir le même effet de

mListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

dans une implémentation RecyclerView. S'il vous plaît aider.

24
Spike Flail

Il n'y a pas de support intégré pour une structure en "mode de choix" avec RecyclerView. Vous avez le choix entre le lancer vous-même ou l’utilisation d’une bibliothèque tierce qui le propose. La Bibliothèque DynamicRecyclerView offre des modes de choix, mais je ne l’ai pas essayé.

Cet exemple d'application montre comment l'implémenter vous-même, en utilisant l'état activé pour indiquer quel est le choix actuel. Le schéma général est le suivant:

  • Demandez à votre RecyclerView.ViewHolder de détecter une opération d’interface utilisateur indiquant un choix (cliquez sur une ligne? Cliquez sur une RadioButton dans la ligne? Etc.).

  • Gardez une trace de la sélection au niveau de votre RecyclerView.Adapter. Dans mon cas, une ChoiceCapableAdapter gère cela, conjointement avec une classe SingleChoiceMode qui implémente une stratégie ChoiceMode.

  • Lorsqu'un choix est fait, mettez à jour la nouvelle ligne choisie pour refléter le choix et mettez à jour la ligne précédemment choisie pour indiquer qu'elle n'est plus choisie. findViewHolderForPosition() sur RecyclerView peut aider ici - si vous suivez la position du dernier choix, findViewHolderForPosition() peut vous donner la ViewHolder pour ce choix, afin que vous puissiez le "désélectionner".

  • Gardez une trace du choix parmi les modifications de configuration, en le mettant dans l'état d'instance sauvegardé de l'activité ou du fragment qui gère la variable RecyclerView.

28
CommonsWare

Il n'y a pas d'options pour le mode choix dans recyclerview. Nous devons ajouter notre propre logique pour le choix unique et le choix multiple. Pour Single Choice Recyclerview , j'ai ajouté ma source dans gitHub , jetez simplement un coup d'œil à cela.

4
Nanda Gopal

J'ai créé une bibliothèque pour ce type de mode de choix appliqué à RecyclerView, cela peut peut-être aider:

La description

Cette bibliothèque a été créée pour faciliter l’intégration d’une sélection à choix multiples au logiciel RecyclerView.

La mise en oeuvre

L'intégration avec Gradle est très simple, il vous suffit du référentiel jcenter et de la bibliothèque:

repositories {
    jcenter()
}
...

dependencies {
    compile 'com.davidecirillo.multichoicerecyclerview:multichoicerecyclerview:1.0.1'
}

Principales étapes d'utilisation

Ajouter le MultiChoiceRecyclerView à votre fichier XML

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

Instanciez votre objet et connectez la vue

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

Étendez votre adaptateur à MultiChoiceAdapter et ajoutez-le à RecyclerView comme à l’usage normal

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);

Pour plus d'informations et de personnalisations: https://github.com/dvdciri/MultiChoiceRecyclerView

1
dvdciri

Vous pouvez suivre ceci:

- Data (nom de la chaîne, booléen sélectionné)

- Adaptateur avec itemClickListener

- Activité ou fragment

- activity_main (recyclerView)

- list_item (TextView, CheckBox) 

Les données

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;
    }
}

Vos vues 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>

et 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>

Adaptateur avec 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);
    }


}

Activité ou fragment

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);
    }
}

Vous pouvez voir cet exemple dans GitHub et ce message à choix multiples , et ce message à choix unique Code Happy !!!

0
Cabezas