1

私はこの問題に何度か遭遇しましたが、クイック検索で多くの同様の問題を簡単に見つけることができます。ListView行レイアウトの動的な変更が他の行にも影響する場合もあれば、影響しない場合もあります。

この問題の解決策として、私は通常、リスト内のアイテムのセット全体を追跡し、変更があるたびに、リスト内のすべてのアイテムをリセットします。

例:TextViewsとチェックボックスのリストがある場合、各チェックボックスの状態を示すブール値の配列を保持する必要があり、getView()オーバーライドで、その配列に基づいてすべてのチェックボックスをリセットします。

これは期待されていますか?私はこの問題についていくつかの質問を見つけることができます、そしてすべての解決策は私のものと似ているようです。

今、私は非常に長いリストで一度に複数のアイテム(背景、チェックボックス、テキスト)を追跡する必要があるという問題に直面しています。この問題に対して他のアプローチがあるかどうか疑問に思います。

4

2 に答える 2

2

これは、AndroidでのListViewsの予想される動作です。リスト内のビューにデータを入力するために基になるデータを使用する方法は、順調に進んでいます。

Androidは、リストビューを作成するときにビューのリサイクルと呼ばれる手法を使用します。これは、ビューにデータを入力する場合と比較して、ビューを膨らませるのは集中的な操作であるためです。Androidは、ユーザーが画面に表示するビューを作成するだけで、(プログラマーの助けを借りて)インフレを最小限に抑えます。ユーザーがリストを上にスクロールすると、画面から移動したビューがプールに配置され、表示されようとしている新しいアイテムで再利用されます。このプールからのビューはgetView、2番目の引数としてに渡されます。このビューは、リストからポップされたときとまったく同じ状態を保持するため、getViewメソッドによって、古いデータの状態がすべて消去され、基になるデータの新しい状態に基づいて再入力されます。getView()の実装が持つべき構造の例を次に示します。

@Override
public View getView (int position, View convertView, ViewGroup parent)
{
    //The programmer has two responsibilities in this method.

    //The first is to inflate the view, if it hasn't been
    //convertView will contain a view from the aforementioned pool, 
    //    but when first creating the list, the pool is empty and convertView will be null
    if(convertView == null)
    {
        //If convertView is null, inflate it, something like this....
        convertView = layoutInflator.inflate(R.layout.mylistview, null);
    } 

    //If convertView was not null, it has previously been inflated by this method

    //Now, you can use the position argument to find this view's data and populate it
    //It is important in this step to reset the entire state of the view.
    //If the view that was popped off the list had a checked CheckBox, 
    //    it will still be selected, EditTexts will not be cleared, etc.

    //Finally, once that configuration is done, return convertView
    return convertView;
}

getItem()リストの管理に役立ち、基になるデータの管理やgetViewType()複数のビュータイプのリストなど、ビューのリサイクルを活用する巧妙な操作を可能にするAdapterクラスの他のメソッドも多数ありますgetViewTypeCount()が、上記は基本的なものです。ビューをスムーズに実行するために必要なテクニックと最小限。

あなたは正しい方向に進んでいたようです。これがあなたの質問のいくつかに答えるのに役立つことを願っています。詳細について不明な点がありましたらお知らせください。

于 2013-03-14T14:08:13.337 に答える
1

あなたはそれを正しい方法でやっています。Androidでは、個々のリストアイテムの状態を追跡する必要があります。がgetView呼び出されると、行の新しいビューを再利用または作成するオプションがあります。アイテムの状態(テキスト、チェック、背景など)を追跡することで、既存のビューを簡単にリセットできます。詳細な状態を追跡することは、他の行が1つの行の変更によって影響を受けないことを確認するのに役立ちます

電話をかけるとadapter.notifyDataSetChanged()、再描画されるアイテムは画面に表示されているもの(または画面に非常に近いもの)だけです。

于 2013-03-14T13:43:31.450 に答える