Java 如何在android中为聊天应用程序更新新消息的listview
我使用listview显示聊天,因为我使用asynctask从数据库检索消息,然后使用adapter和arraylist将消息填充到项目中。然后,如何为每条新消息更新listview,如何保持滚动位置,以及如何在android标题中显示新消息的通知 这是我的聊天活动Java 如何在android中为聊天应用程序更新新消息的listview,java,android,listview,android-listview,scroll,Java,Android,Listview,Android Listview,Scroll,我使用listview显示聊天,因为我使用asynctask从数据库检索消息,然后使用adapter和arraylist将消息填充到项目中。然后,如何为每条新消息更新listview,如何保持滚动位置,以及如何在android标题中显示新消息的通知 这是我的聊天活动 public class ChatActivity extends Activity implements OnScrollListener { ListView listview; Messag
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;
}
}
公共类ChatActivity扩展活动实现OnScrollListener{
列表视图列表视图;
信息任务;
处理者;
ArrayList tExp=新的ArrayList();
布尔加载更多=真;
列表=新的ArrayList();
布尔stopLoadingData=false;
编辑文本编辑;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u chat);
txt=(TextView)findViewById(R.id.roomname);
listview=(listview)findViewById(R.id.messagelist);
edit=(EditText)findViewById(R.id.editText1);
txt.setText(消息);
任务=新消息任务();
执行(新字符串[]{URL});
}
MessageTask类扩展了AsyncTask{
私有最终HttpClient客户端=新的DefaultHttpClient();
@TargetApi(构建版本代码蜂窝)
@凌驾
受保护列表doInBackground(字符串…参数){
字符串输出=”;
for(字符串输出:params){
试一试{
HttpGet HttpGet=新的HttpGet(输出);
ResponseHandler ResponseHandler=新BasicResponseHandler();
输出=Client.execute(httpget、responseHandler);
试一试{
JSONObject jObject=新的JSONObject(输出);
JSONArray menuObject=newjsonarray(jObject.getString(“response”);
//HashMap=newHashMap();
对于(int i=0;i您需要在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]));
}
}
有一个可用的源代码查看您需要做的就是,更新您的消息列表调用notifydatasetchange()到适配器,并使用set selection设置您的列表位置。他们是否使用Textview并不重要,只需按照流程并从他们所做的事情中获取提示即可。
@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);
}