为什么ArrayAdapter专门用于TextViews?

时间:2015-08-20 18:22:50

标签: android android-arrayadapter

我正在开发一个Android项目,我们有许多不同的复合数据类型需要自定义数组适配器。我们必须做一些样板类型的东西来反向调整“通用”行为,这允许我们发送这些复合数据类型。

我看了ArrayAdapter的实现,发现了这个:

private View createViewFromResource(int position, View convertView, ViewGroup parent,
        int resource) {
    View view;
    TextView text;

    if (convertView == null) {
        view = mInflater.inflate(resource, parent, false);
    } else {
        view = convertView;
    }

    try {
        if (mFieldId == 0) {
            //  If no custom field is assigned, assume the whole resource is a TextView
            text = (TextView) view;
        } else {
            //  Otherwise, find the TextView field within the layout
            text = (TextView) view.findViewById(mFieldId);
        }
    } catch (ClassCastException e) {
        Log.e("ArrayAdapter", "You must supply a resource ID for a TextView");
        throw new IllegalStateException(
                "ArrayAdapter requires the resource ID to be a TextView", e);
    }

    T item = getItem(position);
    if (item instanceof CharSequence) {
        text.setText((CharSequence)item);
    } else {
        text.setText(item.toString());
    }

    return view;
}

如您所见,ArrayAdapter类专门用于创建具有单个TextView的视图。这在我看来是一个相当大的设计缺陷,因为很明显并非所有ArrayAdapter都只是处理文本。如果我能够修复它,我会将当前的ArrayAdapter实现(处理TextViews)作为更通用的ArrayAdapter的特化。

我错过了什么吗?为什么做出这个设计决定?是否有一些标准或可接受的方式?

1 个答案:

答案 0 :(得分:1)

  

如您所见,ArrayAdapter类专门用于使用单个TextView创建视图。

不,不是。它专门用于处理具有1 + TextView小部件的项目视图,以及可能的其他小部件。

  

在我看来,这是一个相当大的设计缺陷,因为很明显并非所有ArrayAdapter都只处理文本。

ArrayAdapter中没有任何内容将其限制为“仅处理文字”。如果您的项目视图具有零getView()个小部件(或从TextView继承的小部件),则它有一个限制,即您无法使用继承的TextView。理想情况下,ArrayAdapter会检查null窗口小部件并且只是滚动。理想情况下,我会有头发。

其次,在Android首次开发时,有点害羞十年前,主要的ListView内容 “仅...文本”。请记住,十年前的设备处理的CPU只占当今移动设备功耗的百分之几(例如,66MHz单核)。用户界面并不那么复杂。

  

如果我能够修复它,我会将当前的ArrayAdapter实现(处理TextViews)作为更通用的ArrayAdapter的特化。

这称为BaseAdapter

请注意,在RecyclerView世界中, 没有ArrayAdapter等效 - 您正在处理类似于BaseAdapter的内容。

  

为什么做出这个设计决定?

建立自己的时间机器,回到2005-2007,然后向Android开发人员询问他们为什么这样做。否则,我们需要以你正在征求意见的理由来结束这个问题。

  

是否有一些标准或可接受的方式?

或者:

  • 不要链接到继承的getView(),如果它不符合您的需求(没有TextView,需要多个项目视图布局等),或者

  • 允许ArrayAdapter处理一个TextView,同时处理其余部分,或

  • BaseAdapter用于您自己的任意集合,或

  • 使用BaseAdapter的其他子类,无论是来自Android还是第三方,或

  • 切换到RecyclerView