5

在编写我自己的扩展ArrayAdapter类的适配器时,我遇到了可用的不同构造函数,我注意到它们都需要一个textViewResourceId参数。所以最初,我决定提供我的自定义适配器类android.R.id.text1

MyAdapter adapter = new MyAdapter(this, R.layout.myRow, android.R.id.text1);

然而,后来在我的开发过程中,我决定在我想要的地方覆盖getView方法

TextView label = (TextView) myRow.findViewById(android.R.id.text1);
label.setText("Position #" + position);

效果很好。但是后来想到了这个问题:如果我正在执行如何显示行的逻辑,那么在我启动自定义适配器时是否真的有必要向构造函数提供textViewResourceId ?还是当您覆盖getView时,不再需要该参数?如果我的想法是正确的,那么在知道您无论如何都会覆盖显示行为的情况下,实例化适配器的常见做法是什么?

4

2 回答 2

9

如果您要覆盖getView,则不需要指定适当的textViewResourceId.. 您可以传入 0。ArrayAdapter尝试访问该 ID 的唯一时间是在getView.. 由于您正在覆盖getView并提供自己的视图textViewResourceId永远不会访问.. 因为超级类需要一个视图 ID。您仍然需要将视图 ID 传递给 super 调用。但是,它可以只是 0,因为它永远不会被使用

ArrayAdapter Source 证实了这一切

如果您没有指定正确的textViewResourceId并且没有覆盖getView..假设您getViewArrayAdapter整个视图是TextView.. 如果您的视图不是TextView.. 您最终会因 ClassCastException 崩溃..

于 2012-12-13T22:00:29.883 回答
0

您不需要使用任何类型的内置适配器。

你可以扩展BaseAdapter并制定你自己的规则来显示什么,保存什么类型的数据等等......

事实上,我几乎从不使用 android 开箱即用的内置适配器,因为使用 baseAdapter 非常简单。

于 2012-12-13T22:45:27.773 回答