4

我有一个 ListView,它显示来自 ArrayAdapter 的项目。我想在单击时为视图设置动画。问题是在不同版本的android上我得到不同的视图(见下文)

我正在使用此方法从 ListActivity 获取视图:

private View getViewForListPosition(int position) {

    int firstPosition = mList.getFirstVisiblePosition() - mList.getHeaderViewsCount();
    int wantedChild = position - firstPosition;

    ZLog.d(LOG,"getViewForListPosition , position : " + position + ", wantedChild : " + wantedChild + ", view hash : " +mList.getChildAt(wantedChild).hashCode());

    for(int i = mList.getChildCount(); i>0; i--){
        ZLog.d(LOG, "pos : " + (i-1) + ", hash : " +mList.getChildAt(i-1).hashCode());
    }

    return mList.getChildAt(wantedChild);
}

所以在 Android 4.0.3 和 4.2.2 手机上我得到:

getViewForListPosition , position : 3, wantedChild : 3, view hash : 1101734248

pos : 5, hash : 1104109360
pos : 4, hash : 1104254936
pos : 3, hash : 1101734248
pos : 2, hash : 1104876880
pos : 1, hash : 1104862296
pos : 0, hash : 1104793008

然后当单击项目时,我的适配器getView方法为每个视图运行:

getView, position : 0, convertView is notnull, cv hash1104793008
getView, position : 1, convertView is notnull, cv hash1104862296
getView, position : 2, convertView is notnull, cv hash1104876880
getView, position : 3, convertView is notnull, cv hash1101734248
getView, position : 4, convertView is notnull, cv hash1104254936
getView, position : 5, convertView is notnull, cv hash1104109360

所以你可以看到一切都很好并且按预期工作。但是,当我在 Android 2.2 上运行它时,我得到的结果是:

getViewForListPosition , position : 3, wantedChild : 3, view hash : 1205607672

pos : 5, hash : 1205730120
pos : 4, hash : 1205712904
pos : 3, hash : 1205607672
pos : 2, hash : 1206547728
pos : 1, hash : 1206483960
pos : 0, hash : 1207864856

getView, position : 0, convertView is notnull, cv hash1205730120
getView, position : 1, convertView is notnull, cv hash1205712904
getView, position : 2, convertView is notnull, cv hash1205607672
getView, position : 3, convertView is notnull, cv hash1206547728
getView, position : 4, convertView is notnull, cv hash1206483960
getView, position : 5, convertView is notnull, cv hash1207864856

所以您可能已经注意到getViewForListPosition,我会返回适配器用于位置 2 的视图

您可能还注意到Adapter.getViewListView.getChildAt正在以相反的顺序返回项目,这会导致此问题。这种行为的原因可能是什么?(我没有在我的适配器中做任何花哨的事情)

我会感谢任何提示。谢谢!

4

1 回答 1

3

好的。所以这就是正在发生的事情:

在一个干净的情况下,ListView当我注册onItemClickListener并执行点击时,不调用视图的适配器getView方法。这是我所期望的。

如果我设置 amList.setChoiceMode(ListView.CHOICE_MODE_SINGLE)这会使getView方法在单击注册后立即运行。这也是意料之中的。

但是 2.2 和 4+ 版本之间的区别在于:在 2.2 上:当此刷新发生时getView,在 4+(可能是 API 11+)上的反向视图列表(请参阅我的问题)上getView运行:按列表的正常顺序运行

最有趣的部分是,当我将 getViewForListPosition 的调用延迟 10 毫秒时,一切正常,并且适配器具有正确的视图列表(再次正常顺序)。因此,似乎视图的顺序仅在适配器刷新期间反转CHOICE_MODE_SINGLE

为了解决这个问题,我没有将 listview 模式更改为CHOICE_MODE_SINGLE这样适配器在单击期间不会触发。我自己在里面为点击的项目设置了背景/图形onItemClicked

希望它可以节省一些时间:)

于 2013-04-04T11:54:32.240 回答