wake-up-neo.com

Wie implementiere ich Multi-Select in RecyclerView?

This is implemented using ListView

ListView hatte einen Multiple-Choice-Modus. Was sollte ich verwenden, um dasselbe mit RecyclerView zu implementieren? Wie gehe ich mit onItemCheckedStateChanged um? Ich überprüfte dies , aber ich konnte nicht viel daraus machen. Ein Code-Snippet oder ein Beispielprojekt, das dasselbe implementiert, wäre großartig. Danke im Voraus.

49
Hegdekar

Ich weiß, dass es etwas spät ist, diese Frage zu beantworten. Und ich weiß nicht, ob es den Anforderungen des OP entspricht oder nicht. Aber das kann jemandem helfen. Ich habe diesen Multi-Select-RectyclerView mit einem einfachen Trick implementiert. Hier ist mein Code.

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:background="#EEE">

   <Android.support.v7.widget.RecyclerView
       Android:id="@+id/recycler_view"
       Android:layout_width="match_parent"
       Android:layout_height="match_parent" />

</RelativeLayout>

item_row.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:layout_marginBottom="1dp"
    Android:background="#FFF"
    Android:clickable="true" 
    Android:orientation="vertical">

   <TextView
      Android:id="@+id/text_view"
      Android:layout_width="match_parent"
      Android:layout_height="wrap_content"
      Android:padding="10dp"
      tools:text="TextView" />

</LinearLayout>

In item_row.xml Ist Android:clickable="true" Wichtig.

MainActivity.Java

public class MainActivity extends AppCompatActivity {

    private List<Model> mModelList;
    private RecyclerView mRecyclerView;
    private RecyclerView.Adapter mAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
        mAdapter = new RecyclerViewAdapter(getListData());
        LinearLayoutManager manager = new LinearLayoutManager(MainActivity.this);
        mRecyclerView.setHasFixedSize(true);
        mRecyclerView.setLayoutManager(manager);
        mRecyclerView.setAdapter(mAdapter);
    }

    private List<Model> getListData() {
      mModelList = new ArrayList<>();
      for (int i = 1; i <= 25; i++) {
          mModelList.add(new Model("TextView " + i));
      }
     return mModelList;
    }
}

Model.Java

public class Model {

    private String text;
    private boolean isSelected = false;

    public Model(String text) {
      this.text = text;
    }

    public String getText() {
      return text;
    }

    public void setSelected(boolean selected) {
      isSelected = selected;
    }


    public boolean isSelected() {
      return isSelected;
    }
}

RecyclerViewAdapter.Java

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.MyViewHolder> {

    private List<Model> mModelList;

    public RecyclerViewAdapter(List<Model> modelList) {
      mModelList = modelList;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
       View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_row, parent, false);
       return new MyViewHolder(view);
    }

    @Override
    public void onBindViewHolder(final MyViewHolder holder, int position) {
        final Model model = mModelList.get(position);
        holder.textView.setText(model.getText());
        holder.view.setBackgroundColor(model.isSelected() ? Color.CYAN : Color.WHITE);
        holder.textView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                model.setSelected(!model.isSelected());
                holder.view.setBackgroundColor(model.isSelected() ? Color.CYAN : Color.WHITE);
            }
        });
    }

    @Override
    public int getItemCount() {
        return mModelList == null ? 0 : mModelList.size();
    }

    public class MyViewHolder extends RecyclerView.ViewHolder {

        private View view;
        private TextView textView;

        private MyViewHolder(View itemView) {
            super(itemView);
            view = itemView;
            textView = (TextView) itemView.findViewById(R.id.text_view);
        }
    }
}

Wie funktioniert es? Die Methode onBindViewHolder() bindet die Daten aus ArrayList an View-Objekte. Wenn also die Daten rechtzeitig an die Ansicht gebunden werden, erhält sie das einzelne Objekt aus ArrayList, das Model model = mModelList.get(position); mit der aktuellen Position ist. Jetzt müssen wir prüfen, ob das bestimmte Objekt ausgewählt ist oder nicht. So was,

model.isSelected()

dies gibt entweder true oder false zurück. Wenn dieses Objekt bereits ausgewählt ist, müssen wir die Hintergrundfarbe von row_item Ändern. Hier ist der Code

holder.view.setBackgroundColor(model.isSelected() ? Color.CYAN : Color.WHITE);

Wenn es ausgewählt ist, ändern Sie die Hintergrundfarbe in cyan else white.

Zur Auswahl müssen wir die Methode setOnClickListener() verwenden. (Hier verwende ich nur ein TextView. Ich führe also ein Klickereignis für TextView durch.) Hier bedeutet holder.view Die gesamte einzelne item_row. Klicken Sie auf, um die Booleschen Werte auf true oder false umzuschalten.

 holder.textView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            model.setSelected(!model.isSelected());
            holder.view.setBackgroundColor(model.isSelected() ? Color.CYAN : Color.WHITE);
        }
 });

In Ihrer Aktivität oder Ihrem Fragment, das RecyclerView hostet, können Sie die ausgewählten Objekte/Elemente wie dieses abrufen

String text = "";
 for (Model model : mModelList) {
   if (model.isSelected()) {
     text += model.getText();
   }
 }
Log.d("TAG","Output : " + text);

Hier ist die Ausgabe

