2

私は現在、ボタンのリスナーが何かをするためにこのコードを使用しています:

 @Override
 public View getView(int position, View convertView, ViewGroup parent) {
     View v = convertView;
     if (v == null) {
         LayoutInflater vi = (LayoutInflater)c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
         v = vi.inflate(R.layout.list_row, null);
     }
     Person p = persons.get(position);
     if (p != null) {

         Button but = (Button) v.findViewById(R.id.buttonId);
         but.setText(p.getDescription());
         but.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // do stuff
            }
        });


     }
     return v;
 } 

これはメモリ管理に適しているのでしょうか、それともアクティビティ自体で onListItemClick を実行する方がよいでしょうか?

4

1 に答える 1

3

さて、これはメモリ管理に適しているのでしょうか

それはもっと良いかもしれません。リストがスクロールされ、これらのアイテムが再利用されるため、多くのOnClickListenerオブジェクトを作成し、他のオブジェクトを孤立させることになります。古いものが収集されるため、必ずしもメモリリークではありませんが、それでも良い選択ではありません。

または、アクティビティ自体で onListItemClick を実行する方が良いですか?

If you can get away with it because you there is only one click action for an item in the list, you should absolutely stick to OnItemClickListener for the list and not handle this yourself.

However, if you need to create specific portions of each item to be clickable or want more than one action to be performed for a given item, it would be best if possible to collect those actions into a single OnClickListener that is created once and then attached to each item in getView(). You can differentiate which item was clicked by attaching metadata about the click action and maybe list position to the views themselves with setTag(). If this logic is complex, it may be best to create a custom view for your list items, and let the view itself handle all the clicks for each row rather than attempting to handles these actions externally.

于 2012-12-02T19:33:55.440 に答える