Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/190.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android bindView()或扩展视图中的onClickListeners_Android - Fatal编程技术网

Android bindView()或扩展视图中的onClickListeners

Android bindView()或扩展视图中的onClickListeners,android,Android,在列表视图中,我通常在自定义的CursorAdapter的bindView()方法中定义按钮onClickListeners。例如: private class MyCustomAdapter extends CursorAdapter{ ... ... @Override public void bindView(View view, Context context, Cursor cursor) { ... viewHolde

在列表视图中,我通常在自定义的
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);            
            }
    }

    ...
    ...
}
这看起来非常浪费,因为每次运行
bindView()
时都必须在
view.setOnClickListener()方法中创建匿名内部类


创建在自己的类定义中定义侦听器的扩展视图有意义吗?因此,在列表视图的项目布局中,我将使用扩展的按钮视图,如
LikeButton
DislikeButton
UpVoteButton
等,而不是使用
按钮
。通过这种方式,所有行为(如更新数据库、通知内容解析程序等)是否封装在扩展视图中而不是活动/片段中?它是否违反了任何设计原则(比如MVC)?

我没有发现任何违反设计原则的情况。我已经在我的应用程序中实现了类似的东西,并且该应用程序在任何设备上都可以运行flowlessy

在你对设计原则的关注上,你不必为它操心太多,只要你在不影响应用程序性能的情况下完成工作就行了

用户永远不知道应用程序是如何设计的。他们担心的是,是的!此应用程序运行快速且平稳。我应该用这个

您可以在此处了解有关谷歌i/o中listview的更多信息:

创建在自己的类定义中定义侦听器的扩展视图有意义吗

对。创建实现它们自己的内部小部件事件的复合/自定义视图是有意义的。 此外,在复合视图中只实例化一次侦听器,然后每次调用
bindView()
当然,这样做的决定取决于具体的用例,以及它们的依赖关系以及它们与所在的活动或片段的关系

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

只要你知道自己在做什么,我看这没什么问题。准确地知道你在做什么很重要,因为如果你不小心,你可能会落入很多陷阱:

  • 在查看周期的正确时间取消或取消网络操作或异步任务的侦听器

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

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


还有更多…

兄弟,你的问题不清楚…@Hareshchelana对此表示抱歉。我试图用一些代码来澄清它。请看一看。如果您的列表项有多个子项单击侦听器,那么这是正确的方法,否则您可以在适配器外部使用列表项单击侦听器。您不认为这种方法会影响性能,因为bindView()为每个列表视图项目运行,也为每个项目滚动到屏幕可见区域时运行?否。除非你的listview有1000-2000行。此外,您应该为行内容使用不同的对象类,然后设置setter和getter。我已经更新了我的答案,其中有一个指向googl关于listview的I/o的链接。这大约是一个小时,但是一个小时是值得花费的。我担心的一件事是混合MVC架构的模型和视图组件。如果我采用在扩展视图中合并数据库操作和其他数据相关行为的方法,我担心代码会很快变得非常混乱。在复合视图中处理单击事件的事实并不能说明所有逻辑也应该存在。例如:在我自己的应用程序中—执行诸如“喜欢”和“不喜欢”之类的操作,我从一个服务执行所有网络操作,该服务从自定义视图中的正确命令和参数开始。当服务命令完成时-服务本身执行数据库/内容提供程序更改,并发送广播指示我的加载程序新内容可用…那么在复合视图类的onClickListener中,您有对服务的调用吗?还是在activity/fragment类中调用服务?很多时候我都是直接从视图中调用startService()