2017-09-14 4 views
0

私は、特定の項目をArrayList "mTaskList"から隠すオプションを実装しようとしています。アダプタをリセットしても新しいArrayListを取得できないのはなぜですか?

そのために、私は、アダプタのコンストラクタに "hideDues"というブール値を提供します。それが本当であれば、私はこれらの項目をリストから除外します。

public DeadlinesAdapter(Context context, ArrayList<TaskItem> taskList, DeadlinesAdapterListener listener, boolean hideDues) { 
    if (hideDues) { 
     for (int i = 0; i < taskList.size(); i++) { 
      if (taskList.get(i).getTimeLeftInMinutes() < 1) taskList.remove(i); 
     } 
    } 
    mTaskList = taskList; 
    mContext = context; 
    mListener = listener; 
} 

それは動作しますが、私はfalseにそのブール値を設定して、アダプタをリセットするとき、それはまだ私はコンストラクタで提供元のArrayListは、変更されていないにも関わらず、フィルタリングされたリストを使用しています。

if (mHideDues) { 
       mHideDues = false; 
       item.setIcon(R.drawable.ic_invisible_white); 
      } else { 
       mHideDues = true; 
       item.setIcon(R.drawable.ic_visible_white); 
      } 

      mDeadlinesAdapter = new DeadlinesAdapter(this, mTaskList, this, mHideDues); 
      mDeadlinesRecyclerView.setAdapter(mDeadlinesAdapter); 

私はブール値を変更し、アダプタをリセットします。 mTaskListは何も変更すべきではありません。では、なぜ新しいArrayListを使用しないのですか?

+0

は、あなたがそれをデバッグしていますか? –

+0

既にアイテムを削除したのと同じリストを再利用していますか?アダプターを再作成しても、それらのアイテムは戻されません。 – FWeigl

+0

デバッガでブール値をチェックし、その値を正しくfalseに設定しました。アクティビティが提供するArrayListは変更されません。なぜなら、それらの項目をアダプタ内にフィルタリングするからです。または私はここで間違っていますか? –

答えて

3

あなたは、例えば、このようなあなたのArrayListをコピーする必要があります。

ArrayList newList = new ArrayList(oldList); 

だけにしてDeadlinesAdapterにそれを渡します。あなたの問題を解決するはずです。

+0

ありがとう、このような基本概念が間違っているのは残念です。 –

+0

問題のみ:今すぐ.notifyDatasetChangedは動作しません。私は別の解決策を見つけなければならないと思いますか?私は参照を渡す場合のみ動作し、新しいリストに項目を追加した後ではありません。 –

+0

申し訳ありませんが、私はあなたの質問をかなり得ていません。私はアンドロイドの開発者ではありませんが、対応するコレクション(この場合はリスト)を変更すると、.notifyDatasetChangedが機能すると仮定します。だから、あなたは何を達成しようとしているのですか?一方で、最初のリストを変更したくないのですが、もう一方では何について通知を受けたいのですか?おそらく、あなたはあなたのアプリケーションのロジックを考え直すべきですか別の質問を投稿する –

2

セルゲイは問題を指摘しています。タスクリストをアダプタに渡して、リストをフィルタします。今あなたがしたいことは、リストのコピーをフィルタリングすることです。実際に行うことは、元のリストから項目を削除することです。そのため、mHideDuesをfalseに設定すると何も起こりません。あなたは何ができるか

は単純です:

ArrayList<TaskItem> mTaskList = new ArrayList<TaskItem>(); 

public DeadlinesAdapter(Context context, ArrayList<TaskItem> taskList, DeadlinesAdapterListener listener, boolean hideDues) { 

    mTaskList.addAll(taskList); 

    if (hideDues) { 
     for (int i = 0; i < this.list.size(); i++) { 
      if (mTaskList.get(i).getTimeLeftInMinutes() < 1) mTaskList.remove(i); 
     } 
    } 

    mContext = context; 
    mListener = listener; 
} 
+0

ありがとう、このような基本概念が間違っているのはごめんね。 –

+0

もう1つの質問:.addAllを使用してリストをフィルタリングするか、最初の場所に隠されていない項目のみをフィルタリングすると、それはパフォーマンス上の違いがありますか? –

+0

それは、あなたが本当に大量のデータを移動しない限り、おそらくほとんど目立たない小さな違いを作ります。上品にするには、https:// stackoverflowのようなフィルタを使用できます。com/questions/122105/what-is-the-the-best-way-to-filter-a-java-collection – fjc

関連する問題