小学有没有必要学编程:为什么食谱促进重写getItemViewType和getViewTypeCount时 它似乎没有必要

关于小学有没有必要学编程的问题,在haywire recycling中经常遇到, 我一直在研究 Commonsware Android 编程教程,在教程 5 中,额外的学分 2,挑战是使用多个布局来显示 ListView 中的行,具体取决于对象的“类型名称”(a Restaurant 的“type”属性,它是一个 String)。因此,它建议在自定义 ArrayAdapter 中重写getItemViewType和getViewTypeCount。此外,

我一直在研究 Commonsware Android 编程教程,在教程 5 中,额外的学分 2,挑战是使用多个布局来显示 ListView 中的行,具体取决于对象的“类型名称”(a Restaurant 的“type”属性,它是一个 String)。因此,它建议在自定义 ArrayAdapter 中重写getItemViewTypegetViewTypeCount。此外,

在这种情况下,遵循此配方并重写这两种方法工作正常,但基于检查该 Restaurant“type”属性的值导致冗余逻辑。例如(请注意,此适配器是内部类,restaurants是声明为外部 Activity 成员的 Restaurant 对象的 ArrayList):

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;
  }
}

我的错误是重复的逻辑(getItemViewType中的 if / else 和switchgetView)。

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;
  }
}

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

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

16

为什么要覆盖这两个方法,如果一个没有?

添加几十家餐厅,所有不同的类型,并注意当你滚动时,你的行回收变得混乱,给出上面显示的实现。

getItemViewType()getViewTypeCount()是为了确保行回收工作。Android 将维护单独的对象池,并且只会将您的一行返回到正确类型的回收。

在您的解决方案中,您可以膨胀R.layout.row_delivery行,然后在您真正需要R.layout.row_sit_down行时将其交还给您进行回收。

顺便说一句,不要在AdapterView中使用inflate(R.layout.row_take_out, null)。要使RelativeLayout规则得到正确处理,请使用inflate(R.layout.row_take_out, parent, false)

本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处

(632)
禁用cookie怎么开启:Magento:企业全页缓存-禁用Cookie/$_COOKIE
上一篇
C盘有哪些可以删除的大文件:如何压缩大文件 C#(compress 5gb video)
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(51条)