我正在使用listview显示聊天,因为我使用asynctask从数据库中检索消息,然后使用适配器和arraylist填充项目中的消息。然后如何更新每个新消息的列表视图以及如何维护滚动位置以及如何在android中的标题中显示新消息的通知。
这是我的聊天活动
public class ChatActivity extends Activity implements OnScrollListener {
ListView listview;
MessageTask task;
Handler handler;
ArrayList<String> tExp=new ArrayList<String>();
Boolean loadingMore = true;
List list = new ArrayList();
Boolean stopLoadingData = false;
EditText edit;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_chat);
txt=(TextView)findViewById(R.id.roomname);
listview =(ListView)findViewById(R.id.messagelist);
edit=(EditText)findViewById(R.id.editText1);
txt.setText(message);
task = new MessageTask();
task.execute(new String[]{URL});
}
class MessageTask extends AsyncTask<String, Void, List<String>> {
private final HttpClient Client = new DefaultHttpClient();
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
@Override
protected List<String> doInBackground(String... params) {
String output = "";
for(String out:params){
try{
HttpGet httpget = new HttpGet(out);
ResponseHandler<String> responseHandler = new BasicResponseHandler();
output = Client.execute(httpget, responseHandler);
try {
JSONObject jObject= new JSONObject(output);
JSONArray menuObject = new JSONArray(jObject.getString("response"));
//HashMap<String,ArrayList> map = new HashMap<String,ArrayList>();
for (int i = 0; i<menuObject.length(); i++)
{
list.add(menuObject.getJSONObject(i).getString("fk_username_c").toString()+" "+menuObject.getJSONObject(i).getString("message_c").toString());
}
adapter=new ArrayAdapter<String>(ChatActivity.this,android.R.layout.simple_list_item_1);
} catch (JSONException e) {
Log.e("log_tag", "Error parsing data ");
}
}catch(Exception e){
Log.i("Animation", "Thread exception " );
}
}
return list;
}
@Override
protected void onPostExecute(List<String> list) {
adapter.notifyDataSetChanged();
listview.setAdapter(adapter);
adapter.clear();
listview.clearTextFilter();
adapter.addAll(list);
loading=false;
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.chat, menu);
return true;
}
}
plz帮助我如何更新列表视图,仅用于每个新消息到达数据库。
答案 0 :(得分:1)
您需要更新onProgressUpdate方法
中的列表内容ArrayList<Message> messages;
@Override
public void onProgressUpdate(String... v) {
/*
* check wether we have already added a status message
*/
if (messages.get(messages.size() - 1).isStatusMessage) {
/*
* update the status for that
*/
messages.get(messages.size() - 1).setMessage(v[0]);
adapter.notifyDataSetChanged();
getListView().setSelection(messages.size() - 1);
} else {
/*
* add new message, if there is no existing status message
*/
addNewMessage(new Message(true, v[0]));
}
}
然后
@Override
protected void onPostExecute(String text) {
/*
* check if there is any status message, now remove it.
*/
if (messages.get(messages.size() - 1).isStatusMessage) {
messages.remove(messages.size() - 1);
}
/*
* add the orignal message from server.
*/
addNewMessage(new Message(text, false));
}
}
void addNewMessage(Message m) {
messages.add(m);
adapter.notifyDataSetChanged();
getListView().setSelection(messages.size() - 1);
}