【问题标题】:How to check if a view is of an appropriate type before using in Adapter getView在适配器 getView 中使用之前如何检查视图是否属于适当的类型
【发布时间】:2015-07-08 10:18:01
【问题描述】:

我正在使用 Adapter 和 3 种类型的 Views

public class MyAdapter extends ArrayAdapter<MyClass> {
    @Override
    public int getViewTypeCount() {
        return 3;
    }

    //...
}

似乎有时会将错误类型的视图传递给getView。 Indeed 文档对此提出了警告:

注意:您应该在使用前检查此视图是否为非空且类型合适。

在使用之前我应该​​如何检查视图是否属于合适的类型?

我是否应该通过findViewById 检查它是否包含来自适当xml 的一些ID?但它真的会检查“视图是否属于适当的类型”吗?

编辑:到目前为止的答案似乎没有错过我的问题,以便澄清: 是的,我正在使用getItemViewType,但由于我有 3 种类型的视图,所以有时getView 中的convertView 类型错误(不是为getItemViewType 膨胀的视图)并且无法转换为正确的类型- 问题不在于如何检查应该返回哪个视图(这由“bigdestroyer”答案涵盖),而是是否可以重用传递给 getView 的视图(在我的情况下它不能)。

【问题讨论】:

  • 嗯,如果convertView != null,可以重复使用。为什么你说在你的情况下它不能?
  • 不,因为我弄错了 View as convertView。如果您查看learnncode.co/2014/01/21/…,例如对于 VIEW_TYPE_TEXT,我得到的是 R.layout.view_row_type_two 而不是 R.layout.view_row_type_one。
  • 我现在明白了。真奇怪,能把你所有的适配器代码都显示出来吗?
  • 哈,我可能知道出了什么问题,我使用的是github.com/beworker/pinned-section-listview,而不是现有的 Android ListView,而且它似乎有这个错误,无论如何感谢 bigdestroyer,因为感谢你的提示,我知道我做对了这是别人的错:)
  • 不错!希望你能解决^^

标签: android listview android-listview android-arrayadapter findviewbyid


【解决方案1】:

“适当的类型”意味着您必须在getView 方法中检查convertView 的类型才能返回自定义View 或另一个。

您可以覆盖BaseAdaptergetItemViewType 方法。例如:

public int getItemViewType(int position) {

      MyItem item = getItem(position);
      return item.getViewType();

}

和:

public View getView(int position, View convertView, ViewGroup parent) {

     int viewType = getItemViewType(position);

     if (convertView != null) {

         if (viewType == 1) return recycleViewOfType1(position, convertView);
         if (viewType == 2) return recycleViewOfType2(position, convertView);

     }

     else {

         if (viewType == 1) return newViewOfType1(position);
         if (viewType == 2) return newViewOfType2(position);

     }

         return null;         
}

【讨论】:

    【解决方案2】:

    getView() 方法中创建/重用视图之前,您可以使用getItemViewType() 方法来确定视图类型。

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
    int type = getItemViewType(position);
    
    if(type == 1){
    
    }else {
    
    }
    }
    

    查看this教程了解更多信息

    【讨论】:

    • 你可以检查我对问题的编辑,因为我认为这不是答案
    猜你喜欢
    • 1970-01-01
    • 2021-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-27
    • 1970-01-01
    • 2017-11-07
    相关资源
    最近更新 更多