2016-04-09 10 views
0

データソースを直接変更し、変更をアダプターに通知しようとしています。しかし、addAll()は私のリストを更新しません。私のコードではすべてがOKだが、実行中ではないようだ。コードを修正するのを手伝ってください。前もって感謝します。リスト<String> addAll()メソッドが追加されていません

List<String> pgs = myClass.getPgs(); 
    List<String> tmppgs = pgs; 

    /* 
    . 
    lots of code for string processing which results in >> String content for each i 
    . 
    */ 

    for (int i = 0; i < tmppgs.size(); i++) { 
    tmppgs.set(i, content); 
    } 

    Toast.makeText(getActivity(),String.valueOf(tmppgs.size()), Toast.LENGTH_LONG).show(); 
    // Toast shows desired result which is OK. 

    pgs.clear(); 
    pgs.addAll(tmppgs); 
    Toast.makeText(getActivity(),String.valueOf(pgs.size()), Toast.LENGTH_LONG).show(); 
    //Unexpectedly shows zero 

    mAdapter.notifyDataSetChanged(); 
} 
+2

'tmppgs == pgs'です。あなたは両方をクリアしています。 – Marvin

+0

いいえ、最初のトーストは正しい結果を示します。問題はpgs.clear()から始まります。 – infiniteLoop

+0

ちょっと試しましたか?リスト tmppgs = new ArrayList (pgs); ? –

答えて

1

pgstemppgsは同じArrayListオブジェクトです:

したがって
List<String> tmppgs = pgs; 

あなたがpgs.clear()を呼び出すとき、あなたはその1つのリストを空にしています。 pgs.addAll(tmppgs)は、空のリストの内容を自分自身に追加しようとしているため、何の効果もありません。

最初にclear()addAll()を実行している理由は不明です。あなたの目的がset()の呼び出しによって変更されたリストで終わることであれば、すでにset()呼び出しでそのリストを変更しています。 clear()addAll()の行をコメントアウトしてください(最終的には不要になったので、最終的にtmppgsを取り除きます)。

+0

ありがとう@答えを@ CommonSWare。私が言ったように、リストを再初期化することは古いリストへのメモリ参照を持っているので、アダプタには影響しませんので、既存のリファレンスを直接操作する必要があります。 – infiniteLoop

+0

@ ab0001368:それで、私の答えの2番目の段落に書いたことをしてください。 – CommonsWare

+0

私は、リストのゼロサイズを返すことを解決したtmppgsの代わりに、直接pgsを修正しました。しかし、recyclerviewはアイテムを更新する際に予期せず動作します。リストのサイズは3です(recyclerviewは3つのwebviewを表示します)。第1および第2のアイテムは更新されない。 3つの更新されたアイテム(3つのテキスト)が3番目のwebviewに表示されます! – infiniteLoop

0

あなたはあなたのために働くものと

List<String> tmppgs = myClass.getPgs();; 

List<String> tmppgs = pgs; 

を変更することができます。

関連する問題