Android Listview每2秒自动向上滚动一次
一个线程使用Oncreate方法从服务器获取聊天历史记录,并在listview上进行设置,代码如下所示: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);
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();
}
我已经实施了,但它不起作用。无论如何,感谢支持。我已经实施,但它不起作用。无论如何,感谢支持。