刷新UI

时间:2018-01-02 12:31:52

标签: android android-recyclerview

protected void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  dayRecyclerView = (RecyclerView)findViewById(R.id.recycler_view);
  dayRecyclerView.setHasFixedSize(true);

  layoutManager = new LinearLayoutManager(this);
  dayRecyclerView.setLayoutManager(layoutManager);

  dayRecyclerViewAdapter = new DayRecyclerViewAdapter(DataUtility.getRecords());
  dayRecyclerView.setAdapter(dayRecyclerViewAdapter);
}

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

Android 4.3-5.0中的实施工作正常。但是,当我将应用程序部署到Android 7.0时。我发现UI不知道刷新,除非我退出应用程序并再次启动。

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

**更新:

我试图在onResume()

上添加方法
 @Override
public void onResume() {
    super.onResume();
    dayRecyclerViewAdapter.setDataSet(DataUtility.getRecords());
    dayRecyclerViewAdapter.notifyDataSetChanged();
}

我已经检查过DataUtility.getRecords()可以打印出所有最新记录。但它没有反映在UI上。

3 个答案:

答案 0 :(得分:3)

在Android 4.3到5上,您的活动正在销毁,然后重新创建。因此,当您回来时它反映了数据库的变化。

在Android 7上,更改不会显示,因为您可能正在测试具有足够RAM的手机,以防止系统破坏活动。因此,onCreate方法不会被调用。

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

答案 1 :(得分:0)

这可能是Recycler视图的适配器更新出现问题。尝试在数据更改时调用adapter.notifyDataSetChanged()。这将刷新您的回收者视图,列表将更新

答案 2 :(得分:0)

我建议你使用LiveData

去寻找android架构组件

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

您可以点击此链接了解更多详情

https://medium.com/google-developers/lifecycle-aware-data-loading-with-android-architecture-components-f95484159de4

按照代码段显示如何观察实时数据

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);
    }
}