把onclick方法放在适配器之外是否更好,或者没有什么区别



现在我有一个列表视图与自定义适配器扩展ArrayAdapter。我在getView()中有点击方法的列表项,但我不禁想知道是否最好将其放在活动类中,如以下myList.setOnClickListener()

这对性能有影响吗?

最好将其放在列表中,而不是放在单个视图中。getView方法可能会为每个视图调用不止一次(通常是这样),然后您将为列表的每个视图调用setOnClickListener方法不止一次(无用)。

最好在列表中只调用一次,然后确定每次被单击的视图。

下面是一个小例子:

您可以在ListView(或通用ViewGroup)上设置侦听器:

// this one may be called just once
myListView.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, final int position, long arg3) {
        // you have the position of the clicked item, then you know what item has been clicked and you can do some stuff related to that one
    }
});

在ViewGroup的每个项上设置侦听器:

// in the adapter class you have the getView method
@Override
public View getView(int position, View arg1, ViewGroup arg2) {
    LinearLayout myLayout = (LinearLayout) mContext.getLayoutInflater().inflate(R.layout.something, null);
    //this one is called AT LEAST ONCE on each element of the list...
    myLayout.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View arg0) {
            // Do something
        }
    });
    return myLayout;
}

你可以看到区别!如果你不必为viewgroup (ListView, GridView等)的每个视图专门设置应用程序的行为,那么第一种选择肯定更好!

请记住,在创建接口时,getView方法通常会为每个元素调用不止一次。如果你做更少的操作,性能会更高……此外,第一个解决方案对我来说更清晰。

我认为最好为getView()中的项目设置侦听器。

如果在适配器的getView()中设置侦听器,则每个项可以直接响应,独立响应,甚至以不同于其他项的方式响应。因此,您可以设置不同的侦听器来扩展不同的类以响应事件。但是为了避免降低性能,当且仅当项目尚未创建时为其设置侦听器。你可以用众所周知的View holder方法来做。下面是一个例子

用第二种方法比较好。虽然你不会注意到差别,除非你有很多东西。所以我要这样做,以防万一。

如果侦听器的操作与列表的内容密切相关,则在getView()中完成所有操作,这将使重用更容易,并将相关职责保持在一起。

如果侦听器执行的操作更多地与整个活动或片段有关,则出于同样的原因,在getView方法之外定义和设置侦听器。

相关内容

最新更新