40

で単一の行を再描画することは可能ListViewですか? 私ListViewはsであるwith行を持っていますLinearLayoutView私は好みの変更を聞いていますが、1 つの行の中で1 つだけを変更する必要がある場合がありLinearLayoutます。を呼び出さずにその行を再描画する方法はありlistview.notifyDatasetChanged()ますか?

ビュー (内) で view.invalidate() を呼び出してみましたLinearLayoutが、行は再描画されません。

4

4 に答える 4

108

RomainGuyがGoogleI / Oセッション中にしばらく前に説明したように、リストビューの1つのビューのみを更新する最も効率的な方法は、次のようなものです(これはデータ全体を更新します)。View

ListView list = getListView();
int start = list.getFirstVisiblePosition();
for(int i=start, j=list.getLastVisiblePosition();i<=j;i++)
    if(target==list.getItemAtPosition(i)){
        View view = list.getChildAt(i-start);
        list.getAdapter().getView(i, view, list);
        break;
    }

targetアダプターの1つのアイテムを想定しています。

このコードは、を取得し、現在表示されているビューを参照し、探しているアイテムを表示されている各ビューアイテムとListView比較します。ターゲットがそれらの中にある場合は、囲んでいるビューを取得し、そのビューでアダプターを実行して表示を更新します。targetgetView()

サイドノートinvalidate()は一部の人が期待するようには機能せず、ビューを更新しないgetView()ため、リスト全体が再構築され、表示されたすべてのアイテムがnotifyDataSetChanged()呼び出され、多くのアイテムにも影響します。getview()invalidateViews()

最後に、行ビューの子を変更するだけで、行全体を変更する必要がない場合は、パフォーマンスを向上させることもできますgetView。その場合、次のコードを置き換えることができます(テキストlist.getAdapter().getView(i, view, list);を変更する例)。TextView

((TextView)view.findViewById(R.id.myid)).setText("some new text");

コードでは、私たちは信頼しています。

于 2012-04-03T05:34:38.677 に答える
6

私にはview.invalidate()うまくいきませんでした。しかし、これは魅力のように機能します:

行の位置 " " を更新しているとpositionします。if画面にない行を更新しているときにテキストが踊るなど、奇妙な再描画を回避します。

            if (position >= listView.getFirstVisiblePosition()
                && position <= listView.getLastVisiblePosition()) {

                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            listView.invalidateViews();
                        }
                    });
            }
于 2011-10-05T23:17:50.783 に答える
3

Romain Guy は、「Google IO 2010 The world of ListView」ビデオで、この質問が行われた正確な時間にこの質問に答えました: http://www.youtube.com/watch?feature=player_detailpage&v=wDBM6wVEO70#t=3149s

Romain Guy によれば、それはうまくいくはずであり、私たちは彼を信頼できると思います。

ビューが再描画されない理由は少し不思議です。listView で利用可能なすべてのキャッシュ オプションを無効にしてみてください。

setAnimationCacheEnabled(false);
setScrollingCacheEnabled(false);
setChildrenDrawingCacheEnabled(false);
setChildrenDrawnWithCacheEnabled(false);
于 2011-10-22T14:15:53.173 に答える
0

更新する行にタグを付けます。その特定のビューまたは行を再描画する場合は、次のようにします

ListView lv = (ListView)findViewById(....)

その後

View v = lv.findViewWithTag(tagobject);

次に、ビューで必要なことを行います。

于 2011-03-14T13:07:26.737 に答える