簡體   English   中英

在收到Firebase消息時在RecyclerView Adapter中添加列表項

[英]Add list item in RecyclerView Adapter on receiving Firebase message

我正在使用Firebase消息傳遞服務進行消息傳遞和通知。 我似乎無法將傳入的消息從服務傳遞到適配器,以便在收到消息時可以將其插入RecycleView列表中。

我嘗試使用BroacastIntent如下:

public class messaging extends FirebaseMessagingService {

   @Override
   public void onMessageReceived(RemoteMessage m) {
      store(m.getData());
      broadcastIntent();
   }

   public void broadcastIntent() {
      Intent intent = new Intent();
      intent.setAction("com.myApp.CUSTOM_EVENT");
      sendBroadcast(intent);
   }
}

並在Adpter中

public class ConvoAdapter extends RecyclerView.Adapter<ConvoHolder> {

   private List<Message> list;
   private Activity      A;

   public ConvoAdapter(List<Message> data) {

   }

   @Override
   public ConvoHolder onCreateViewHolder(ViewGroup parent, int viewType) {
      View v = LayoutInflater.from(parent.getContext()).inflate(layout, parent, false);
      return new ConvoHolder(v);
   }

   @Override
   public void onBindViewHolder(ConvoHolder h, int Position) {
      final Message M = list.get(Position);
      h.config(A, M);
   }

    @Override
    public int getItemCount() {
       return list.size();
    }

    public class MyReceiver extends BroadcastReceiver {
          @Override
          public void onReceive(Context context, Intent intent) {
             Toast.makeText(context, "Intent Detected.",    Toast.LENGTH_LONG).show();
          }
    }
}

並體現出來。

<receiver android:name=".fragments.chats.ConvoAdapter$MyReceiver"
                  android:enabled="true"
                  android:exported="false" >
            <intent-filter>
                <action android:name="android.intent.action.CUSTOM_EVENT">
                </action>
            </intent-filter>
        </receiver>

照原樣,廣播接收器未接收到任何消息。

我還會使用任何其他不涉及使用廣播接收器的方法。

您的流程或體系結構不是標准做法。

標准流程應為

  1. Firebase服務
  2. 使用LocalBroadcastManager BroadcastReceiver一些活動或片段

1. Firebase服務

public class messaging extends FirebaseMessagingService {

   @Override
   public void onMessageReceived(RemoteMessage m) {
      store(m.getData());
      broadcastIntent();
   }

  public void broadcastIntent() {
      Intent intent = new Intent();
      intent.setAction("com.myApp.CUSTOM_EVENT");
      // We should use LocalBroadcastManager when we want INTRA app
      // communication
      LocalBroadcastManager.getInstance(YOUR_CONTEXT).sendBroadcast(intent);
  }
}

2.活動

  1. 注冊Receiver以從Service廣播

      public void onCreate(Bundle savedInstance) { // REST OF YOUR CODE IntentFilter if= new IntentFilter("com.myApp.CUSTOM_EVENT"); LocalBroadcastManager.getInstance(this).registerReceiver(onMessage, if); } 
  2. Activity編寫Receiver

     private BroadcastReceiver onNotice= new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // Update your RecyclerView here using notifyItemInserted(position); }}; 

摘要Service將本地廣播發送到ActivityActivity再接收它並使用RecyclerView實例更新或添加項目

如果您不想為任務使用BroadCaseReceiver,請執行以下步驟:

這里有兩件事要注意。

首先,檢查活動是否打開(Activel可見)。

一世。 屏幕處於活動狀態時(屏幕可見)。

1.在您的onMessageReceived()中,將接收到的消息隨時間存儲在SQLiteDataBase中。 2.在您的適配器中創建一個方法,該方法將通過從SQLiteDB中獲取數據來更新屏幕。 3.現在,每當收到新消息時,就在Adapter類中調用此方法。

ii。如果屏幕不活動:

1.將收到的消息存儲在sqliteDb中,並顯示為通知。

注意:

1.確保將所有這些都寫在try catch塊中。 2.確保在第一次打開屏幕時同步您的SQLiteDB。 3.如果這對您沒有幫助,請嘗試這種方式。. 收到gcm推送通知時的刷新活動

我認為上面的代碼沒有用,因為上面給定的動作名稱和清單中注冊的動作名稱不同

<action android:name="com.myApp.CUSTOM_EVENT">
                </action>

intent.setAction("com.myApp.CUSTOM_EVENT");

給同一個名字,我認為上面的代碼會工作

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM