我不确定这是否取决于开发人员的意见,但是我正在创建一个android应用并具有一个显示自定义视图的Listview.我的布局基本上由一个View(作为xml资源文件和一个从作为根的视图派生的类),一个Domain Model对象(具有要绑定到该视图的数据)和一个从BaseAdapter派生的适配器组成,将域模型中的数据绑定到getViewMethod中的视图,如下所示:
型号:SampleItem
自定义视图:SampleView
适配器:(下面的代码)
public View getView(int position, View convertView, ViewGroup parent) {
SampleView sampleView;
SampleItem item = (SampleItem)getItem(position);
if(convertView == null) {
sampleView = new SampleView(_context);
}
else {
sampleView = (SampleView)convertView;
}
sampleView.setTitle(item.getTitle());
sampleView.setContentText(item.getContent());
sampleView.setItemRowNumer(item.getRowNumber());
... //etc
return sampleView;
}
这就是我一直看到的完成方式,但是我不知道这是正确的方式.
我的想法来自于数据绑定的另一种方法,那就是实际的视图类没有关于其模型的概念,并且将控件转移到如何将数据绑定到适配器的类上,如果搬到其他地方.
我以为自定义视图类具有对绑定到该对象的对象的引用,并且在其构造函数中,它根据数据填充视图.因此,适配器本质上是仅执行以下操作的shell类:
public View getView(int position, View convertView, ViewGroup parent) {
SampleView sampleView;
SampleItem item = (SampleItem)getItem(position);
if(convertView == null) {
sampleView = new SampleView(_context, item);
}
else {
sampleView = (SampleView)convertView;
}
return sampleView;
}
并且视图的实际构造函数将知道其模型并填充自身,而不是由Adapter进行超出其职责范围的工作.
解决方法:
适配器应该这样做.有两个原因.
1)CursorAdapter#bindView:它是在框架中定义的.这是惯用的,它将是其他android程序员在阅读代码时所期望看到的.恕我直言,保持习惯用法可以改善代码维护和易读性.
2)AdapterView类在android中的工作方式是它们重用从适配器返回的View.这样一来,在滚动/轻拂/等过程中不会创建许多新对象.动画和UI事件.为了使其正常工作,AdapterView将该View传递回适配器,并希望该视图可被重用.恕我直言,其目的和期望是使Adapter处理该View的更新和重新绑定.如果您尝试使用方法并将绑定保留在Views构造函数中,则只有在构造函数中才会发生数据绑定.然后,您需要将该绑定移动到一个单独的函数中,这可能会使类接口混乱,并且继承会导致其他问题.
对我来说,我更喜欢View只关心如何显示某些东西.这就是我真正要担心的所有责任.我认为这已经足够,因为某些视图可能变得非常复杂.我喜欢将其留给其他班级,以便担心告诉View应该显示什么以及数据来自何处.有时这意味着非常简单的绑定,即,连续多次调用toString().但是,它会将显示的数据与基础数据解耦,从而使其中一项可以更改,并有可能重新使用另一项.