java-Android绑定策略,适配器应该工作还是执行视图?

我不确定这是否取决于开发人员的意见,但是我正在创建一个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().但是,它会将显示的数据与基础数据解耦,从而使其中一项可以更改,并有可能重新使用另一项.

上一篇:我如何访问存在于ItemTemplate中的ServerControl?


下一篇:小程序原生js获取用户权限