现在我有一个listview,其中包含一个扩展ArrayAdapter
的自定义适配器。我在getView()
内的点击方法上有列表项但我不禁想知道是否最好将它放在活动类中,如下所示myList.setOnClickListener()
就性能而言,它是否有所作为?
答案 0 :(得分:1)
最好将其放在列表中而不是单个视图上。可能会为每个视图多次调用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;
}
你可以看到差异!如果您不必专门为ViewGroud(ListView,GridView等)的每个视图专门设置应用程序的行为,那么第一种选择肯定会更好!
请记住,在创建界面时,每个元素通常会多次调用getView方法。如果你做的操作更少,那么表现会更高......而且,第一个解决方案对我来说更清晰。
答案 1 :(得分:1)
我认为最好为getView()
中的项目设置监听器。
如果您在适配器的getView()
中设置了一个监听器,则每个项目都可以以其他方式响应事件,直接,独立和甚至 items。所以你可以设置扩展不同类的不同监听器来响应事件。 但是为了避免降低性能,当且仅当它没有被创建时,为你的项设置监听器。 您可以使用众所周知的View Holders方法来实现。 Here就是一个例子
答案 2 :(得分:0)
第二种方式做得更好。虽然除非你有很多物品,否则你不会注意到差异。所以我会这样做以防万一。
答案 3 :(得分:0)
如果侦听器的操作与列表的内容密切相关,请执行getView()中的所有操作,这样可以更轻松地重复使用并将相关的责任保持在一起。
但是,如果侦听器执行的操作更多地与活动或片段作为一个整体有关,则出于同样的原因在getView方法之外定义和设置侦听器。它就像OO封装和微型责任分配......