1

私のリストビューには、TreeMap を使用して構築したカスタム アダプターがあり、次のように getView メソッドを定義しました。クリック時にリストビューの特定のテキストビューでテキストを打ち消そうとしていますが、特定の文字パターン (y@y) を含むテキストビューのみが打ち消されます。ただし、リストビューの 1 つの行をクリックすると、他の行に三振効果が発生します。

    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);



        if (convertView == null) { 
            convertView = inflater.inflate(R.layout.chklistlayout, parent, false); 
        }
        TextView textView = ((TextView) convertView.findViewById(R.id.textView1));
        TextView imageview = ((TextView) convertView.findViewById(R.id.textView2));
        textView.setText(values[position]);
        imageview.setText(mValues[position]);


        String s = mValues[position];
        if (s.contains("y@y")) {
            System.out.println("In if of getview");
            System.out.println(s);
            imageview.setPaintFlags(imageview.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
        } else {

        }

        return convertView;
    }
}

静的ホルダー クラスを使用してホルダー パターンも使用してみましたが、問題は解決しないようです。ポインタはありますか?

4

1 に答える 1

2

この答えは半分私のもので、半分はムハンマド・ババールからのもので、私たちは両方とも質問にコメントして、非常に良い答えを作りました:

これを処理するにはelseブロックを使用し、imageview.setPaintFlags()でストライクしない

発生します

convertView のためです。リストをスクロールすると、以前に使用されていたのと同じビューが getView メソッドに返されます。そのため、前に StrikeThrough でペイントした同じ imageView が引き続きペイントされます。したがって、そのアクションを元に戻す必要があります。

さらに、このリサイクルのため、通常、アダプターを扱うときは、常に元に戻す/元に戻す/再描画する/テキストを変更する/すべての要素の画像を変更して、画面上で希望どおりに表示されるようにする必要があります。

ps .: ここで、Holder パターンを適用してパフォーマンスを向上させる必要があります。

于 2013-09-03T10:37:02.593 に答える