2

リストを表示するためにカスタム ListViewAdapter を使用しています。リストの各行には 3 つのボタンがあります。つまり、リスナーが接続されています。しかし、convertView が存在する行であっても、各スクロール中に新しい OnClickListeners が null 以外の値として作成されていることは非常に気がかりです。

// 私が理解しているように、ビューを変換する最も一般的なアプローチ:

public View getView(int position, View convertView, ViewGroup parent) {
    View view = null;   
    if (convertView == null) {
        LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = inflater.inflate(R.layout.listview_item, parent, false);
    } else {
        view = convertView;
    }
    final TextView textView = (TextView) view.findViewById(R.id.txtProduct);
    textView.setText(name);
    textView.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            ...
        }
});
... two more listeners, with the same approach
return view;

Java での私の経験によると、Spider 感覚の "ting-a-lings" - 同じリスナー アプローチを作成して破棄することは、ガベージ コレクターの悪用のようです。古いリスナーがいつ収集されたのかはわかりません...

新しいリスナーを作成する代わりに、古いリスナーを使用する方法はありますか? (ある種のキャッシュデータ構造)

4

1 に答える 1

1

List Adapter クラスをインターフェイスから継承するように設定できView.OnClickListenerます。あとは設定するだけ

textView.setOnClickListener(this);

そして、アダプター クラスのonClickメソッドでクリックを処理します。たとえば、どの行がクリックされたかを知るには、上記の行の前に次の行を追加します。

textView.setTag(position);

ではonClick、次のタグを取得することで、リスト内のどの位置を処理しているかを知ることができます。

public void onClick(View v) {
    Object item = myList.get((Integer) v.getTag());
    //handle click event
}
于 2013-04-26T18:51:23.397 に答える