2016-11-18 2 views
0

Я использую службу обмена сообщениями firebase для обмена сообщениями и уведомлений. Кажется, я не могу передать входящее сообщение от службы к адаптеру, чтобы при получении сообщения его можно было вставить в список RecycleView.Добавить элемент списка в адаптер RecyclerView при получении сообщения Firebase

Я попытался с помощью 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> 

как есть, широковещательный приемник не получает никаких сообщений.

Я также использовал бы любой другой метод, который не предполагает использование широковещательных приемников.

+0

То, что вы дали нам это BroadcastReceiver класс не ваш адаптер. –

+0

Да Адаптер является классом класса BroadCastReceiver. Я отредактирую, чтобы заключить его. – Relm

+0

@RushiAyyappa см. Новое редактирование. – Relm

ответ

5

Поток или архитектура вашего не является стандартной практикой.

Стандартный поток должен быть

  1. Firebase сервис
  2. Некоторые действия или фрагмент с BroadcastReceiver использованием LocalBroadcastManager

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. Написание Receiver в Activity

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

    };

Резюме: Service передает местное вещание на Activity, который в свою очередь, получает его и обновления или добавления элементов с помощью RecyclerView экземпляра

+0

Уже изменил это на это, но примет ваш ответ, пытаясь объяснить, где я ошибся. – Relm

+0

@ Relm Cool. Я рад –

+0

Лучший ответ. Неплохо. –

0

, в случае если вы не хотите использовать BroadCaseReceiver для task.Follow ниже шагов:

Есть две вещи, чтобы отметить здесь.

Во-первых, проверьте, открыто ли действие (активировано) или нет.

i. Когда экран активен (экран виден).

1.В вашем onMessageReceived() сохраняйте полученное сообщение в SQLiteDataBase со временем. 2.создайте метод в своем адаптере, который обновит экран, извлекая данные из SQLiteDB. 3. Теперь, когда получено новое сообщение, вызовите этот метод в классе адаптера.

ii.in случае экран не активен:

1.store принятого сообщения в sqliteDb и показать его в качестве уведомления.

примечание:

1.make, что вы пишете все это в попытке поймать блок. 2. Обязательно синхронизируйте свой SQLiteDB при первом открытии экрана. 3.in случае, если это не поможет вам, пожалуйста, попробуйте этот способ .. Refreshing activity on receiving gcm push notification

+0

Это не проблема. Как адаптер узнает, что сообщение получено? – Relm

+0

вы даже можете создать статический метод в классе адаптера и вызвать этот метод, который будет обновлять данные. –

+0

Вы должны вызвать этот метод в onMessageReceived() –

0

Я думаю, что приведенный выше код работает, потому что техника его подводит имя действия выше дал и один зарегистрированный в манифесте отличается

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

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

дать то же имя, я думаю, что вышеуказанный код будет работать

Смежные вопросы