现在我有一个带有自定义适配器扩展的列表视图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;
}
你可以看到区别!如果您不必为 ViewGroud 的每个视图(ListView、GridView 等)专门化应用程序的行为,那么第一个替代方案肯定更好!
请记住,在创建界面时,通常会为每个元素多次调用 getView 方法。如果您执行较少的操作,那么性能会更高......此外,第一个解决方案对我来说更清晰。
我认为最好为 中的项目设置侦听器getView()
。
如果你在getView()
adapter中设置了一个监听器,那么每个item都可以响应事件,直接的,独立的,甚至与其他item不同的方式。所以你可以设置不同的监听器,扩展不同的类来响应事件。但是为了避免性能下降,当且仅当它尚未创建时才为您的项目设置侦听器。您可以使用众所周知的 View Holders 方法来做到这一点。这是一个例子
如果侦听器的动作与列表的内容密切相关,则在 getView() 中执行所有操作,这样会更容易重用,并将相关职责放在一起。
但是,如果侦听器执行的操作更多地与整个活动或片段有关,则出于相同的原因在 getView 方法之外定义和设置侦听器。它就像微型的OO封装和职责分配......
最好用第二种方法。尽管除非您有很多物品,否则您不会注意到差异。所以我会这样做以防万一。