Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/196.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 为什么recipes在没有';似乎没有必要?_Android_Android Arrayadapter_Android View_Commonsware - Fatal编程技术网

Android 为什么recipes在没有';似乎没有必要?

Android 为什么recipes在没有';似乎没有必要?,android,android-arrayadapter,android-view,commonsware,Android,Android Arrayadapter,Android View,Commonsware,我一直在学习Commonware Android编程教程,在教程5“额外学分2”中,挑战在于根据对象的“类型名称”(餐厅的“类型”属性,即字符串)使用多个布局在列表视图中显示行。因此,它建议在自定义ArrayAdapter中重写getItemViewType和getViewTypeCount。除此之外,其他人或建议相同 在这种情况下,遵循此配方并重写这两个方法可以很好地工作,但会在检查餐厅“type”属性的值的基础上产生冗余逻辑。例如(请注意,此适配器是一个内部类,餐厅是声明为外部活动成员的餐厅

我一直在学习Commonware Android编程教程,在教程5“额外学分2”中,挑战在于根据对象的“类型名称”(餐厅的“类型”属性,即字符串)使用多个布局在列表视图中显示行。因此,它建议在自定义ArrayAdapter中重写
getItemViewType
getViewTypeCount
。除此之外,其他人或建议相同

在这种情况下,遵循此配方并重写这两个方法可以很好地工作,但会在检查餐厅“type”属性的值的基础上产生冗余逻辑。例如(请注意,此适配器是一个内部类,
餐厅
是声明为外部活动成员的餐厅对象的ArrayList):

这实现了动态加载三个xml布局之一的目标,消除了冗余逻辑,略微减少了代码与布局数量的耦合,并且不需要重写
getViewTypeCount
getItemViewType

我的问题是:如果没有必要,为什么要覆盖这两种方法

如果没有必要,为什么要覆盖这两种方法

添加几十家不同类型的餐厅,并根据上面所示的实现,在滚动时观察行回收失控

getItemViewType()
getViewTypeCount()
用于确保行回收工作正常。Android将维护单独的对象池,并且只会将正确类型的行返回给您进行回收

在您的解决方案中,您可以将
R.layout.row\u delivery
行充气,然后在您确实需要
R.layout.row\u坐下
行时将其交还给您进行回收


顺便说一句,不要在
适配器视图中使用
充气(R.layout.row\u take\u out,null)
。要获得正确处理的
RelativeLayout
规则,请使用
充气(R.layout.row\u out,parent,false)

谢谢标记;我怀疑我的怀疑是因为我对回收缺乏更深入的了解。@ybakos:如果你有这个描述,请阅读“通过列表获得想象力”一章,以获得更深入的回收报道。
class RestaurantsAdapter extends ArrayAdapter<Restaurant> {

  private static final int ROW_TYPE_DELIVERY = 0;
  private static final int ROW_TYPE_TAKE_OUT = 1;
  private static final int ROW_TYPE_SIT_DOWN = 2;

  RestaurantsAdapter() {
    super(LunchListActivity.this, android.R.layout.simple_list_item_1, restaurants);
  }

  public int getViewTypeCount() {
    return 3;
  }

  public int getItemViewType(int position) {
    String type = restaurants.get(position).getType();
    if (type == "delivery") {
      return ROW_TYPE_DELIVERY;
    } else if (type == "take_out") {
      return ROW_TYPE_TAKE_OUT;
    } else {
      return ROW_TYPE_SIT_DOWN;
    }
  }

  // Sets the icon, name and address of the Restaurant for the view.
  public View getView(int position, View convertView, ViewGroup parent) {
    View row = convertView;
    RestaurantHolder viewHolder;

    if (row == null) {
      LayoutInflater inflater = getLayoutInflater();
      switch (getItemViewType(position)) {
        case ROW_TYPE_DELIVERY:
          row = inflater.inflate(R.layout.row_delivery, null);
          break;
        case ROW_TYPE_TAKE_OUT:
          row = inflater.inflate(R.layout.row_take_out, null);
          break;
        default:
          row = inflater.inflate(R.layout.row_sit_down, null);
          break;
      }

      viewHolder = new RestaurantHolder(row);
      row.setTag(viewHolder);
    } else {
      viewHolder = (RestaurantHolder)row.getTag();
    }

    viewHolder.populateFrom(restaurants.get(position));

    return row;
  }

}
class RestaurantsAdapter extends ArrayAdapter<Restaurant> {

  RestaurantsAdapter() {
    super(LunchListActivity.this, android.R.layout.simple_list_item_1, restaurants);
  }

  // Sets the icon, name and address of the Restaurant for the view.
  public View getView(int position, View convertView, ViewGroup parent) {
    View row = convertView;
    RestaurantHolder viewHolder;

    if (row == null) {
      LayoutInflater inflater = getLayoutInflater();
      if (restaurants.get(position).getType() == "delivery") {
        row = inflater.inflate(R.layout.row_delivery, null);
      } else if (restaurants.get(position).getType() == "take_out") {
        row = inflater.inflate(R.layout.row_take_out, null);
      } else {
        row = inflater.inflate(R.layout.row_sit_down, null);
      }
      viewHolder = new RestaurantHolder(row);
      row.setTag(viewHolder);
    } else {
      viewHolder = (RestaurantHolder)row.getTag();
    }

    viewHolder.populateFrom(restaurants.get(position));

    return row;
  }

}