[英]How to update fragment UI with data from SQLite in the onReceive() of Broadcast Receiver
我有一个Firebase服务,当出现新通知且应用程序位于前景时,我使用LocalBroadcastManager发送广播以从SQLite获取数据并更新Fragment UI(Recycler视图)。 我进行了交叉检查,以查看广播接收器实际上正在发送广播,因为我可以登录以查看我添加到该意图中的字符串额外内容。 我有一个updateUI()方法,该方法将从SQLite获取结果并更新UI。
我已经交叉检查了我的updateUI()是否可以单独运行(即使我没有广播接收器也可以在onResume()中调用它)。
但是我的问题是,更新广播接收器的onReceive()中的UI似乎不起作用。
这是我的片段及其实现方式的摘录。
public class NoticeListFragment extends Fragment{
@Override
public void onResume() {
super.onResume();
updateUI(); //In case data changes
LocalBroadcastManager.getInstance(getActivity()).registerReceiver(mNoticeBroadcastReceiver,
new IntentFilter("com.ultrasamad.htmcinside.NEW_NOTICE"));
}
@Override
public void onPause() {
super.onPause();
LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(mNoticeBroadcastReceiver);
}
BroadcastReceiver mNoticeBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
//Check for intent filter
if(intent.getAction().equals("com.ultrasamad.htmcinside.NEW_NOTICE")){
//New notice has arrived, update UI
String noticeTitle = intent.getStringExtra("message");
Log.d(TAG, "Notice Title: " + noticeTitle);
updateUI(); //Seems not to be working....
}
}
};
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
//Inflate layout for this fragment
View rootView = inflater.inflate(R.layout.fragment_notice_list, container, false);
recyclerView = (RecyclerView) rootView.findViewById(R.id.rv_recycler_view);
recyclerView.setHasFixedSize(true);
LinearLayoutManager linearManager = new LinearLayoutManager(getActivity());
recyclerView.setLayoutManager(linearManager);
updateUI();
return rootView;
}
private void updateUI(){
NoticeSource noticeSource = NoticeSource.get(getActivity());
List<NoticeItem> notices = noticeSource.getNotices();
if(mNoticeListAdapter == null){
mNoticeListAdapter = new NoticeListAdapter(notices);
recyclerView.setAdapter(mNoticeListAdapter);
}else{
mNoticeListAdapter.setNotices(notices);
mNoticeListAdapter.notifyDataSetChanged();
}
}
}
在我创建广播的Firebase Messaging的onReceive()中。
Intent pushNotification = new Intent("com.ultrasamad.htmcinside.NEW_NOTICE");
pushNotification.putExtra("message", noticeTitle);
LocalBroadcastManager.getInstance(this).sendBroadcast(pushNotification);
要求的适配器类。
private class NoticeListAdapter extends RecyclerView.Adapter<NoticeViewHolder>{
private List<NoticeItem> listItems;
private NoticeListAdapter(List<NoticeItem> data) {
this.listItems = data;
}
@Override
public NoticeViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.notice_lists_card, parent, false);
return new NoticeViewHolder(view);
}
@Override
public void onBindViewHolder(NoticeViewHolder holder, int position){
final NoticeItem noticeItem = listItems.get(position);
holder.bindNotice(noticeItem);
}
@Override
public int getItemCount() {
return listItems.size();
}
private void setNotices(List<NoticeItem> notices){
listItems = notices;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.