Android Listview每2秒自动向上滚动一次

Android Listview每2秒自动向上滚动一次,android,listview,Android,Listview,一个线程使用Oncreate方法从服务器获取聊天历史记录,并在listview上进行设置,代码如下所示: Runnable run = new Runnable() { public void run() { // new Comments(false).execute(); new GetChatFromServer().execute(); handler.postDelayed(this, 1600);

一个线程使用Oncreate方法从服务器获取聊天历史记录,并在listview上进行设置,代码如下所示:

Runnable run = new Runnable() {
        public void run() {
            // new Comments(false).execute();
            new GetChatFromServer().execute();
            handler.postDelayed(this, 1600);
        }
    };
    runOnUiThread(run);
它调用GetChatFromServer类以使所有最近更新的聊天历史正常工作,但问题是当我向下滚动listview时,它会自动向上滚动

class GetChatFromServer extends AsyncTask<String, Integer, Double> {

        String chathistory;

        @Override
        protected void onPreExecute() {
            // TODO Auto-generated method stub
            super.onPreExecute();

            System.out.println("My url is>>>>" + chatHistoryUrl);
        }

        @SuppressWarnings("unchecked")
        @Override
        protected Double doInBackground(String... params)
                throws ArrayIndexOutOfBoundsException {

            ServiceHandler sh = new ServiceHandler();
            // Making a request to url and getting response
            String jsonStr = sh.makeServiceCall(chatHistoryUrl,
                    ServiceHandler.GET);
            chathistory = "{\"chatHistories\":" + jsonStr + "}";
            Gson gson = new Gson();
            Type listType = new TypeToken<List<ChatHistory>>() {
            }.getType();
            chatHistories = (ArrayList<ChatHistory>) gson.fromJson(jsonStr,
                    listType);
            // ChatModel res = gson.fromJson(chathistory, ChatModel.class);

            return null;
        }

        protected void onProgressUpdate(Integer... progress) {
            // pb.setProgress(progress[0]);
        }

        @Override
        protected void onPostExecute(Double result) {
            // TODO Auto-generated method stub
            super.onPostExecute(result);
            mAdapter = new ChatMessageAdapter(ChatMainActivity.this,
                    chatHistories, sourceId);
            chatList.setAdapter(mAdapter);

        }

    }
GetChatFromServer类扩展了异步任务{
字符串聊天历史;
@凌驾
受保护的void onPreExecute(){
//TODO自动生成的方法存根
super.onPreExecute();
System.out.println(“我的url是>>>>”+chatHistoryUrl);
}
@抑制警告(“未选中”)
@凌驾
受保护的双doInBackground(字符串…参数)
将ArrayIndex抛出BoundsException{
ServiceHandler sh=新的ServiceHandler();
//向url发出请求并获得响应
字符串jsonStr=sh.makeServiceCall(chatHistoryUrl,
ServiceHandler.GET);
chathistory=“{\“chatHistories\”:“+jsonStr+”}”;
Gson Gson=新的Gson();
类型listType=新类型令牌(){
}.getType();
chatHistories=(ArrayList)gson.fromJson(jsonStr,
列表类型);
//ChatModel res=gson.fromJson(chathistory,ChatModel.class);
返回null;
}
受保护的void onProgressUpdate(整数…进度){
//pb.setProgress(progress[0]);
}
@凌驾
受保护的void onPostExecute(双重结果){
//TODO自动生成的方法存根
super.onPostExecute(结果);
mAdapter=new ChatMessageAdapter(ChatMainActivity.this,
聊天记录(sourceId);
chatList.setAdapter(mAdapter);
}
}

如果有人能帮我解决问题,请。提前感谢。

问题是您每次都在重新创建适配器。初始化适配器一次,并仅替换onPostExecute中的数据

List chatHistories;



  // in onPostExecute
adapter.updateData(new_chatHistory);




// in your adapter
updateData(List new_chatHistory){

    chatHistories.addAll(new_chatHistory);

    and adapter.notifyDataSetChanged();
}

问题是您每次都在重新创建适配器。初始化适配器一次,并仅替换onPostExecute中的数据

List chatHistories;



  // in onPostExecute
adapter.updateData(new_chatHistory);




// in your adapter
updateData(List new_chatHistory){

    chatHistories.addAll(new_chatHistory);

    and adapter.notifyDataSetChanged();
}
问题就在这里

@Override
protected void onPostExecute(Double result) {
    // TODO Auto-generated method stub
    super.onPostExecute(result);
    mAdapter = new ChatMessageAdapter(ChatMainActivity.this,
            chatHistories, sourceId);
    chatList.setAdapter(mAdapter);

}
无论何时从服务器获取数据,您都要反复调用
setAdapter
,您需要做的是在
OnCreate
中设置适配器,并在获取数据时调用
mAdapter.notifyDataSetChanged

以下是一个例子:

String chathistory;
ChatMessageAdapter mAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ........
    mAdapter = new ChatMessageAdapter(ChatMainActivity.this, chatHistories, sourceId);
    chatList.setAdapter(mAdapter);
}
onPostExecute

@Override
protected void onPostExecute(Double result) {
    // TODO Auto-generated method stub
    super.onPostExecute(result);
    mAdapter.notifyDataSetChanged();
}
问题就在这里

@Override
protected void onPostExecute(Double result) {
    // TODO Auto-generated method stub
    super.onPostExecute(result);
    mAdapter = new ChatMessageAdapter(ChatMainActivity.this,
            chatHistories, sourceId);
    chatList.setAdapter(mAdapter);

}
无论何时从服务器获取数据,您都要反复调用
setAdapter
,您需要做的是在
OnCreate
中设置适配器,并在获取数据时调用
mAdapter.notifyDataSetChanged

以下是一个例子:

String chathistory;
ChatMessageAdapter mAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ........
    mAdapter = new ChatMessageAdapter(ChatMainActivity.this, chatHistories, sourceId);
    chatList.setAdapter(mAdapter);
}
onPostExecute

@Override
protected void onPostExecute(Double result) {
    // TODO Auto-generated method stub
    super.onPostExecute(result);
    mAdapter.notifyDataSetChanged();
}

我已经实施了,但它不起作用。无论如何,感谢支持。我已经实施,但它不起作用。无论如何,感谢支持。