Android 如何在广播接收器的onReceive()中使用来自SQLite的数据更新片段UI
我有一个Firebase服务,当新通知出现并且应用程序在前台时,我使用LocalBroadcastManager发送广播,从SQLite获取数据并更新片段UI(Recycler视图)。 我已经交叉检查了一下,看看广播接收器是否真的在发送广播,因为我可以通过日志查看我添加到intent中的字符串extras。我有一个updateUI()方法,它将从SQLite获取结果并更新UI 我已经反复检查了updateUI()是否能够独立工作(如果我在onResume()中调用它,即使没有广播接收器) 然而,我的问题是更新广播接收器的onReceive()中的UI似乎不起作用 下面是我的片段摘录以及我是如何实现它的Android 如何在广播接收器的onReceive()中使用来自SQLite的数据更新片段UI,android,android-fragments,broadcastreceiver,android-sqlite,Android,Android Fragments,Broadcastreceiver,Android Sqlite,我有一个Firebase服务,当新通知出现并且应用程序在前台时,我使用LocalBroadcastManager发送广播,从SQLite获取数据并更新片段UI(Recycler视图)。 我已经交叉检查了一下,看看广播接收器是否真的在发送广播,因为我可以通过日志查看我添加到intent中的字符串extras。我有一个updateUI()方法,它将从SQLite获取结果并更新UI 我已经反复检查了updateUI()是否能够独立工作(如果我在onResume()中调用它,即使没有广播接收器) 然而,
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();
}
}
}
适配器类
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;
}
}
私有类NoticeListAdapter扩展了RecyclerView.Adapter{
私人物品清单;
专用通知StatAdapter(列表数据){
this.listItems=数据;
}
@凌驾
公共通知onCreateViewHolder上的ViewHolder(视图组父级,int-viewType){
View=LayoutInflater.from(parent.getContext())
.充气(R.layout.notice\u list\u card,parent,false);
返回新的NoticeViewHolder(视图);
}
@凌驾
BindViewHolder上的公共无效(NoticeViewHolder,内部位置){
final NoticeItem NoticeItem=listItems.get(位置);
持有人通知(noticeItem);
}
@凌驾
public int getItemCount(){
返回listItems.size();
}
私人通知(列表通知){
列表项目=通知;
}
}
如果从firebase广播发送时接收到意图,是否尝试登录onReceive?另外,在onPause中:LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(mNoticeBroadcastReceiver);。当活动暂停时,您正在注销广播,您确定在收到数据时未注销广播吗?Yh…我可以登录以查看附加信息,以证明广播正常。对于否决我问题的人,我很高兴知道原因。在适配器中的private void setNotices。添加Log.e(“tag”,“size:+notices.size());粘贴到这里我已经指出,我认为广播工作得很好,只是我似乎无法用SQLite的数据更新UI。
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;
}
}