2015-01-08 14 views
61

私はまだrecyclerviewの周りに頭を上げようとしています。 私はリサイラビューを初期化するために使用するarraylistを持っています。プログラムでrecyclerviewに新しい項目を追加しますか?

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

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に新しい項目を追加する??

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

addItem("New Item"); 
+0

あなたは[Githubの中に、この例](https://github.com/CabezasGonzalezJavier/FullRecycleView/tree/master/app/src/main/java/com/thedeveloperworldisyours/fullrecycleview/を見ることができます垂直)ハッピーコード!!! – Cabezas

答えて

176

+9

良い答え。また、アニメーションを壊さないことを意味します。 –

+7

これは正しい答えとして受け入れられるべきです。もう1つはアニメーションを壊し、これよりも効率が悪いです。 – Massimo

+20

私は受け入れられた答えに答えた人であり、これが受け入れられるべきだと私は思っています:D –

25

は、単にあなたのデータ構造(mItems)に追加して、あなたのアダプタは、データセットの変更についての通知まずmItemsにあなたの項目を追加して使用します。

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

よりも優れているよりも、次のものを使用します。

mAdapter.notifyDataSetChanged(); 

パフォーマンスで。

+2

文字列ではなく、ViewGroupを追加したいのですが? –

+1

@IgorGanapolsky私も同じ疑いがあります。あなたはそれについて何か解決策を見つけましたか? –

+0

同じ疑問もここに!どんな助け? –

6

リストの使用これに複数の項目を追加する場合:

mAdapter.notifyItemRangeInserted(startPosition, itemcount); 

これはpositionStartから始まる現在の反射ITEMCOUNT個のアイテムが新たに挿入されたことを、登録されているすべてのオブザーバーに通知します。以前にpositionStart以降にあったアイテムは、positinStart + itemCount

の既存アイテムがまだ最新のものとみなされるようになりました。

-2

this.runOnUiThread(new Runnable() { 
    public void run() { 
     mAdapter.notifyDataChanged() 
    } 
}); 
関連する問題