2017-07-14 6 views
1

私はRecyclerViewを持っていて、RecyclerViewをスキップさせるためにアダプタにif statementが必要で、ViewModelの1つのフィールドが空の場合はアイテムを作成しません。たとえば、タイトルとピクチャのあるViewModelがあるので、タイトルが空の場合はそのアイテムを作成しないでください。だから、:android - RecyclerView - アイテムを作成しない(スキップする)

if (TextUtils.isEmpty(viewModel.getMessages().getTitle())) { 
//do something? 
} 

これは十分に簡単なはずですが、私はちょうどあなたが項目がある場合には項目自体の作成を入れ

list.remove(position) 
adapter.notifyItemRemoved(position) 
+2

アダプタで追加する前にアイテムを削除する方がいいです... forループでそのアイテムを削除してください...そうでなければ、アダプタでアイテムサイズを処理する必要があります。アップデートアイテムサイズでアダプタから削除して通知できますthat addpad –

答えて

3

  1. まず、あなたは)(onBindViewHolderに渡されViewHolderインスタンスを単に非表示にすることができます。 RecyclerViewは、データをUIとどのようにバインドするか気にしません。あなたのUIをonBindViewHolder()で更新してください。

    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 
        if (TextUtils.isEmpty(viewModel.getTitle())) { 
         holder.itemView.setVisibility(View.GONE); 
        } 
    } 
    
  2. あなたRecyclerView.Adapterクラスに渡す前に、事前にあなたのデータをフィルタリングします。これは、 "データソース"コードと "UI"コードを混在させたくない場合に推奨される方法です。あなたのRecyclerView.Adapterは、UIにデータを入力することだけに注意する必要があります。 RxJavaを使用する場合は、1行のコードでこれを実現できます。それはあなたのコードたくさんのクリーナーを作るcosを

    getYourListObservable() 
        .filter(new Predicate<ViewModel>() { 
          @Override 
          public boolean test(@NonNull ViewModel viewModel) throws Exception { 
           return !TextUtils.isEmpty(viewHolder); 
          } 
         }) 
        .subscribe(...) // this is where you pass data to your RecyclerView.Adapter object 
    

は、私は2番目のアプローチをお勧めします。

PS:これは私が最終的に私は必要なものを得たいくつかのミスの後に、レトロlamdbaコード

getYourListObservable() 
    .filter(viewModel -> !TextUtils.isEmpty(viewModel.getTitle)) 
    .subscribe(...) // where you pass data to RecyclerView.Adapter object 
+0

素晴らしいです、2番目のソリューションは完璧です!ありがとう! :) – Den

1

を練習し始めましたステートメント。

例: - これを近づいてのいくつかの方法があり

if ((viewModel.get(position).getTitle()) != null) { 

    holder.textView.setText(viewModel.get(position).getTitle()); 

} 
0

を使う削除する必要がある場合RecyclerView :)

+0

さて、私のgetItemCount()メソッドをどうすればいいですか?戻り値1 + mIssueVM.getMessages()。size();を返しません。ヘッダー項目のためです。 – Den

+0

その中の1つのアイテムが空であれば、影響を受けるべきではありません。 – sHOLE

0

まあです!

for (IssueViewResponse.MessageItem message : response.getMessages()) { 
      this.messages.add(new MessageItem(message)); 
} 

:私はから私のViewModelでいくつかの文字列を変更し

for (IssueViewResponse.MessageItem message : response.getMessages()) { 
      if (!TextUtils.isEmpty(message.getText())) { 
       this.messages.add(new MessageItem(message)); 
      } 
     } 

皆さんありがとうございました!

0

あなたのリストをチェックし、現在のアイテムがヌルかどうかを確認してください。そうであれば、リストから項目を削除し、notifyDataSetChanged()を呼び出します。

関連する問題