在列表视图中,我通常在自定义CursorAdapter
的bindView()方法中定义按钮onClickListeners。例如:
private class MyCustomAdapter extends CursorAdapter{
...
...
@Override
public void bindView(View view, Context context, Cursor cursor) {
...
viewHolder.btn1.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View arg0){
...
new myDao().updateSomethingInDB(myObject);
getActivity().getContentResolver().notifyChange(myContentProviderUri, null);
}
}
...
...
}
这似乎非常浪费,因为每次view.setOnClickListener()
运行时都必须在bindView()
方法中创建匿名内部类。
创建在其自己的类定义中定义其侦听器的扩展视图是否有意义?因此,我不会在列表视图的项目布局中使用Button
,而是使用LikeButton
,DislikeButton
,UpVoteButton
等扩展按钮视图。所有的行为(如更新数据库,通知内容解析器等)是否封装在扩展视图而不是活动/片段中?它是否违反任何设计原则(如MVC)?
答案 0 :(得分:1)
创建在其自己的类定义中定义其侦听器的扩展视图是否有意义?
是肯定的。创建实现其自己的内部窗口小部件事件的复合/自定义视图是有意义的。
也可以更有效地在复合视图中仅实例化一次侦听器,然后在每次调用bindView()
时创建侦听器的新实例
当然,这样做的决定取决于具体的用例,以及它们与它们所在的活动或片段的依赖性和关系。
通过这种方式,所有行为(如更新数据库,通知内容解析器等)都封装在扩展视图中而不是活动/片段中?
只要你知道自己在做什么,我就没有看到任何问题。重要的是要确切地知道你在做什么,因为如果你不小心,你可以陷入许多陷阱:
在视图周期的正确时间取消或诋毁网络操作或异步任务的侦听器
发布可能导致内存泄漏的引用(如果未在视图和活动生命周期的正确时间释放)
每次在列表视图中使用时,DTO对象与复合视图之间的“绑定”和“取消绑定”
还有更多......
答案 1 :(得分:0)
我没有发现任何违反设计原则的行为。我已经在我的应用程序中实现了类似的功能,该应用程序在任何设备上都可以无间隙地工作
关于你对设计原则的关注,你不要太在意你的工作,而不是在不影响应用程序的性能。
用户永远不知道该应用的设计方式。他们烦恼的是,是的!这个应用程序工作快速,顺利。我应该用这个。
你可以在谷歌i / o中了解更多关于listview的信息:https://www.youtube.com/watch?v=wDBM6wVEO70