listview(3、动态刷新)

listview的动态刷新主要是调用adapter的notifyDataSetChanged。

在下面的例子中除了记录正常的刷新外,还记录一种错误的情况(注释掉的),作为备忘。

notifyDataSetChanged除了数据无改变时不起作用,当数据的引用变化时也不起作用。因此在下面那个用数组的例子里,listview不会更新。

package com.example.demo_dlv;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class MainActivity extends Activity {

    private ListView lv;
    /*private String[] strs = new String[] {
            "first", "second", "third", "fourth", "fifth"
            };*/
    private List<String> list;
    private static int i = 0;
    private ArrayAdapter<String> adapter;

    private Handler handler = new Handler(){
        public void handleMessage(Message msg) {
            switch (msg.what) {
            case 1:
                /*List<String> list = new ArrayList<String>();
                for (int i=0; i<strs.length; i++) {
                    if(!list.contains(strs[i])) {
                        list.add(strs[i]);
                    }
                }

                list.add("new Element" + i++);*/
                list.add("item" + i++);

                System.out.println(list.size());

                //strs =  (String[]) list.toArray(new String[1]); 引用变了,无法动态刷新

                adapter.notifyDataSetChanged();
                break;
            }
            super.handleMessage(msg);
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        lv = (ListView) findViewById(R.id.lv); 

        list = new ArrayList<String>();
        list.add("item1");
        list.add("item2");
        list.add("item3");
        list.add("item4");
        list.add("item5");

        adapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, list);
        lv.setAdapter(adapter);

        MyThread mt = new MyThread();
        new Thread(mt).start();
    }

    class MyThread implements Runnable{

        @Override
        public void run() {
            int i = 0;
            while(i < 3){
                try {
                    Thread.sleep(3000);
                    Message message = new Message();
                    message.what = 1;
                    handler.sendMessage(message);
                    i++;
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
时间: 2025-01-03 19:48:48

listview(3、动态刷新)的相关文章

Android UI组件----自定义ListView实现动态刷新

[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3910541.html 联系方式:[email protected] [正文] 一.具体步骤: (1)在activiy_main.xml中加一个ListView控件:再添加一个item的模板activity_main_item.xml,加一个底部加载的视图activity_main_load.xml

ListView的动态刷新问题——用notifyDataSetChanged没作用

也许很多开发的朋友,尤其是Android初学者(笔者也是个初学者),在动态刷新ListView时,使用notifyDataSetChanged并没有起到作用.有时会被困扰得很痛苦. 其实,在使用notifyDataSetChanged过程中,还是有细节需要注意的.举个例子: 我的ListView使用的数据源是来自ArrayList.通常我们的做法是创建一个已经有我们想要提供给ListView的数据的ArrayList,例如: 1 ArrayList<Integer> list = new Ar

浅析:ListView的动态刷新问题

也许很多开发的朋友,尤其是Android初学者,在动态刷新ListView时,使用notifyDataSetChanged并没有起到作用.有时会被困扰得很痛苦. 其实,在使用notifyDataSetChanged过程中,还是有细节需要注意的.举个例子: 我的ListView使用的数据源是来自ArrayList.通常我们的做法是创建一个已经有我们想要提供给ListView的数据的ArrayList,例如: 1 ArrayList<Integer> list  = new ArrayList&l

ListView数据动态刷新

在Android开发中用到ListView时,经常遇到要更改ListView内容的情形,比如删除或增加ListView中显示的条目,这里给大家提供一下思路:不论ListView要显示的对象是什么(如:Cursor或Array或List),要实现ListView数据的更新,都要手动去更改要显示的数据对象,然后调用相应的方法(如:requery()或notifyDataSetChanged())来刷新ListView.针对不同的情形,下面给出相应解决办法的关键代码: 1.用ListView来显示数据

ListView中notifyDataSetChanged()无法刷新数据的错误实例

在使用ListView需要动态刷新数据的时候,经常会用到notifyDataSetChanged()函数. 以下为两个使用的错误实例: 1. 无法刷新: private List<RecentItem> recentItems; ...... recentItems = getData() mAdapter.notifyDataSetChanged(); 正常刷新: private List<RecentItem> recentItems; ...... recentItems.c

Android ListView内容变化后的动态刷新

ListView内容变化后的动态刷新 基本知识点: 1.更新适配器Adapter数据源 2.调用适配器Adapter的刷新方法notifyDataSetChanged() 首先需要定义ListView和对应适配器Adapter: //用于显示用户列表的ListView private ListView userList = null; //用户列表userList对应的适配器 SimpleAdapter simpleAdapter = null; //用户列表userList对应的适配器的数据源

Android ListView动态刷新某项Item

使用ViewHolder来刷新某项数据,而不用每次都全部刷新数据. 继承BaseAdapter,新建ViewHolder类. public class TestListAdapter extends BaseAdapter { private Context mContext; private List<String> strList; public TestListAdapter(Context context, List<String> list) { super(); thi

Android 动态刷新listview中的数据

之前一直困扰listview刷新后位置的问题,现在才明白,原来不能重新设置listview的adapter,而应该用notifyDataSetChanged()来刷新,这样位置就不会置顶. 下面做了一个测试的例子,点击最后一条记录,会增加一条新的记录, 代码如下: 1.TestAdapter package com.TestAdapter; import java.util.ArrayList; import java.util.HashMap; import java.util.List; i

android listview 动态刷新的问题

在 listview 滚定时 item会产生复用. 也就是说listview缓存的item是一定的,在滚动后,更新的时候,会复用前边不再使用的item. 所以在更新控件 尤其是进度条之类的,就需要进行判断,判断当前更新的item是否在可视的item中 即 在 Listview.getFirstVisiblePosition() 和 Listview.getLastVisiblePosition() 之间 如果不在就需要计算 该位置相当于哪一个可视的item, 然后获取那个item 进行更新数据.