列表视图选择不是';Android jellybean上显示的t

列表视图选择不是';Android jellybean上显示的t,android,listview,android-4.2-jelly-bean,Android,Listview,Android 4.2 Jelly Bean,我有一个listview,它已经按预期工作了一段时间。最近,一位用户将他们的设备软件更新为JellyBean,而现在按下listview选项时不会更新 在后台,onTouchEvent()方法启动(然后适配器的onItemClick())并将选择设置为“在引擎盖下”,它不会显示为已选择。但是,如果设备现在已旋转且方向已更改,则选择高亮显示在重画上 我搜索了其他问题,找到的最接近的问题是一个被重写的onAttachedToWindow()方法,并且没有调用它的超级实现,但是这里不是这样 有没有其他

我有一个listview,它已经按预期工作了一段时间。最近,一位用户将他们的设备软件更新为JellyBean,而现在按下listview选项时不会更新

在后台,onTouchEvent()方法启动(然后适配器的onItemClick())并将选择设置为“在引擎盖下”,它不会显示为已选择。但是,如果设备现在已旋转且方向已更改,则选择高亮显示在重画上

我搜索了其他问题,找到的最接近的问题是一个被重写的onAttachedToWindow()方法,并且没有调用它的超级实现,但是这里不是这样


有没有其他人在JellyBean上看到过类似的问题,并且知道解决方案?

在每个选项上都添加了对adapter.notifyDataSetChanged()的调用


这并不理想,因为我怀疑大型数据集的性能会受到影响。

解决此问题的更好方法是使用listview的invalidateViews()函数

ListView.invalidateViews()用于通知ListView使其所有子项视图无效(重新绘制它们)。WhileAdapter.notifyDataSetChanged(),是告诉适配器的观察者正在调整的内容已更改

在这种情况下,ListView.invalidateViews()似乎是一个更好的选择,因为您的数据集没有更新,您只需要重新绘制视图

在OnItemClick中插入listview.invalidateViews(),就可以开始了

public void onItemClick(AdapterView<?> av, View v, int position,long id) {
            // TODO Auto-generated method stub
                    listview.invalidateViews();
            /*  YOUR   CODE 
                                GOES   HERE    */          
        }
    });
public-void-onItemClick(适配器视图av、视图v、内部位置、长id){
//TODO自动生成的方法存根
listview.invalidateViews();
/*你的代码
到这里来*/
}
});

您也可以对GridView使用相同的函数。

您尝试过通过invalidate强制listview重画吗?是的,我尝试过invalidate()、refreshDrawableState()和forceLayout()。没有任何效果。在多玩一点之后,adapter.notifyDataSetChanged()似乎会强制刷新,但我的印象是,出于性能原因,这应该只在插入或删除后调用,为什么每次都需要这样做?您如何支持listview数据?用装载机还是别的什么?