[英]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>
照原樣,廣播接收器未接收到任何消息。
我還會使用任何其他不涉及使用廣播接收器的方法。
您的流程或體系結構不是標准做法。
標准流程應為
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.活動
注冊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); }
在Activity
編寫Receiver
private BroadcastReceiver onNotice= new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // Update your RecyclerView here using notifyItemInserted(position); }};
摘要 : Service
將本地廣播發送到Activity
, Activity
再接收它並使用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.