bindView()或扩展视图中的onClickListeners

时间:2014-11-05 05:11:19

标签: android

在列表视图中,我通常在自定义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,而是使用LikeButtonDislikeButtonUpVoteButton等扩展按钮视图。所有的行为(如更新数据库,通知内容解析器等)是否封装在扩展视图而不是活动/片段中?它是否违反任何设计原则(如MVC)?

2 个答案:

答案 0 :(得分:1)

  

创建在其自己的类定义中定义其侦听器的扩展视图是否有意义?

是肯定的。创建实现其自己的内部窗口小部件事件的复合/自定义视图是有意义的。 也可以更有效地在复合视图中仅实例化一次侦听器,然后在每次调用bindView()时创建侦听器的新实例 当然,这样做的决定取决于具体的用例,以及它们与它们所在的活动或片段的依赖性和关系。

  

通过这种方式,所有行为(如更新数据库,通知内容解析器等)都封装在扩展视图中而不是活动/片段中?

只要你知道自己在做什么,我就没有看到任何问题。重要的是要确切地知道你在做什么,因为如果你不小心,你可以陷入许多陷阱:

  • 在视图周期的正确时间取消或诋毁网络操作或异步任务的侦听器

  • 发布可能导致内存泄漏的引用(如果未在视图和活动生命周期的正确时间释放)

  • 每次在列表视图中使用时,DTO对象与复合视图之间的“绑定”和“取消绑定”

还有更多......

答案 1 :(得分:0)

我没有发现任何违反设计原则的行为。我已经在我的应用程序中实现了类似的功能,该应用程序在任何设备上都可以无间隙地工作

关于你对设计原则的关注,你不要太在意你的工作,而不是在不影响应用程序的性能。

用户永远不知道该应用的设计方式。他们烦恼的是,是的!这个应用程序工作快速,顺利。我应该用这个。

你可以在谷歌i / o中了解更多关于listview的信息:https://www.youtube.com/watch?v=wDBM6wVEO70