在 Runnable 中使用 notifyDataSetChanged 进行ListView刷新问题
小弟最近遇到一个问题,不知道怎么解决,请各位大侠指点:为了方便各位大侠看代码,我把我的代码进行了简化:有一个For循环,执行10次,每次给ArrayListadd一个新I...
小弟最近遇到一个问题,不知道怎么解决,请各位大侠指点:
为了方便各位大侠看代码,我把我的代码进行了简化:
有一个For循环,执行10次,
每次给ArrayList add一个新Item,
触发Runnable
Sleep 1 秒
理论上应该是ListView每秒出现一个新的Item,但是事实上是:程序执行10秒以后,ListView忽然多了10行Item。而不是按照我的预期一秒一秒来的。
即便我不通过Runnable 进行notifyDataSetChanged ,而是直接把notifyDataSetChanged 放在For循环里也是一样的。为什么会这样,请各位大侠指点。
代码如下:
btnlist.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
for(int i=0;i<10;i++)
{
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("ItemTitle", "Level "+i);
listItem.add(map);
handler.post(listMessageUpdate);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
static Runnable listMessageUpdate =new Runnable(){
@Override
public void run() {
listItemAdapter.notifyDataSetChanged();
}
}; 展开
为了方便各位大侠看代码,我把我的代码进行了简化:
有一个For循环,执行10次,
每次给ArrayList add一个新Item,
触发Runnable
Sleep 1 秒
理论上应该是ListView每秒出现一个新的Item,但是事实上是:程序执行10秒以后,ListView忽然多了10行Item。而不是按照我的预期一秒一秒来的。
即便我不通过Runnable 进行notifyDataSetChanged ,而是直接把notifyDataSetChanged 放在For循环里也是一样的。为什么会这样,请各位大侠指点。
代码如下:
btnlist.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
for(int i=0;i<10;i++)
{
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("ItemTitle", "Level "+i);
listItem.add(map);
handler.post(listMessageUpdate);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
static Runnable listMessageUpdate =new Runnable(){
@Override
public void run() {
listItemAdapter.notifyDataSetChanged();
}
}; 展开
推荐于2016-11-06
展开全部
换一个方法 , 不要用 sleep ,可以用Timer来做
主布局就一个按钮和listview , item 就一个 textview 就不贴代码了
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
public class MainActivity extends Activity {
int count = 0;
int isStop = 0;
private ListView listView;
private Button start;
private List<String> mList = new ArrayList<String>();
private MAdapter mAdapter;
private Timer timer;
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
mList.add("" + msg.obj);
mAdapter.notifyDataSetChanged();
listView.setSelection(listView.getLastVisiblePosition());
}
};
/**
* Called when the activity is first created.
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
start = (Button) this.findViewById(R.id.start);
listView = (ListView) this.findViewById(R.id.list);
for (count = 0; count < 5; count++) {
//初始化5条数据
mList.add("" + count);
}
mAdapter = new MAdapter(mList);
listView.setAdapter(mAdapter);
timer = new Timer();
start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
Message msg = Message.obtain();
msg.obj = (count++) + "";
handler.sendMessage(msg);
}
};
if (isStop == 1) {
if (timer != null) {
timer.cancel();
timer.purge();
timer = null;
System.out.println("取消");
}
start.setText("开始");
isStop = 0;
} else {
if (timer == null) {
timer = new Timer();
}
timer.schedule(timerTask, 100, 1000);
start.setText("停止");
isStop++;
}
}
});
}
private class MAdapter extends BaseAdapter {
private List<String> mData;
MAdapter(List<String> data) {
mData = data;
}
@Override
public int getCount() {
return mData.size();
}
@Override
public Object getItem(int position) {
return mData.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (null == convertView) {
holder = new ViewHolder();
convertView = View.inflate(getApplicationContext(), R.layout.item, null);
holder.tv = (TextView) convertView.findViewById(R.id.item_tv);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.tv.setText(mData.get(position));
return convertView;
}
}
private class ViewHolder {
TextView tv;
}
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询