Android 更改配置时Listview项未正确刷新(旋转手机)
我有一个listview,其中包含来自网络的数据源(相当大的列表)。 我所做的是为listview项目提供两种不同的布局(只需移动列表上的一些标签,以利用横向模式下的视图宽度)。 我不想在旋转手机时重新加载我的活动,所以我在清单文件中进行了设置Android 更改配置时Listview项未正确刷新(旋转手机),android,listview,Android,Listview,我有一个listview,其中包含来自网络的数据源(相当大的列表)。 我所做的是为listview项目提供两种不同的布局(只需移动列表上的一些标签,以利用横向模式下的视图宽度)。 我不想在旋转手机时重新加载我的活动,所以我在清单文件中进行了设置 android:configChanges="orientation" 接下来,我还将在活动中实现覆盖方法onConfigurationChanged(),以帮助我使用新的listview项(对于横向模式)更新ListAdapter,如果它处于横向模式
android:configChanges="orientation"
接下来,我还将在活动中实现覆盖方法onConfigurationChanged(),以帮助我使用新的listview项(对于横向模式)更新ListAdapter,如果它处于横向模式(通过检查newConfiguration.orientation)。
我创建这个listadapter,调用notifyDataSetChanged()并调用listview.invalidate()来重新绘制整个listview。
我得到的是一个巨大的惊喜:一些项目被更改为新的listview项目(在横向模式下),而另一些listview项目没有更改
我已经花了很多时间在这件事上,对此我一无所知,请帮助我!
高级版谢谢。您可以尝试通过处理程序在OnConfiguration Changed()中执行任何操作吗 比如:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
handler.sendEmptyMessageDelayed(1,500);
}
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if(msg.what == 1) {
// do your onConfigurationChanged Stuff
}
}
};
在这里,我猜您可能需要在OnConfiguration更改后等待一段时间才能更新您的ListView,android:configChanges=“orientation”通常不是一种方法,在我看来,您的情况也是如此 当我遇到类似问题时,我对的一个非常简单的修复是在
onretainonconfigurationinstance()
中返回listview的数据,并通过调用getLastNonConfigurationInstance()
在onCreate中重新填充列表来使用它。您可以执行一个空检查(以及一个额外的instanceOf以确保安全),在从某处加载数据或只是将getLastNonConfigurationInstance()强制转换为listview的数据变量之间切换逻辑
我的onCreate中的示例代码:
if (getLastNonConfigurationInstance() == null) {
catalogUpdater.start(); // start background task of populating your list's contents variable, in my case tempItems
} else {
tempItems = (ArrayList<WatchListItem>) getLastNonConfigurationInstance();
watchListAdapter = new WatchListItemBaseAdapter(MyActivity.this, tempItems);
...
if(getLastNonConfigurationInstance()==null){
CatalogPDater.start();//开始填充列表内容变量的后台任务,在我的例子中是tempItems
}否则{
tempItems=(ArrayList)getLastNonConfigurationInstance();
watchListAdapter=新的WatchListItemBaseAdapter(MyActivity.this,tempItems);
...
请检查您呼叫notifyDataSetChanged()的位置。这可能发生在调用此函数后,您正在更改listview的数据。实际上,此调用可能不是必需的。因为我已使用旧数据和新listitem创建了一个新适配器,但我确实在设置list adapter后立即调用了它。请发布代码,以便我们能够了解发生了什么,因为有时是相同的ArrayList(Collection)一个是适配器,从中删除项目,另一个是再次添加。抱歉@adeelperviz,我在一家私人公司工作:)他们有一个所谓的保密协议。我能说的是,我的listview是正常的,它的数据源是ArrayList,我的ListAdapter是从ArrayListAdapter定制的,这就是我所能说的。我会试试这个。但我实际上调用了重新绘制方法(UI线程中的listview.invalidate()),所以我认为这不是线程问题。谢谢@Saurabh Verma,我做到了。我第一次使用这个按钮;)谢谢,我很欣赏你的想法,但在我的情况下,这不仅仅是为listview保存数据的问题,也是建立服务器连接和初始化后台服务的问题。这些都是昂贵的操作,无论是时间还是时间所以我选择了一种不让我的活动被重新加载的方式。另一种方式可能是创建你自己的对象,它可以保存你在设备旋转时需要保存的所有内容(列表视图项、http对象或其他)同样地继续。如果你正确地实现后台服务,它不会在设备轮换时重新启动,所以你只需要将值重新附加到变量。我不知道这对你来说是容易还是难,但至少根据我读到的大部分内容,这应该是推荐的方法。祝你好运:)