2015-12-02 33 views
1

我在Android項目中,我試圖通過整合框架Cometd提供PUSH服務工作更改的適配器。 現在,每當一個Conversation新郵件到達時,我想告訴ChatMessagesActivity其中包含兩個用戶之間的郵件列表。現在安卓通知數據集已經從一個靜態方法

,當另一用戶將消息發送到Android應用,我想更新用戶的視圖。我想這樣做,通過對adapter調用notifyDataSetHasChanged(),但因爲我是View線程之外調用它,我得到一個錯誤。

該方法是靜態的,因爲在Conversation類中接收到新消息,而類ChatMessagesActivity中的消息正在繼續。爲了在兩個類之間進行通信,我創建了2個靜態方法,它們像發送接收消息的雙向橋一樣工作。

我希望我是清楚的,如果有任何疑問,請讓我知道。

ChatMessagesActivity.java:

public class ChatMessagesActivity extends ApplicationDrawerLoader { 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_chat_messages); 

     chatList = (ListView)findViewById(R.id.chatList); 

new getPrivateChatsForUser(this).execute(); 

} 

// IN the method below, I receive information from another activity. 

    public static void recieveUpdatedMessage(String channelName, Map<String, Object> input){ 
Boolean found = Arrays.asList(channelName.split(" ")).contains("chat"); 
     if(found){ 
      int processedChannelName = Integer.valueOf(channelName.replace("/chat/","")); 
      if(processedChannelName == groupAccountId){ 

// Here i tried calling adapter.NotifyDataSetchanged();.. Didn't fly. 

      } 
     } 
} 

// Async method retrieving messages. 
    public class getPrivateChatsForUser extends AsyncTask<Void, Void, ResponseEntity<RestReplies[]>> { 

     ChatMessagesActivity chatMessagesActivity = null; 

     getPrivateChatsForUser(ChatMessagesActivity chatMessagesActivity) { 
      this.chatMessagesActivity = chatMessagesActivity; 
     } 
@Override 
     protected ResponseEntity<RestReplies[]> doInBackground(Void... params) { 
// network connection related stuff, not relevant to problem 
} 
@Override 
     protected void onPostExecute(ResponseEntity<RestReplies[]> responseEntity) { 
      super.onPostExecute(responseEntity); 
      RestReplies[] restRepliesArray = responseEntity.getBody(); 
      Collections.addAll(restRepliesList, restRepliesArray); 

      ArrayList<HashMap<String, String>> chatMessagesHashMapList = new ArrayList<HashMap<String, String>>(); 

      for (RestReplies restReplies : restRepliesList) { 
       HashMap<String, String> chatMap = new HashMap<>(); 
       chatMap.put(chatText, restReplies.getReplyText()); 
       chatMap.put(firstName, restReplies.getReplyingPersonName()); 
       chatMap.put(chatImage, restReplies.getSenderImage()); 
       chatMap.put(privateChannel,"/service/person/"+String.valueOf(conversationId)); 
       chatMessagesHashMapList.add(chatMap); 
      } 

      chatList = (ListView) findViewById(R.id.chatList); 

      chatMessagesAdapter = new ChatMessagesAdapter(chatMessagesActivity, chatMessagesHashMapList); 

      chatList.setAdapter(chatMessagesAdapter); 

      chatList.scrollTo(0, chatList.getHeight()); 

     } 
    } 

所以,我應該怎麼指示的數據集已被更改。而如何在適配器知道在哪裏以及如何獲得數據集已更改。任何人都可以幫助我解決這個問題。非常感謝... :-)

回答

1

使用廣播接收器,在您的適配器和火的Android LocalBroadcast本地廣播在您的推送服務

private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 

     if(intent.getAction().equals("MYREFRESH")) 
     { 
      notifiyDataSetChanged(); 
     } 
    } 
}; 

在構造函數中的適配器註冊此reciever

IntentFilter intentFilter = new IntentFilter(); 
intentFilter.addAction("MYREFRESH"); 
LocalBroadcastManager.getInstance(context).registerReceiver(broadReceiver, intentFilter); 

在你推,如果你得到一個推送通知觸發此

Intent intent = new Intent(); 
intent.putExtra(...) //send any data to your adapter 
Intent.setAction("myaction"); 
LocalBroadcastManager.getInstance(context).sendBroadcast(intent); 
+0

這聽起來很花哨,很遺憾我沒有在Android的工作了,然後2周。你能否告訴我我該如何實現這一目標?謝謝。 –

+0

對不起,這個不好的代碼..我把它從移動 –

+0

修復你的答案格式。現在檢查。謝謝。 –