2

ここで解決したい問題は、そのアイテムの背景の 1 つのアイテムをクリックすると、ListViewそのアイテムの背景が明るい灰色に変わりますが、リストをスクロールし続けると、4 番目のアイテムごとに他のアイテムの背景が明るい灰色に変わることです。クリックされていません。クリックしたアイテムだけがクリックの影響を受けるようにするにはどうすればよいですか?

    ListView lv = (ListView) findViewById(R.id.resultsList);
    lv.setAdapter(new ArrayAdapter<String>(this, R.layout.resultitem, (String[])labelList.toArray(new String[labelList.size()])));

    lv.setOnItemClickListener(new OnItemClickListener() {    

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {      
            TextView tv = (TextView)view.findViewById(R.id.result);
            tv.setBackgroundColor(Color.LTGRAY);
            tv.setTextColor(Color.BLACK);
        }
     }
4

2 に答える 2

1

getView()ListAdapter のサブクラス (この場合は ArrayAdapter) でオーバーライドする必要があります。

これは、Android が実際に行を再利用してリソースと CPU を節約するためです (行が画面外にスクロールされると、表示される新しい行に再利用されます)。そのため、1 つの行に背景のグレーを設定すると、おそらく再び使用されることになり、背景はグレーのままになります。

ArrayAdapter をサブクラス化すると、onItemClickListener に何らかのフラグを設定してから、ArrayAdapter にgetView()フラグに基づいて適切な背景色を設定できます。

このリンクには、ArrayAdapter をサブクラス化する例があります

于 2010-04-01T04:24:02.977 に答える
0

このように変換ビューを使用していると思います

...public View getView(int position, View convertView, ViewGroup parent) { ....

そして、4番目の位置で背景を変更しています.view letは1ページに6行あると言っているので、同じ convertView を再利用するため、すべてのページの4行ごとにグレー表示されます。

私が正しく説明しているかどうかはわかりませんが、convertview を使用してそのレイアウトを変更している場合は、同じ (キャッシュされた) ビューを再利用しないように、そのレイアウトを再作成するロジックが必要です。

于 2011-04-23T20:39:25.893 に答える