2

ViewHolder パターンに従って、配列アダプターによって設定されたリスト ビューがあります。誰かがボタンをクリックすると、各行はかなり複雑になり、その行に表示されるカウントを増やし、その行のテキストの文字列を更新したいと考えています。

これまでのところ、すべてが正しく入力されていますが、あるセルのボタンをクリックすると、作成されている場合は次の行の値も変更されます。

試してみましnotifyDataSetChanged()たが、これによりリスト全体が再作成されます。これは私の場合には理想的ではありません。

配列アダプター内でメソッドを定義しているため、行と、リスト項目のその行に入力する項目onClick()を保持する RowHolder クラスがあります。vMainListItem

class RowHolder{
    View v;
    MainListItem i;
    RowHolder(View v, MainListItem i){
        this.v = v;
        this.i=i;
    }
}

onClick()h がホルダーであるボタンのスニペットを次に示します。

    h.loveButton.setBackgroundColor(Color.parseColor(rowHolder.i.brandLoveColor));
    h.loveButton.setImageResource(R.drawable.lovewhite);
    ((ImageView)rowHolder.v.findViewById(R.id.lovebutton)).setImageResource(R.drawable.lovewhite);              
    rowHolder.v.findViewById(R.id.lovebutton).setBackgroundColor(Color.parseColor(rowHolder.i.brandLoveColor));
    String newLovers = getLoverString(rowHolder.i,rowHolder);
    h.lovers.setText(newLovers);
    ((TextView)rowHolder.v.findViewById(R.id.lovers)).setText(newLovers);
    rowHolder.i.loverString = newLovers;
    rowHolder.i.loved = true;
    int tmp = rowHolder.i.loves
    tmp = tmp + 1;
    ((TextView)rowHolder.v.findViewById(R.id.lovecount)).setText(String.valueOf(tmp));
    h.lovecount.setText(String.valueOf(tmp));
    rowHolder.i.loves = tmp;

ボタンをクリックすると、リストビューを提供するデータ、ビューを保持するホルダーのデータ、および実際のビューに表示されるデータの値が変更されます。

この実装は、実際のビューの値を変更すると、表示されているすべての行の値が変更されるという事実を除いて、かなりうまく機能します。

誰かがこれを達成するためのより良い方法を見つけるのを手伝ってくれたら、それは素晴らしいことです.

4

1 に答える 1

1

私は notifyDataSetChanged() を試しましたが、これはリスト全体を再作成します。これは私の場合には理想的ではありません。

これは、解決する必要がある 1 つの問題です。ビューは単にデータを表示します。データのリフレッシュが高速なアダプターを実装するのは、ユーザー次第です。たとえば、ビットマップをロードする場合は、後で使用できるようにキャッシュします。確かに最初のロードには時間がかかるかもしれませんが、2 回目は瞬時にロードできます。

行 v と、リスト項目のその行 MainListItem を設定する項目を保持する RowHolder クラスがあります。

このように項目と行を結び付けることは理想的ではありません。Android はビューをリサイクルするため、これを正しく維持することが難しくなります。あなたが見つけたように。ビューの settag メソッドは、このような問題に対処するのに非常に便利であることがわかりました。ビューが関連付けられているアダプター内のアイテムを知る必要がある場合は、setTag を使用してそれを追跡します。アダプターの getView メソッドは、これを設定するのに最適な場所です。ホルダーをデザインから完全に削除します。データがビューに結び付けられる場所をほとんど持たないようにしてください。

ビューからデータを分離し、アダプターを高速に更新したら。データを更新するだけで、他のすべてが機能します。

詳細については、Model-View-Controller Design パターンを参照してください。

于 2013-02-02T03:28:22.543 に答える