繁体   English   中英

如何在Broadcast Receiver的onReceive()中使用来自SQLite的数据更新片段UI

[英]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;
    }
}
  1. 检查片段的父活动。 您是否在活动中注册该本地广播接收器,然后进行分段。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM