在编写扩展 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 时,不再需要该参数?如果我的想法是正确的,那么实例化适配器的常见做法是什么,因为知道你会覆盖显示行为呢?
答案 0 :(得分:9)
如果您覆盖getView
,则 NOT 需要指定正确的textViewResourceId
..您可以传入0. ArrayAdapter
尝试的唯一时间访问该ID的位置在getView
之内。由于您要覆盖getView
并提供自己的视图textViewResourceId
永远不会被访问..
由于超类需要视图ID ..你仍然需要将视图ID传递给超级调用..但是,它可以只是0,因为它永远不会被使用
ArrayAdapter Source confirming all of this
如果您未指定正确的textViewResourceId
且未覆盖getView
,则getView
中的ArrayAdapter
会假定您的整个视图为TextView
。如果您的视图不是TextView
..您最终会遇到来自ClassCastException的崩溃..
答案 1 :(得分:0)
您不需要在适配器中使用任何类型的构建。
你可以扩展BaseAdapter并制定自己的规则,显示什么类型的数据等......
事实上,我几乎从未使用Android开箱即用的内置适配器,因为使用baseAdapter非常容易。