Java ListAdapter.getView和ListView.getChildAt之间的差异

Java ListAdapter.getView和ListView.getChildAt之间的差异,java,android,Java,Android,我的应用程序的UI有一个列表视图来显示推文的时间线,并设置一个onitmlongClickListener来显示另一个带有多个按钮的视图(“回复”、“转发”、“收藏”等)。在适配器的getView()方法中 我想要什么:在我的测试项目中,我想通过长时间单击时间线中的第一项,然后单击其中一个按钮来测试此功能 代码部分如下所示: timelineList.getChildAt(0).performLongClick(); favoriteBtn = (ToggleButton)timelineLis

我的应用程序的UI有一个列表视图来显示推文的时间线,并设置一个
onitmlongClickListener
来显示另一个带有多个按钮的视图(“回复”、“转发”、“收藏”等)。在适配器的
getView()方法中

我想要什么:在我的测试项目中,我想通过长时间单击时间线中的第一项,然后单击其中一个按钮来测试此功能

代码部分如下所示:

timelineList.getChildAt(0).performLongClick();
favoriteBtn = (ToggleButton)timelineList.getAdapter().getView(0, null, timelineList).findViewById(cse.ust.twittermap.R.id.favorite);
favoriteBtn.performClick();
favoriteBtn.performClick();
timelineList.getChildAt(0).performLongClick();
这是可行的,但当我尝试将第二行更改为:

timelineList.getChildAt(0).findViewById(cse.ust.twittermap.R.id.favorite);
测试项目抛出NullPointer异常,因为
findViewById()
返回null

我的问题:ListAdapter#getView()
和ListView#getChildAt()之间的区别是什么


它们似乎都可以返回对列表中项目视图的引用,但显然它们之间应该有一些区别。我还想弄清楚为什么第二行中的
getChildAt()
方法无法通过ID查找视图

getChildAt不是
列表视图的专用方法。它为每个
视图组
(可以有子视图)实现

创建
列表视图时,它没有子项。调用其适配器的
getView
方法不会改变这一事实,也不会添加任何子级

只有在对活动的内容进行测量和布局时,
ListView
才会通过反复调用其适配器的
getView
方法并将返回的
视图添加到自己的子视图列表中来开始创建子视图。只有在这之后,
ListView.getChildAt(x)
才能返回一些非空值

ListAdapter.getView
方法代表ListView/GridView/等返回全新的
视图(或仅返回回收的
视图
)。您的代码不应调用
ListAdapter.getView
本身(除非您进行单元测试)


ListView.getChildAt
返回一个已经创建的
视图(先前由
ListAdapter.getView
代表
ListView
创建)注意,
ListAdapter
可以定义许多列表项(由
getCount
返回的值),但是,承载适配器的
列表视图
的子项永远不会超过屏幕上任何给定时间可见的子项。例如,您的
ListAdapter
可以处理1000个列表项,但您的
ListView
的子视图永远不会超过6个(当然,这取决于屏幕和ListView项的大小)。

如何在ListView中获取所选项的视图?“ListView.getSelectedView();”或者当您有适配器的位置时(在适配器数据列表中的位置):“listView.getChildAt(位置-listView.getFirstVisiblePosition());”