假设一个列表有4个项目,如何从列表的每个菜单项中按位置获取视图?
答案 0 :(得分:1)
不幸的是,ListView中的项目通常只是那些可见的项目。你应该迭代使用ListAdapter。
例如,在我的一些代码中,我有这个:
SimpleCursorAdapter adapter = (SimpleCursorAdapter) this.getListAdapter();
int iNum = adapter.getCount();
for(int i=0; i<iNum; i++)
{
Cursor c = (Cursor) adapter.getItem(i);
// Now you can pull data from the cursor object,
// if that's what you used to create the adapter to start with
}
修改强>
为了回应jeffamaphone的评论,这里有其他的东西......如果你正在尝试使用每个UI元素,那么getChildAt
肯定更合适,因为它返回子项的视图,但一般来说你仍然只能与那些当时可见的人合作。如果您只关心这一点,那么很好 - 只需确保在通话结束时检查null
。
如果您正在尝试实现类似于我的内容 - 对于可能超出屏幕的列表的“选择全部/选择无/反转选择”类型的功能,那么您最好在适配器中进行更改,或者有一个外部数组(如果在我的情况下,适配器中没有任何地方可以生成chagne),然后在列表适配器上调用notifyDataSetChanged()
。例如,我的“反转”功能的代码如下:
case R.id.selectInvertLedgerItems:
for(int i=0; i<ItemChecked.length; i++)
{
ItemChecked[i] = !ItemChecked[i];
}
la.notifyDataSetChanged();
RecalculateTotalSelected();
break;
请注意,在我的情况下,我还使用自定义ListView子项,使用adapter.setViewBinder(this);
和自定义setViewValue(...)
函数。
此外如果我没记错的话,我不认为列表中的“位置”必然与适配器中的“位置”相同......它再次基于更多列表中的位置。因此,即使您想要列表中的“第50个”项目,如果它是第一个可见的,getChildAt(50)
也不会返回您期望的内容。我认为您可以使用ListView.getFirstVisiblePosition()
进行帐户调整。
答案 1 :(得分:0)