2012-12-13 73 views
5

虽然编写我自己的适配器扩展了ArrayAdapter类,但我发现了不同的构造函数,我注意到它们都需要一个textViewResourceId参数。所以一开始,我决定,我会养活我的自定义适配器类android.R.id.text1:我在开发过程中是否始终需要textViewResourceId参数?

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时,该参数不再必要?如果我的想法是正确的,那么知道你将重写显示行为的实例化适配器的常见做法是什么?

回答

9

如果您正在覆盖getView你做需要指定一个合适的textViewResourceId。您可以在0中传递的唯一一次ArrayAdapter试图访问ID是内getView。既然要覆盖getView并提供您自己的视角textViewResourceId永远不会被访问.. 由于超类预计视图ID ..您仍然需要将视图ID传入超级调用..但是,它可以只是0,因为它永远不会被使用

ArrayAdapter Source confirming all of this

如果您不指定适当textViewResourceId并不会覆盖getView ... getViewArrayAdapter假设你的整个观点是TextView。如果你的观点是不是TextView ..你会从一个ClassCastException落得崩溃..

+0

(upvote)而不是传递0,我会使用一个不需要'textViewResouceId'的构造函数。 – Sam

+0

@Sam - 如果你想使用ArrayAdapter,你需要传递textViewResourceId。没有避免,因为它期望它(即使它无效)。您可以复制源代码并重写ArrayAdapter,使其不需要textViewResourceId。但是,为了简单地避免传递一个int,其实并不值得。 – dymmeh

+0

@Sam - 或者你可以创建自己的适配器来扩展BaseAdapter。你不会得到内置的数组处理,所以你需要自己做。但是,您可以根据自己的需要自定义它,并在处理阵列的基本功能中构建 – dymmeh

0

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

可以扩展BaseAdapter做出什么来证明自己的规则,持有什么类型的数据等等

事实上,我几乎从来没有使用内置在适配器的android了出来的框,因为使用baseAdapter非常简单。