Geri dönüştürücüye programlı olarak bakmak için yeni bir öğe eklensin mi?


115

Hala geri dönüşümlü görüşe girmeye çalışıyorum. Bir geri dönüşümcü görünümünü başlatmak için kullandığım bir dizi listem var.

Bir adaptör ve yerleşim yöneticisi ayarlayarak geri dönüşümcü görünüm postasına nasıl yeni öğeler ekleyebilirim?

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

Yani temelde benden sonra initdata()ve initRecyclerView()RecyclerView'e nasıl yeni bir öğe ekleyebilirim?


Görebilirsiniz Github içinde bu örneği Mutlu kodu !!!
Cabezas

Yanıtlar:


272

Önce öğenizi ekleyin mItemsve ardından kullanın:

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

bu yöntem kullanmaktan daha iyidir:

mAdapter.notifyDataSetChanged();

performans.


11
İyi cevap. Bu aynı zamanda animasyonları
Ben Pearson

7
Bu doğru cevap olarak kabul edilmelidir, diğeri animasyonları bozar ve bundan daha az etkilidir.
Massimo

27
Kabul edilen cevaba cevap veren benim ve bunun kabul edilmesi gerektiğini düşünüyorum: D
Abdelrahman Elkady

2
@AJW evet. mItems'in son elemanının indeksi mItems.size () - 1'dir.
Mostafa

2
Teşekkürler! OnBindViewHolder'da internetten yüklenmesi gereken resimlerim var. Her veri aldığımda, listeye eklemem gerekiyor ve notifyDataSetChanged () adını almam gerekiyor. Ancak bu, görüntü titreyen bir etki yarattı. Yukarıdakiler aradığım doğru çözümdü. Ayrıca mAdapter.notifyItemRangeInserted (mItems.size () - 1, new_array_of_items_to_be_added.size ());
Vignesh Bala

38

basitçe veri yapınıza (mItems) ekleyin ve ardından adaptörünüze veri kümesi değişikliği hakkında bilgi verin

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

addItem("New Item");

2
Ya eklemek istediğim bir dize değil de bir ViewGroup ise?
IgorGanapolsky

1
@IgorGanapolsky Ben de aynı şüphem var. Bunun için herhangi bir çözüm buldunuz mu?
Sash_KP

burada da aynı şüphe! herhangi bir yardım?
Srujan Barai

5
@IgorGanapolsky Öğe türü Bağdaştırıcınız tarafından belirlenir, bu nedenle gerçekten herhangi bir nesne olabilir. Ancak eklediğiniz öğenin yalnızca veri olması gerektiğini unutmayın. RecyclerView, bir görünümü şişirmek ve bağlamak için yerleşik işlevlere sahiptir; bu ,DataSetChanged () 'e bildirdiğinizde ne olur. Düzenlenen görünümü görmek için onBindViewHolder'da hata ayıklayabilirsiniz.
Chris

1
@IgorGanapolsky ArrayList<T>Eklemek istediğiniz nesne türünü, örneğin ArrayList<ViewGroup>yerine kullanmanız gerekir ArrayList<String>. Ardından, bağımsız değişken türünü olarak olarak Stringdeğiştirebilirsiniz ViewGroup. (Necro için özür dilerim).
Eric Reed

14

Listeye birden çok öğe ekliyorsanız şunu kullanın:

mAdapter.notifyItemRangeInserted(startPosition, itemcount);

Bu, kayıtlı herhangi bir gözlemciye positionStart'tan başlayan geçerli itemCount öğelerinin yeni eklendiğini bildirir. Önceden positionStart ve ötesinde bulunan öğe, artık positinStart + itemCount konumundan başlayarak bulunabilir.

veri kümesindeki mevcut öğe hala güncel olarak kabul edilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.