Android 刷新用户界面

Android 刷新用户界面,android,android-recyclerview,Android,Android Recyclerview,上面的代码是应用程序的主要活动。启动时,应用程序会根据从方法DataUtility.getRecords()获取的数据的ArrayList显示一个RecyclerView。数据可能会不时更新。每当我将应用程序从后台切换回前台时,UI都会刷新 该实现在Android 4.3-5.0中运行良好。但是,当我将应用程序部署到Android 7.0时。我发现UI不知道刷新,除非我退出应用程序并再次启动 这里有什么问题?当我将应用程序从后台切换到前台时,如何强制应用程序刷新 **更新: 我已尝试添加onRe

上面的代码是应用程序的主要活动。启动时,应用程序会根据从方法
DataUtility.getRecords()
获取的数据的
ArrayList
显示一个
RecyclerView
。数据可能会不时更新。每当我将应用程序从后台切换回前台时,UI都会刷新

该实现在Android 4.3-5.0中运行良好。但是,当我将应用程序部署到Android 7.0时。我发现UI不知道刷新,除非我退出应用程序并再次启动

这里有什么问题?当我将应用程序从后台切换到前台时,如何强制应用程序刷新

**更新:

我已尝试添加onResume()方法


我已经检查过DataUtility。getRecords()可以打印出所有最新的记录。但它不会反映在用户界面上。

在Android 4.3到5上,您的活动会被销毁,然后重新创建。因此,当您返回时,它会反映数据库的更改

在安卓7上,这些更改不会显示出来,因为您可能正在一部具有足够ram的手机上进行测试,以防止系统破坏活动。因此,
onCreate
方法不会被调用

解决方案:
检查
onResume
方法中的数据库更改,如果有更改,请在更新适配器中的数据后通知适配器。

在Android 4.3到5上,您的活动将被销毁,然后重新创建。因此,当您返回时,它会反映数据库的更改

在安卓7上,这些更改不会显示出来,因为您可能正在一部具有足够ram的手机上进行测试,以防止系统破坏活动。因此,
onCreate
方法不会被调用

解决方案:
onResume
方法中检查数据库更改,如果有更改,请在更新适配器中的数据后相应地通知适配器。

这可能是Recycler视图的适配器更新问题。当数据更改时,尝试调用适配器notifyDataSetChanged()。这将刷新您的recycler视图,列表将得到更新

这可能是recycler视图的适配器更新有问题。当数据更改时,尝试调用适配器notifyDataSetChanged()。这将刷新您的回收器视图,列表将得到更新

我建议您使用LiveData选择android架构组件

LiveData是一个可观察的数据持有者类。与常规可观察的应用程序不同,LiveData具有生命周期意识,这意味着它尊重其他应用程序组件(如活动、片段或服务)的生命周期。这种意识确保LiveData只更新处于活动生命周期状态的应用程序组件观察员

您可以通过链接了解更多详细信息

在代码片段后面显示如何观察实时数据

 @Override
public void onResume() {
    super.onResume();
    dayRecyclerViewAdapter.setDataSet(DataUtility.getRecords());
    dayRecyclerViewAdapter.notifyDataSetChanged();
}
公共类名称活动扩展了AppCompative活动{
私有名称视图模型mModel;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//设置活动的其他代码。。。
//获取ViewModel。
mModel=ViewModelProviders.of(this.get)(NameViewModel.class);
//创建更新UI的观察者。
最终观察员名称观察员=新观察员(){
@凌驾
公共void onChanged(@Nullable final String newName){
//更新UI,在本例中为TextView。
mNameTextView.setText(newName);
}
};
//观察LiveData,作为LifecycleOwner和observer传入此活动。
mModel.getCurrentName().observe(this,nameObserver);
}
}

我建议您使用LiveData开发android架构组件

LiveData是一个可观察的数据持有者类。与常规可观察的应用程序不同,LiveData具有生命周期意识,这意味着它尊重其他应用程序组件(如活动、片段或服务)的生命周期。这种意识确保LiveData只更新处于活动生命周期状态的应用程序组件观察员

您可以通过链接了解更多详细信息

在代码片段后面显示如何观察实时数据

 @Override
public void onResume() {
    super.onResume();
    dayRecyclerViewAdapter.setDataSet(DataUtility.getRecords());
    dayRecyclerViewAdapter.notifyDataSetChanged();
}
公共类名称活动扩展了AppCompative活动{
私有名称视图模型mModel;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//设置活动的其他代码。。。
//获取ViewModel。
mModel=ViewModelProviders.of(this.get)(NameViewModel.class);
//创建更新UI的观察者。
最终观察员名称观察员=新观察员(){
@凌驾
公共void onChanged(@Nullable final String newName){
//更新UI,在本例中为TextView。
mNameTextView.setText(newName);
}
};
//观察LiveData,作为LifecycleOwner和observer传入此活动。
mModel.getCurrentName().observe(this,nameObserver);
}
}

为适配器实现notifydatachanged方法可能会起作用如何立即刷新应用程序?除了
onCreate()
?为适配器实现notifydatachanged方法可能会起作用如何立即刷新应用程序,我看不到任何生命周期方法实现?除了
onCreate()
,我看不到任何生命周期方法实现?你的意思是在onResume()方法中调用adapter.notifyDataSetChanged()之类的东西吗?adapter.notifyDataSetChanged不会检查数据库的更新。您需要在onResume(最小代码更改)中手动执行此操作,或者使用Room with LiveData(推荐)。我已手动检查了数据库,然后更新了ArrayList,并将数据再次设置为适配器。但是,它不会刷新…:(您是否进行了更改并将代码转换为
public class NameActivity extends AppCompatActivity {

    private NameViewModel mModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Other code to setup the activity...

        // Get the ViewModel.
        mModel = ViewModelProviders.of(this).get(NameViewModel.class);

        // Create the observer which updates the UI.
        final Observer<String> nameObserver = new Observer<String>() {
            @Override
            public void onChanged(@Nullable final String newName) {
                // Update the UI, in this case, a TextView.
                mNameTextView.setText(newName);
            }
        };

        // Observe the LiveData, passing in this activity as the LifecycleOwner and the observer.
        mModel.getCurrentName().observe(this, nameObserver);
    }
}