2010-01-04 128 views
33

我使用SimpleAdapter创建了Android ListView,该项目中的项目多于屏幕中的项目。列表滚动后,我需要获取列表中第一个可见项目的数据模型中的位置。Android ListView:获取可见项目的数据索引

基本上我想要一个功能,如:listView.getChildAt(0).getPositionInDataModel()

Adapter有一些功能,如getItemId(position)看起来很有用;然而,SimpleAdapter实现只是返回传入的位置,而不是像我希望的行ID。

蛮力的解决方案是获取索引0处的视图,并将其与适配器中每个项目的视图进行比较。但是,从适配器获取特定位置的视图似乎并不容易。

任何人有任何想法?

回答

90

这很容易。只需使用ListView.getFirstVisiblePosition() + indexYouWant即可。例如,要获取ListView中显示的第二个孩子的适配器中的位置,只需使用getFirstVisiblePosition() + 1即可。

无需在答复中显示的所有可怕的东西上面:)

+2

哇,我不能相信我错过了。我正在寻找一个这样的功能。一定是因为它是在我没有料到的父类中定义的。仍然习惯了这种javadoc风格... 感谢您指出! – 2010-01-04 21:49:55

+0

@RomainGuy,您保存了我的ListView性能... – 2014-01-28 09:30:48

+0

getFirstVisiblePosition()和getLastVisiblePosition()之间的某些视图在我的Gridview中返回null。我正在回收视图 - 是原因吗?我希望可见的视图保证不为空,特别是因为我可以直观地看到它们不是。 – Laurent 2015-02-27 08:49:39

1
listView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() 
{ 
    public void onItemSelected(AdapterView<?> parent,View view, int pos, long id) 
    { 
     AisleId= parent.getSelectedItemId(); 
    } 
    @Override 
    public void onNothingSelected(AdapterView<?> arg0) { 
     // TODO Auto-generated method stub 
    } 
}); 

在此,我们将获取列表项ID parent.getSelectedItemId();

-1

只需使用getPositionForView(View)see documentation)。这种方法的主要优点是它也适用于项目的后裔View

+1

为什么这是低调?它不工作吗? – 2015-02-26 12:58:56

+0

它只是不回答这个问题 – 2016-02-10 18:38:35