2

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

就性能而言,它有什么不同吗?

4

4 回答 4

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 方法。如果您执行较少的操作,那么性能会更高......此外,第一个解决方案对我来说更清晰。

于 2013-06-18T15:17:43.143 回答
1

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

如果你在getView()adapter中设置了一个监听器,那么每个item都可以响应事件,直接的,独立的,甚至与其他item不同的方式。所以你可以设置不同的监听器,扩展不同的类来响应事件。但是为了避免性能下降,当且仅当它尚未创建时才为您的项目设置侦听器。您可以使用众所周知的 View Holders 方法来做到这一点。是一个例子

于 2013-06-18T15:18:10.057 回答
0

如果侦听器的动作与列表的内容密切相关,则在 getView() 中执行所有操作,这样会更容易重用,并将相关职责放在一起。

但是,如果侦听器执行的操作更多地与整个活动或片段有关,则出于相同的原因在 getView 方法之外定义和设置侦听器。它就像微型的OO封装和职责分配......

于 2013-06-18T15:28:43.687 回答
0

最好用第二种方法。尽管除非您有很多物品,否则您不会注意到差异。所以我会这样做以防万一。

于 2013-06-18T15:17:21.647 回答