为 listview 定义 onlick:在 listView 级别的 Onclick 与自定义视图适配器内的 Onclick
Posted
技术标签:
【中文标题】为 listview 定义 onlick:在 listView 级别的 Onclick 与自定义视图适配器内的 Onclick【英文标题】:Defining onlick for listview: Onclick at listView level vs Onclick inside custom view adapter 【发布时间】:2019-06-14 13:12:29 【问题描述】:在自定义适配器的点击事件处理中,更好(考虑性能和内存),1)在ListView级别定义点击处理程序。 2) 在自定义适配器中定义一个点击处理程序。
在自定义适配器级别定义点击处理程序会增加内存消耗吗? 下面是一些示例伪代码。
//在列表级别定义点击处理程序
layoutNotificationViewHolder.mNotificationListLv.setOnItemClickListener(new AdapterView.OnItemClickListener()
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
final SampleItem selectedItem = itemList.get(position);
Intent itemInfoIntent = new Intent(context, itemMoreInfoActivity.class);
itemInfoIntent.putExtra("selected_item", selectedItem);
context.startActivity(itemInfoIntent);
);
//在适配器内部定义点击处理程序。
public View getView(final int position, View convertView, ViewGroup parent)
final SampleItem selectedItem = itemList.get(position);
convertView.mCameraIv.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
Intent itemInfoIntent = new Intent(context, itemMoreInfoActivity.class);
itemInfoIntent.putExtra("selected_item", selectedItem);
context.startActivity(itemInfoIntent);
);
【问题讨论】:
considering performance and memory
为什么你认为在某个地方写代码会影响性能?我更喜欢在适配器中编写点击代码,因为它易于阅读和维护。据我所知,在您定义的业务逻辑没有复杂性(循环)并依次影响性能之前,不会对性能产生任何影响。
【参考方案1】:
首先,列表视图已弃用,请改用 RecyclerView。 对于您的问题,如果单击的处理程序是适配器(例如 1),那么不会创建有利于内存的新对象,并且如果您像在 ex2 中那样设置它 - 每次 getView 函数都会创建新对象被称为哪个不太好。但总的来说它并没有那么贵,所以两个例子都很好。
【讨论】:
这是一些遗留代码,目前我没有摆脱 ListView 的选项。您确定每次调用 getView 函数时都会创建新对象吗?我在想,由于对象类型是最终的并且不能修改,所以对象引用应该简单地保存一个指向 ListView 数组内对象的指针/引用。no new objects will be created which is good for memory
每次都在哪里创建或不创建新对象??以上是关于为 listview 定义 onlick:在 listView 级别的 Onclick 与自定义视图适配器内的 Onclick的主要内容,如果未能解决你的问题,请参考以下文章