We are Borg
We are Borg

Reputation: 5313

Android : Inform adapter that data-set has changed from a static method

I am working on an Android project in which I am trying to integrate PUSH service offered by Cometd framework. Now, whenever a new message arrives for a Conversation, I would like to inform ChatMessagesActivity which contains the list of messages between the two users.

Now, when the other user sends a message to the Android app, I would like to update the view of the user. I tried doing that by calling notifyDataSetHasChanged() on the adapter, but because I was calling it outside of View thread, I am getting an error.

The method is static, because new messages are received in Conversation class, while the messages are going-on in ChatMessagesActivity class. For communication between both classes, I have created 2 static methods which act like a bi-directional bridge for sending & receiving messages.

I hope I was clear, if there are any doubts, kindly let me know.

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());

        }
    }

So, how should I instruct that the data-set has been changed.. And how does the adapter knows where and how to get the data-set which has changed. Can anyone help me with this problem. Thanks a lot... :-)

Upvotes: 1

Views: 110

Answers (2)

Prasanna Anbazhagan
Prasanna Anbazhagan

Reputation: 1735

Use broadcast receiver at your adapter and fire a local broadcast with android LocalBroadcast in your push service

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

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

In your constructor in adapter register this reciever

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

In your push if you get a push notification trigger this

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

Upvotes: 1

Budius
Budius

Reputation: 39846

The way to deal with this is using a broadcast or bus pattern. You can use some good bus libraries such as http://square.github.io/otto/ or a LocalBroadcast

This past answer from me shows how to use the LocalBroadcast system: Refreshing fragments in FragmentActivity after sync service runs

Upvotes: 0

Related Questions