在 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();
}
};
展开
 我来答
匿名用户
推荐于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;
    }
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式