我构建了一个Chat,它从Json文件中获取所有数据,
我遇到的问题是,当有人发送消息时,聊天需要自动更新。我搜索了很多关于我的问题,我发现有可能做我正在尝试调用notifyDataSetChanged。
我尝试在我的代码上实现它,但我无法得到任何结果,你能帮助我吗?
我的代码(我删除了一些不必要的变量):
public class ChatRoomActivity extends ListActivity {
// contacts JSONArray
JSONArray contacts = null;
// Hashmap for ListView
ArrayList<HashMap<String, String>> contactList;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_chatroom);
String userimage = intent.getStringExtra("image");
send = (ImageButton) findViewById( R.id.send );
txtmessage = (EditText) findViewById( R.id.txtmessage );
userphoto = (ImageButton) findViewById( R.id.userphoto );
contactList = new ArrayList<HashMap<String, String>>();
lv = getListView();
call();
}
private void call() {
task = new GetContacts();
task.execute(id);
}
/**
* Async task class to get json by making HTTP call
* */
private class GetContacts extends AsyncTask<String, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
// Showing progress dialog
pDialog = new ProgressDialog(ChatRoomActivity.this);
pDialog.setMessage("Please wait...");
pDialog.setCancelable(false);
pDialog.hide();
}
protected Void doInBackground(String... arg0) {
String getinfo = (String)arg0[0];
// Creating service handler class instance
ServiceHandler sh = new ServiceHandler();
// Making a request to url and getting response
String jsonStr = sh.makeServiceCall(url + "&id=" + id, ServiceHandler.GET);
Log.d("Response: ", "> " + jsonStr);
if (jsonStr != null) {
try {
JSONObject jsonObj = new JSONObject(jsonStr);
// Getting JSON Array node
contacts = jsonObj.getJSONArray(TAG_CONTACTS);
// looping through All Contacts
for (int i = 0; i < contacts.length(); i++) {
JSONObject c = contacts.getJSONObject(i);
String id = c.getString(TAG_ID);
String name = c.getString(TAG_NAME);
String userid = c.getString(TAG_USERID);
String userone = c.getString(TAG_USERONE);
String usertwo = c.getString(TAG_USERTWO);
String message = c.getString(TAG_MESSAGE);
String pic_url_get = c.getString(TAG_IMAGE);
String conversation_id = c.getString(TAG_CONVERSATION);
String position = "";
if (username.equals(userid)) {
position = "right";
}else{
position = "left";
}
contact = new HashMap<String, String>();
// adding each child node to HashMap key => value
contact.put(TAG_ID, id);
contact.put(TAG_MESSAGE, message);
contact.put(TAG_POSITION, position);
contact.put(TAG_CONVERSATION, conversation_id);
contact.put(TAG_USERONE, userone);
contact.put(TAG_USERTWO, usertwo);
contact.put(TAG_IMAGE, "http://www.website.com/images/" + userid + "/" + pic_url_get);
// adding contact to contact list
contactList.add(contact);
if(isCancelled())
break;
}
} catch (JSONException e) {
e.printStackTrace();
}
} else {
Log.e("ServiceHandler", "Couldn't get any data from the url");
}
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
// Dismiss the progress dialog
if (pDialog.isShowing())
pDialog.dismiss();
/**
* Updating parsed JSON data into ListView
* */
adapter = new costumeadapter(
ChatRoomActivity.this,
contactList,
R.layout.chat_row,
new String[]{ TAG_MESSAGE, TAG_CONVERSATION },
new int[]{ R.id.name, R.id.conversationid });
setListAdapter(adapter);
}
}
public class costumeadapter extends SimpleAdapter{
public costumeadapter(ChatRoomActivity chatRoomActivity,
ArrayList<HashMap<String, String>> contactList, int listItem,
String[] strings, int[] is) {
super(chatRoomActivity, contactList, listItem, strings, is);
// TODO Auto-generated constructor stub
}
public View getView(int position, View convertView, ViewGroup parent){
View v = super.getView(position, convertView, parent);
TextView text = (TextView) v.getTag();
RelativeLayout lay = (RelativeLayout) v.findViewById(R.id.layout);
if(text == null){
text = (TextView) v.findViewById(R.id.name);
v.setTag(text);
}
String url = (String) ((Map)getItem(position)).get(TAG_POSITION);
String userone = (String) ((Map)getItem(position)).get(TAG_USERONE);
String usertwo = (String) ((Map)getItem(position)).get(TAG_USERTWO);
text.setBackgroundResource(url.equals("left") ? R.drawable.bubble_yellow : R.drawable.bubble_green);
lay.setGravity(url.equals("left") ? Gravity.LEFT : Gravity.RIGHT);
conversationid = (TextView)v.findViewById(R.id.conversationid);
if(userone.equals(username)){
linkprofile = usertwo;
}else{
linkprofile = userone;
}
getconversationid = conversationid.getText().toString();
send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SendMessage mTask = new SendMessage();
mTask.execute(username,getmessage,getconversationid);
}
});
return v;
}
}
}
答案 0 :(得分:0)
您可以将以下代码放在方法onCreate()
中adapter = new costumeadapter(
ChatRoomActivity.this,
contactList,
R.layout.chat_row,
new String[]{ TAG_MESSAGE, TAG_CONVERSATION },
new int[]{ R.id.name, R.id.conversationid });
setListAdapter(adapter);
在onPostExecute()中向contactList添加元素时添加调用adapter.notifyDataSetChanged()
注意:adapter
应该是会员字段
答案 1 :(得分:0)
当您的适配器使用的数据集已更改时,应调用notifyDataSetChanged。从我在你的代码中可以看出,这是contactList。每当将新项目添加到contactList,并将contactList绑定到适配器时,您将调用adapter.notifyDataSetChanged
并更新列表视图。我不确定你何时收到消息并不是很明显,但如果你有一个名为messageReceived的AsynTask,你可以在onPostExecute()方法中调用adapter.notifyDataSetChanged()
。需要注意的是,需要在MainThread上调用onDataSetChanged。如果主线程调用AsyncTask而不是onPostExecute()方法将正常工作。否则你需要做类似
ChatRoomActivity.this.runOnUiThread(
new Runnable(){
@Override public void run(){
adapter.notifyDataSetChanged();
}});