output

Bearbeiten 1: Benutzer auf die Auswahl nur eines Elements beschränken.

 private int lastSelectedPosition = -1;  // declare this variable
 ...
 // your code
 ...


 @Override
public void onBindViewHolder(final MyViewHolder holder, int position) {
    final Model model = mModelList.get(position);
    holder.textView.setText(model.getText());
    holder.view.setBackgroundColor(model.isSelected() ? Color.CYAN : Color.WHITE);
    holder.textView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            // check whether you selected an item

            if(lastSelectedPosition > 0) {
                mModelList.get(lastSelectedPosition).setSelected(false);
            }

            model.setSelected(!model.isSelected());
            holder.view.setBackgroundColor(model.isSelected() ? Color.CYAN : Color.WHITE);

            // store last selected item position 

            lastSelectedPosition = holder.getAdapterPosition();  
        }
    });
}

Ich hoffe es wird hilfreich sein.

90
Shashanth

Die Erstellung der oben genannten benutzerdefinierten Multi-Select-Implementierung funktioniert ordnungsgemäß, kann jedoch bei großen Datenmengen zu Leistungsproblemen führen. Ich würde wärmstens empfehlen, den Abschnitt "Erstellen einer Recycling-Ansicht - Aktivieren der Auswahl von Listenelementen" in der Dokumentation von Google zu lesen. Ich habe den Link Android-Dokumentation zum Erstellen von Recycling-Ansicht und Aktivierungselement aufgelistet. Klicken Sie auf .

6
public class RecyclerColorAdapter extends RecyclerView.Adapter<RecyclerColorAdapter.ViewHolder> {


        private final Activity activity;
        private final ArrayList<ColorItem> itemArrayList;


        public RecyclerColorAdapter(Activity activity, ArrayList<ColorItem> itemArrayList) {
            super();
            this.activity = activity;
            this.itemArrayList = itemArrayList;
        }


        @Override
        public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
            View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_color_recycleview, viewGroup, false);
            return new ViewHolder(v);
        }

        @Override
        public void onBindViewHolder(final ViewHolder holder, final int i) {
            holder.setIsRecyclable(true);

            final ColorItem colorItem = itemArrayList.get(i);


            holder.button_color.setText(colorItem.getColorName());

            holder.button_color.setBackgroundColor(colorItem.isSelected() ? Color.CYAN : Color.WHITE);

            holder.button_color.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    colorItem.setSelected(!colorItem.isSelected());
                    holder.button_color.setBackgroundColor(colorItem.isSelected() ? Color.CYAN : Color.WHITE);
                    if (colorItem.isSelected()){
                        arrayListColor.add("diamond_color[]="+colorItem.getValue()+"&");
                        Log.e("arrayListColor","---------"+arrayListColor);
                    }
                    else {
                        arrayListColor.remove("diamond_color[]="+colorItem.getValue()+"&");
                        Log.e("arrayListColor","---------"+arrayListColor);
                    }


                }
            });

        }

        @Override
        public int getItemCount() {

            return itemArrayList.size();
        }

        public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

            private Button button_color;

            public ViewHolder(View itemView) {
                super(itemView);
                itemView.setOnClickListener(this);
                button_color = (Button) itemView.findViewById(R.id.button_color);

            }

            @Override
            public void onClick(View v) {

            }

        }

    }
2
Pradip

Ohne die Erstellung einer Modellklasse können wir mehrere Elemente in der Recyclingübersicht auswählen. Verwenden Sie diesen Code in recyclerview adapter

holder.favplayIcon.setOnClickListener(View.OnClickListener {
                    if (!row_index.contains(position)) {
                        row_index.add(position)
                        holder.favplayIcon.setImageDrawable(
                            ResourcesCompat.getDrawable(resources, R.drawable.ic_starfilled, null ))

                    } else {
                        row_index.removeAt(row_index.indexOf(position))
                        holder.favplayIcon.setImageDrawable(
                   ResourcesCompat.getDrawable(resources,R.drawable.ic_starborder, null)
                        )  }
                })

///// put below code out of onclicklistener method of item
                if (!row_index.contains(position)) {

                    holder.favplayIcon.setImageDrawable(
                        ResourcesCompat.getDrawable(
                            resources,
                            R.drawable.ic_starborder,
                            null
                        )
                    )
} else {
                    holder.favplayIcon.setImageDrawable(
                        ResourcesCompat.getDrawable(
                            resources,
                            R.drawable.ic_starfilled,
                            null
                        )
                    )
1
civani mahida

Einfacher und kurzer Weg:

  holder.parentLayout.setOnClickListener {

        if (holder.categoryIcon.isSelected) {
            selectedPos = position
        }

        if (selectedPos == position) {
            notifyItemChanged(selectedPos)
            selectedPos = RecyclerView.NO_POSITION
        } else {
            selectedPos = position
            notifyItemChanged(selectedPos)
        }
    }


    if (selectedPos == position) {
        holder.categoryIcon.setBackgroundColor(ContextCompat.getColor(context, R.color.orange))
        holder.categoryIcon.isSelected = true
    } else {
        holder.categoryIcon.setBackgroundColor(ContextCompat.getColor(context, R.color.white))
        holder.categoryIcon.isSelected = false
    }
0
Aleesha Kanwal