Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/211.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在android中为聊天应用程序更新新消息的listview_Java_Android_Listview_Android Listview_Scroll - Fatal编程技术网

Java 如何在android中为聊天应用程序更新新消息的listview

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

我使用listview显示聊天,因为我使用asynctask从数据库检索消息,然后使用adapter和arraylist将消息填充到项目中。然后,如何为每条新消息更新listview,如何保持滚动位置,以及如何在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;
        }

    }
公共类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);
    }