Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/182.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 将onclick方法放在适配器之外更好还是没有区别_Android_Listview - Fatal编程技术网

Android 将onclick方法放在适配器之外更好还是没有区别

Android 将onclick方法放在适配器之外更好还是没有区别,android,listview,Android,Listview,现在我有一个带有自定义适配器的listview,它扩展了ArrayAdapter。我在getView()中有关于click方法的列表项,但我不禁想知道是否最好像下面的myList.setOnClickListener()那样将其放在activity类中 这对性能有影响吗?最好用第二种方法。虽然你不会注意到有什么不同,除非你有很多东西。所以我会这样做以防万一。最好将它放在列表中,而不是放在单个视图中。getView方法可能会为每个视图调用多次(通常是这样),然后您会为列表的每个视图多次调用方法se

现在我有一个带有自定义适配器的listview,它扩展了
ArrayAdapter
。我在
getView()
中有关于click方法的列表项,但我不禁想知道是否最好像下面的
myList.setOnClickListener()那样将其放在activity类中


这对性能有影响吗?

最好用第二种方法。虽然你不会注意到有什么不同,除非你有很多东西。所以我会这样做以防万一。

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

当然,最好在列表中只调用一次,然后每次单击视图时都进行标识

下面是一个小例子

在ListView(或通用视图组)上设置侦听器:

你可以看到区别!如果您不必为ViewGroud的每个视图(ListView、GridView等)专门化应用程序的行为,那么第一种选择当然更好


请记住,在创建接口时,通常会对每个元素多次调用getView方法。如果您执行的操作更少,则性能更高。。。此外,第一个解决方案对我来说更清楚。

我认为在
getView()
中为项目设置侦听器更好


如果您在适配器的
getView()
中设置了一个侦听器,那么每个项目都可以响应事件,直接、独立甚至以与其他项目不同的方式响应事件。因此,您可以设置扩展不同类的不同侦听器来响应事件。但为了避免性能下降,当且仅当项目尚未创建时才为其设置侦听器。您可以使用众所周知的视图持有者方法进行设置。例如

如果侦听器的操作与列表的内容密切相关,请在getView()中执行所有操作,这将使其更易于重用,并将相关责任保持在一起


但是,如果侦听器执行的操作更多地与整个活动或片段有关,那么出于同样的原因,在getView方法之外定义并设置侦听器。这就像是OO封装和责任分配的缩影…

你能给出每种方法的一个小例子吗
// 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
    }
});
// 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;
}