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.
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
.
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.
J'ai créé une bibliothèque pour ce type de mode de choix appliqué à RecyclerView, cela peut peut-être aider:
Cette bibliothèque a été créée pour faciliter l’intégration d’une sélection à choix multiples au logiciel RecyclerView.
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'
}
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
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 !!!