Android convertView正确处理

时间:2018-02-08 06:04:53

标签: android adapter

我在我的android项目中有以下覆盖getView

 @Override
 public View getView(int position, View convertView, ViewGroup parent) {
     DrawerListItemBinding binding;

     if (convertView == null) {
         binding = DataBindingUtil.inflate(
                 LayoutInflater.from(this.context),
                 R.layout.drawer_list_item, parent, false);
        if (binding == null) { return convertView; }
         binding.setTitle(values[position]);
         convertView = binding.getRoot();
     } else {
         binding = (DrawerListItemBinding) convertView.getTag();
     }

     if (binding == null) {
         return convertView;
     }
     binding.setIsCurrentView(activeIndex == position ? true : false);

     return convertView;

我不认为第二次空检查binding==null是正确的,因为我相信在这种情况下我需要在那时从头开始膨胀/创建一个新视图。我想知道如果转换为非空的条件是什么条件,但是在转换为null的正确类型后它是getTag(),如果是这样的话,最好的做法是什么......例如通过调用DataBindingUtil.inflate()来创建正确的视图?

文档说明应该确保convertView不是null并且是“正确类型”。它是指在第二次空检查中会遇到的情况吗?

1 个答案:

答案 0 :(得分:0)

所以我在这里混淆了一些不同的东西。在文档说它时 “注意:在使用之前,您应该检查此视图是否为非null且类型是否合适。如果无法转换此视图以显示正确的数据,则此方法可以创建新视图。”

第二个条件仅指您使用异构列表时的情况。由于这个特殊问题没有,因此我不需要担心转换视图是否能够转换为适当的视图以显示正确的数据。其中两个.getTag()正在返回null,因为它首先没有设置。这可以通过简单地使用生成的数据绑定类类型safe .bind(View root)方法来解决,而不是从标记中获取绑定,如下所示:

  @Override
 public View getView(int position, View convertView, ViewGroup parent) {
 DrawerListItemBinding binding;

 if (convertView == null) {
     binding = DataBindingUtil.inflate(
             LayoutInflater.from(this.context),
             R.layout.drawer_list_item, parent, false);
     convertView = binding.getRoot();
 } else {
     binding = DrawerListItemBinding.bind(convertView);
 }

 binding.setTitle(values[position]);
 binding.setIsCurrentView(activeIndex == position ? true : false);

 return convertView;
}