Ein neues Element zur programmgesteuerten Wiederverwertung hinzufügen?

113

Ich versuche immer noch, mich mit Recyclerview zu beschäftigen. Ich habe eine Arrayliste, mit der ich eine Recycler-Ansicht initialisiere.

Wie kann ich dem Beitrag der Recycler-Ansicht neue Elemente hinzufügen und einen Adapter und einen Layoutmanager festlegen?

private void initData() {
        mItems = new ArrayList<String>();
        for (int i = 0; i < ITEMS_COUNT; i++) {
            mItems.add("Item " + (i + 1));
        }
    }

    private void initRecyclerView() {
        mRecentRecyclerView = (RecyclerView) findViewById(R.id.recentrecyclerView);
        mRecentRecyclerView.setHasFixedSize(true);
        mRecentLayoutManager = new LinearLayoutManager(this);
        mRecentRecyclerView.setLayoutManager(mRecentLayoutManager);



        mAdapter = new RecyclerView.Adapter<CustomViewHolder>() {
            @Override
            public CustomViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
                View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.notice_snippet
                        , viewGroup, false);
                return new CustomViewHolder(view);
            }

            @Override
            public void onBindViewHolder(CustomViewHolder viewHolder, int i) {
                viewHolder.noticeSubject.setText(mItems.get(i));
            }

            @Override
            public int getItemCount() {
                return mItems.size();
            }

        };
        mRecentRecyclerView.setAdapter(mAdapter);

    private class CustomViewHolder extends RecyclerView.ViewHolder {

        private TextView noticeSubject;

        public CustomViewHolder(View itemView) {
            super(itemView);

            noticeSubject = (TextView) itemView.findViewById(R.id.notice_subject);
        }
    }

Also im Grunde, nachdem ich initdata()und initRecyclerView(), wie füge ich ein neues Element zum RecyclerView hinzu?

Shubham Kanodia
quelle
Sie können dieses Beispiel in Github Happy Code sehen !!!
Cabezas

Antworten:

270

Fügen Sie zuerst Ihren Artikel hinzu mItemsund verwenden Sie dann:

mAdapter.notifyItemInserted(mItems.size() - 1);

Diese Methode ist besser als:

mAdapter.notifyDataSetChanged();

in der Leistung.

Mostafa
quelle
10
Gute Antwort. Es bedeutet auch, dass es keine Animationen unterbricht
Ben Pearson
7
Dies sollte als richtige Antwort akzeptiert werden, die andere unterbricht Animationen und ist weniger effizient als diese.
Massimo
26
Ich bin derjenige, der die akzeptierte Antwort beantwortet hat und ich denke, dies sollte die akzeptierte sein: D
Abdelrahman Elkady
2
@ Ajw ja. Der Index des letzten Elements von mItems ist mItems.size () - 1.
Mostafa
2
Vielen Dank! Ich habe Bilder, die aus dem Internet in onBindViewHolder geladen werden sollen. Jedes Mal, wenn ich Daten erhalte, muss ich an die Liste anhängen und notifyDataSetChanged () aufrufen. Dies führte jedoch zu einem flackernden Bildeffekt. Oben war die richtige Lösung, nach der ich gesucht habe. Sie können auch mAdapter.notifyItemRangeInserted (mItems.size () - 1, new_array_of_items_to_be_added.size ()) verwenden.
Vignesh Bala
37

Fügen Sie einfach Ihre Datenstruktur (mItems) hinzu und benachrichtigen Sie dann Ihren Adapter über die Änderung des Datensatzes

private void addItem(String item) {
  mItems.add(item);
  mAdapter.notifyDataSetChanged();
}

addItem("New Item");
Abdelrahman Elkady
quelle
2
Was ist, wenn es sich nicht um eine Zeichenfolge handelt, die ich hinzufügen möchte, sondern um eine ViewGroup?
IgorGanapolsky
1
@IgorGanapolsky Ich habe auch den gleichen Zweifel. Haben Sie eine Lösung dafür gefunden?
Sash_KP
der gleiche Zweifel auch hier! irgendeine Hilfe?
Srujan Barai
5
@IgorGanapolsky Der Elementtyp wird von Ihrem Adapter angegeben, sodass es sich wirklich um ein beliebiges Objekt handeln kann. Denken Sie jedoch daran, dass das Element, das Sie hinzufügen, nur die Daten sein sollen. Die RecyclerView verfügt über integrierte Funktionen zum Aufblasen und Binden einer Ansicht. Dies geschieht, wenn SieDataSetChanged () benachrichtigen. Sie können den onBindViewHolder debuggen, um zu sehen, wie die Ansicht bearbeitet wird.
Chris
1
@IgorGanapolsky Sie ArrayList<T>müssten den Objekttyp verwenden, den Sie hinzufügen möchten, z . B. ArrayList<ViewGroup>anstelle von ArrayList<String>. Dann können Sie einfach den Argumenttyp von Stringbis ändern ViewGroup. (Entschuldigung für Nekro).
Eric Reed
14

Wenn Sie der Liste mehrere Elemente hinzufügen, verwenden Sie Folgendes:

mAdapter.notifyItemRangeInserted(startPosition, itemcount);

Dadurch werden registrierte Beobachter darüber informiert, dass die aktuell angezeigten itemCount-Elemente ab positionStart neu eingefügt wurden. Das Element, das sich zuvor bei positionStart und darüber hinaus befand, kann jetzt ab Position positinStart + itemCount gefunden werden

vorhandenes Element im Datensatz wird immer noch als aktuell betrachtet.

Nitin Anand
quelle