2

2番目の項目をマークしたい場合は、次のコードを実行しています。このコードは、ArrayAdapterを拡張するアダプターからのものです。

if (convertView == null) {
        LayoutInflater mInflater = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = mInflater.inflate(R.layout.channel_list, null);
    } 

    MyContent o = items.get(position);
    if (o != null) {
        TextView tt = (TextView) convertView.findViewById(R.id.toptext);
        TextView bt = (TextView) convertView.findViewById(R.id.bottomtext);
        if (tt != null) {
            tt.setText(o.Top());                            
        }
        if(bt != null){
            bt.setText(o.Bottom());
        }
        if(position == 2) {
            convertView.setBackgroundColor(R.color.selectem_color);
        }
    }
    return convertView;

リストビューが表示されますが、このアイテムの後の9番目のアイテムごとにマークが付けられます(11番目のアイテムは13番目など)。

誰かが理由を知っていますか?

4

2 に答える 2

3

背景色をリセットしていません。行は再利用されることに注意してください。これconvertViewが の目的です。を追加しelse {}て、色を通常の状態でpositionはないときに設定するだけ2で問題ありません。

于 2010-05-30T18:42:15.357 に答える
2

getViewメソッドを呼び出すことができる2つのケースがあります。converViewがnullの場合、新しいビューを作成する必要があります。nullでない場合、ユーザーのスクロールが原因で画面を離れたアイテムはリサイクルされ、メソッドに戻されて再利用されます。

このオブジェクトは、以前にリストに表示されたオブジェクトです。その状態を確認し、そのすべてのプロパティを必要な値に設定する必要があります。オブジェクトが新しく、マークされたオブジェクトとマークされていないオブジェクトが戻ってきたように振る舞うことはできません。getviewメソッドでこのようなことを行います。

if(item is selected) {    
    convertView.setBackgroundColor(selected color);
} else {
    convertView.setBackgroundColor(not selected color);
}

あなたのコードでは、ifのelseケースが欠落しています。

于 2010-05-31T07:25:24.057 に答える