it-swarm.com.de

Auswahlmodus in einer RecyclerView?

Ich versuche herauszufinden, wie ich den gleichen Effekt erzielen kann

mListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

in einer RecyclerView-Implementierung. Bitte helfen Sie.

24
Spike Flail

Es gibt keine integrierte Unterstützung für eine "Auswahlmodus" -Struktur mit RecyclerView. Sie haben die Wahl, entweder selbst zu rollen oder eine Bibliothek eines Drittanbieters zu verwenden, die es anbietet. Die Bibliothek DynamicRecyclerView bietet Auswahlmodi, die ich jedoch nicht ausprobiert habe.

Diese Beispiel-App demonstriert, wie Sie sie selbst implementieren. Verwenden Sie in diesem Fall den aktivierten Status, um anzugeben, welche Option die aktuelle Wahl ist. Das allgemeine Muster ist:

  • Haben Sie RecyclerView.ViewHolder eine UI-Operation erkannt, die eine Auswahl anzeigt (klicken Sie auf eine Zeile? Klicken Sie auf ein RadioButton in der Zeile? Usw.).

  • Verfolgen Sie die Auswahl auf der Ebene Ihres RecyclerView.Adapter. In meinem Fall behandelt ein ChoiceCapableAdapter dies in Verbindung mit einer SingleChoiceMode-Klasse, die eine ChoiceMode-Strategie implementiert.

  • Wenn Sie eine Auswahl getroffen haben, aktualisieren Sie die neu ausgewählte Zeile entsprechend der Auswahl und aktualisieren Sie die zuvor ausgewählte Zeile so, dass sie nicht mehr ausgewählt wird. findViewHolderForPosition() auf RecyclerView kann hier helfen. Wenn Sie das position der letzten Auswahl verfolgen, kann findViewHolderForPosition() Ihnen das ViewHolder für diese Auswahl geben, sodass Sie es "abwählen" können.

  • Verfolgen Sie die Auswahl bei Konfigurationsänderungen, indem Sie sie in den Status der gespeicherten Instanz der Aktivität oder des Fragments setzen, die RecyclerView verwaltet.

28
CommonsWare

Es gibt keine Optionen für den Auswahlmodus in der Recyclingübersicht. Wir müssen unsere eigene Logik für Single Choice und Multi Choice hinzufügen. Für Single Choice Recyclerview habe ich meine Quelle in gitHub hinzugefügt, werfen Sie einfach einen Blick darauf.

4
Nanda Gopal

Ich habe eine Bibliothek für diese Art von Auswahlmodus erstellt, die auf RecyclerView angewendet wird. Vielleicht kann dies helfen:

Beschreibung

Diese Bibliothek wurde erstellt, um die Integration einer Auswahl aus mehreren Optionen in RecyclerView zu unterstützen

Implementierung

Die Integration mit Gradle ist sehr einfach, Sie benötigen lediglich das jcenter-Repository und die Bibliothek:

repositories {
    jcenter()
}
...

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

Hauptschritte für die Verwendung

Fügen Sie der XML-Datei das MultiChoiceRecyclerView hinzu

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

Instanziieren Sie Ihr Objekt und verbinden Sie die Ansicht

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

Erweitern Sie Ihren Adapter zum MultiChoiceAdapter und fügen Sie ihn wie gewohnt dem RecyclerView hinzu

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

Weitere Informationen und Anpassungen: https://github.com/dvdciri/MultiChoiceRecyclerView

1
dvdciri

Sie können dem folgen:

- Daten (Stringname, boolean ausgewählt)

- Adapter mit itemClickListener

- Aktivität oder Fragment

- activity_main (recyclerView)

- list_item (TextView, CheckBox) 

Daten

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

Ihre Ansichten 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>

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

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


}

Aktivität oder 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);
    }
}

Sie können dieses Beispiel in GitHub sehen und diesen Post für Multiple Choice und diesen Post für Single Choice Happy Code !!!

0
Cabezas