プログラムでrecyclerviewに新しいアイテムを追加しますか?


113

私はまだrecyclerviewに頭を悩ませています。arraylistがあります。これを使用して、リサイクラービューを初期化します。

アダプターとレイアウトマネージャーを設定して新しいアイテムをリサイクラービューポストに追加するにはどうすればよいですか?

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

基本的に私initdata()との後で initRecyclerView()、RecyclerViewに新しいアイテムを追加するにはどうすればよいですか?


この例はGithub Happyコード見ることができます!!!
Cabezas 2017

回答:


270

最初にアイテムを追加してからmItems使用します。

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

この方法は、以下を使用するよりも優れています。

mAdapter.notifyDataSetChanged();

パフォーマンスで。


10
いい答えだ。また、アニメーションが壊れないことも意味します
ベンピアソン

7
これは正解として受け入れられるべきであり、もう1つはアニメーションを壊し、これよりも効率的ではありません。
Massimo

26
私は受け入れられた答えに答えた人であり、これは受け入れられたものであると思います:D
アブデルラーマンエルカディ

2
@AJWはい。mItemsの最後の要素のインデックスはmItems.size()-1です。
モスタファ2016年

2
ありがとう!インターネットからonBindViewHolderにロードする必要がある画像があります。データを受信するたびに、リストに追加してnotifyDataSetChanged()を呼び出す必要があります。しかし、これは画像のちらつき効果を作りました。上記は私が探していた正しい解決策でした。mAdapter.notifyItemRangeInserted(mItems.size()-1、new_array_of_items_to_be_added.size());を使用することもできます。
Vignesh Bala

37

単純にデータ構造(mItems)に追加してから、データセットの変更についてアダプターに通知します

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

addItem("New Item");

2
追加したい文字列ではなく、ViewGroupの場合はどうなりますか?
IgorGanapolsky

1
@IgorGanapolsky私も同じ疑問があります。そのための解決策を見つけましたか?
Sash_KP 2015年

ここでも同じ疑問です!何か助け?
Srujan Barai 2015

5
@IgorGanapolskyアイテムタイプはアダプタによって指定されるため、実際にはどのオブジェクトでもかまいません。ただし、追加するアイテムはデータであることに注意してください。RecyclerViewには、ビューをインフレートおよびバインドするための組み込み関数があります。これは、notifyDataSetChanged()を実行したときに発生します。onBindViewHolderをデバッグして、編集中のビューを確認できます。
Chris

1
@IgorGanapolsky ArrayList<T>たとえば、ArrayList<ViewGroup>ではなく、追加したいオブジェクトのタイプを使用する必要がありますArrayList<String>。その後、引数の型をからStringに変更できますViewGroup。(ネクロで申し訳ありません)。
エリックリード

14

リストに複数のアイテムを追加する場合は、次のようにします。

mAdapter.notifyItemRangeInserted(startPosition, itemcount);

これにより、positionStartで始まる現在反映されているitemCountアイテムが新しく挿入されたことが、登録されたオブザーバーに通知されます。以前はpositionStart以降に配置されていたアイテムが、位置positinStart + itemCountから始まるようになりました。

データセット内の既存のアイテムはまだ最新と見なされています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.