2016-05-17 12 views
0

ListViewまたはGridViewがスクロール中に古いアイテムを使用したのはなぜですか?私は、リストビューで表示している500以上の製品リストビューを持っています。各リストアイテムには4つの列があり、最後の列にはステータスがアクティブまたは非アクティブであるImageViewがあります。 ImageViewをアクティブとしてマークするたびに、定期的にスクロールした後、すべての項目が自動的にImageViewをアクティブとして変更しました。 Android ListViewとGridViewがスクロール中に変更されたアイテムを繰り返す

iは第六項目をクリックして、スクロール時に私は私はあなたがgetViewメソッド内viewholder使用していると思うように12日、18日、24日ともアクティブ

答えて

1

スクロールエクスペリエンスを最適化するために、ListViewおよびGridViewはアイテムビューを再利用して、すべてのリストアイテムのビューを拡張/インスタンス化する必要がなくなります。

だからこそ、getViewのパラメータは、ViewというconvertViewというパラメータを持っています。 convertViewがヌルの場合は、アイテムの新しいビューを展開する必要があります。それがヌルでない場合は、このビューを再利用してインフレーションのオーバーヘッドを回避できることを意味します。

欠点は、この「リサイクル」されたアイテムビューは、最後に表示されたときにその中にゴミが入り、リストアイテムと一致するようにビュー内のすべてをリセットする必要があるということです。

新しいAndroidデベロッパーがよく見かける間違いは、ビュー内のすべてのモデル表現を持たないことです。たとえば、リスト項目がアクティブまたは非アクティブのステータスを表示できる場合、リスト項目のモデルはbooleanというプロパティ(mActive)を持っているはずです。

ListViewがリスト項目を再表示する必要があると判断すると、リストのモデルは常に現在のリストの状態を保持していなければなりません。

だから、あなたが何をする必要があるか基本的に4つのものである:

  • はあなたのリスト項目のモデルにプロパティを追加します。

    boolean mActive; // this can be private with getter/setter 
    
  • 状態を変更するためのアダプターメソッドを作成します。例:

    public void toggleItemActive(int position) { 
    
         mListItem.get(position).mActive = ! mListItem.get(position).mActive; 
         notifyDataSetChanged(); 
        } 
    

    ここでnotifyDataSetChanged()を呼び出すことは非常に重要です。あなたのgetViewオーバーライドで

  • このプロパティを使用した:あなたのイベントハンドラからプロパティを設定し

    imageView.setImageResource(item.mActive ? R.drawable.active : R.drawable.inactive); // or however you are doing it 
    
  • :今

    listView.setOnItemClickListener(new OnItemClickListener) { 
    
         @Override 
         public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
          MyAdapter adapter = (MyAdapter) parent.getAdapter(); 
          adapter.toggleItemActive(position); 
         } 
        }); 
    

あなたListViewが正しくリスト項目が表示されます。

0

ように変更していることがわかりアクティブとしてそのImageViewのを作る場合としましょう()カスタムアダプターのメソッド。ビューホルダーを使用しているときは、ビューを再利用します。あなたの説明のように、あなたのデバイスは一度に6つのリスト項目をdiaplyすることができます。したがって、6番目、12番目(6番目の位置+ 6番目の画面)、18番目(12番目の位置+ 6番目の画面)、24番目のものなどはすべて同じビューを使用します。したがって、6番目のアイテムが変更されると、関連する12番目、18番目、24番目のアイテムなども変更されます。

関連する問題