`
ping8080
  • 浏览: 58978 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
文章分类
社区版块
存档分类
最新评论

动态更新listView

阅读更多

原文地址:http://www.pocketdigi.com/20100827/75.html

notifyDataSetChanged() 动态更新ListView 通过 Handler AsyncTask两种方式

有时候我们需要修改已经生成的列表,添加或者修改数据,notifyDataSetChanged()可以在修改适配器绑定的数组后,不用重新刷新Activity,通知Activity更新ListView。今天的例子就是通过Handler AsyncTask两种方式来动态更新ListView.从今天起,每次学习的源代码都会打包上传,方便各位同学学习,注册帐号即可下载。
布局main.xml:

1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<ListView  android:id="@+id/lv"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello"
    />
</LinearLayout>

ListView列表布局playlist.xml:

1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="utf-8"?>
<TextView 
  android:id="@+id/text1"
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="30px"
  android:textSize="18sp"
></TextView>

程序代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package com.pocketdigi;
 
import java.util.ArrayList;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.AdapterView.OnItemClickListener;
 
public class main extends Activity {
    /** Called when the activity is first created. */
	ListView lv;
	ArrayAdapter<String> Adapter;
	ArrayList<String> arr=new ArrayList<String>();
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        lv=(ListView)findViewById(R.id.lv);
    	arr.add("123");
    	arr.add("234");
    	arr.add("345");
    	Adapter = new ArrayAdapter<String>(this,R.layout.playlist, arr);
    	lv.setAdapter(Adapter);
    	lv.setOnItemClickListener(lvLis); 
    	editItem edit= new editItem();
    	edit.execute("0","第1项");//把第一项内容改为"第一项"
    	Handler handler=new Handler();
    	handler.postDelayed(add,3000);//延迟3秒执行
    }
    Runnable add=new Runnable(){
 
		@Override
		public void run() {
			// TODO Auto-generated method stub
			arr.add("增加一项");//增加一项
			Adapter.notifyDataSetChanged();	
		}   	
    };
    class editItem extends AsyncTask<String,Integer,String>{
		@Override
		protected String doInBackground(String... params) {
				arr.set(Integer.parseInt(params[0]),params[1]);
				//params得到的是一个数组,params[0]在这里是"0",params[1]是"第1项"
				Adapter.notifyDataSetChanged();
			return null;	
		}
    }
    private OnItemClickListener lvLis=new OnItemClickListener(){
		@Override
		public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
				long arg3) {
			//点击条目时触发
			//arg2即为点中项的位置
			setTitle(String.valueOf(arr.get(arg2)));
 
		}
 
    };
 
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Listview动态加载数据

收藏 分享 2011-3-22 11:30| 发布者: annmax| 查看数: 456| 评论数: 0

<!--[diy=diysummarytop]--><!--[/diy]-->
摘要: 最近在研究网络数据加载的问题,比如我有几百,甚至上千条数据,这些数据如果一次性全部加载到arraylist,然后再加载到Listview中。我们必然会去单独开线程来做,这样造成的结果就是会出现等待时间很长,用户体验非 ...
<!--[diy=diysummarybottom]--><!--[/diy]-->
<!--[diy=diycontenttop]--><!--[/diy]-->
   最近在研究网络数据加载的问题,比如我有几百,甚至上千条数据,这些数据如果一次性全部加载到arraylist,然后再加载到Listview中。我们必然会去单独开线程来做,这样造成的结果就是会出现等待时间很长,用户体验非常不好。我的想法是动态加载数据,第一次加载十条,然后往下面滑动的时候再追加十条,再往下面滑动的时候再去追加,这样大大减少了用户等待的时间,同时给处理数据留下了时间。网上看到了这样一个例子,挺好的,我改动了一下,达到了我想要的结果。
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AbsListView.OnScrollListener;
import android.widget.LinearLayout.LayoutParams;
public class ListViewForLoading extends Activity implements OnScrollListener {
    private listViewAdapter adapter = new listViewAdapter();
    ListView listView;
    LinearLayout loadingLayout;
    private Thread mThread;
    /**
     * 设置布局显示属性
     */
    private LayoutParams mLayoutParams = new LinearLayout.LayoutParams(
            LinearLayout.LayoutParams.WRAP_CONTENT,
            LinearLayout.LayoutParams.WRAP_CONTENT);
    /**
     * 设置布局显示目标最大化属性
     */
    private LayoutParams FFlayoutParams = new LinearLayout.LayoutParams(
            LinearLayout.LayoutParams.FILL_PARENT,
            LinearLayout.LayoutParams.FILL_PARENT);
    private ProgressBar progressBar;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        init();
    }
    private void init() {
        // TODO Auto-generated method stub
        // 线性布局
        LinearLayout layout = new LinearLayout(this);
        // 设置布局 水平方向
        layout.setOrientation(LinearLayout.HORIZONTAL);
        // 进度条
        progressBar = new ProgressBar(this);
        // 进度条显示位置
        progressBar.setPadding(0, 0, 15, 0);
        // 把进度条加入到layout中
        layout.addView(progressBar, mLayoutParams);
        // 文本内容
        TextView textView = new TextView(this);
        textView.setText("加载中...");
        textView.setGravity(Gravity.CENTER_VERTICAL);
        // 把文本加入到layout中
        layout.addView(textView, FFlayoutParams);
        // 设置layout的重力方向,即对齐方式是
        layout.setGravity(Gravity.CENTER);
        // 设置ListView的页脚layout
        loadingLayout = new LinearLayout(this);
        loadingLayout.addView(layout, mLayoutParams);
        loadingLayout.setGravity(Gravity.CENTER);
        // 得到一个ListView用来显示条目
        listView = (ListView) findViewById(R.id.tv);
        // 添加到脚页显示
        listView.addFooterView(loadingLayout);
        // 给ListView添加适配器
        listView.setAdapter(adapter);
        // 给ListView注册滚动监听
        listView.setOnScrollListener(this);
    }
    /**
     * 要用用于生成显示数据
     *
     * @author huangbq
     *
     */
    class listViewAdapter extends BaseAdapter {
        int count = 10;
        public int getCount() {
            return count;
        }
        public Object getItem(int pos) {
            return pos;
        }
        public long getItemId(int pos) {
            return pos;
        }
        public View getView(int pos, View v, ViewGroup p) {
            TextView view;
            if (v == null) {
                view = new TextView(ListViewForLoading.this);
            } else {
                view = (TextView) v;
            }
            view.setText("ListItem " + pos);
            view.setTextSize(20f);
            view.setGravity(Gravity.CENTER);
            view.setHeight(60);
            return view;
        }
    }
    @Override
    public void onScroll(AbsListView view, int firstVisibleItem,
            int visibleItemCount, int totalItemCount) {
        // TODO Auto-generated method stub
        if(firstVisibleItem+visibleItemCount==totalItemCount)
        {
            //开线程去下载网络数据
            if (mThread == null || !mThread.isAlive()) {
                mThread = new Thread() {
                    @Override
                    public void run() {
                        try {
                            //这里放你网络数据请求的方法,我在这里用线程休眠5秒方法来处理
                            Thread.sleep(5000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        Message message = new Message();
                        message.what = 1;
                        handler.sendMessage(message);
                    }
                };
                mThread.start();               
            }
        }
    }
    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
        // TODO Auto-generated method stub       
    }
    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            // TODO Auto-generated method stub
            switch (msg.what) {
            case 1:
                if (adapter.count <= 41) {
                    adapter.count += 10;
                    int currentPage = adapter.count / 10;
                    Toast.makeText(getApplicationContext(),"第" + currentPage + "页", Toast.LENGTH_LONG).show();
                } else {
                    listView.removeFooterView(loadingLayout);
                }
                //重新刷新Listview的adapter里面数据
                adapter.notifyDataSetChanged();
                break;
            default:
                break;
            }
        }
    };
}
运行结果如下图:

分享到:
评论
1 楼 644368912 2015-04-30  
胡歌花样姐姐

相关推荐

    Android编程实现动态更新ListView的方法

    动态更新ListView是指在运行时添加、删除或修改ListView中的数据项,而无需完全重新加载整个ListView或Activity。以下将详细介绍如何在Android中实现动态更新ListView。 首先,一个基本的ListView需要一个适配器...

    ListView动态添加、移除item

    这样Adapter会自动重新加载数据并更新ListView。 三、动态移除item 1. 移除特定item时,首先从数据源中移除对应的对象,例如`myItemList.remove(index)`。 2. 同样,调用`notifyDataSetChanged()`让ListView知道...

    ListView动态更新item的例子

    综上所述,动态更新ListView的item涉及到Adapter的自定义、ViewHolder的使用以及对数据变化的通知。理解这些核心概念,能帮助我们构建高效、流畅的列表展示。在实际开发中,结合图片加载库和性能优化策略,可以使...

    Android通过Handler与AsyncTask两种方式动态更新ListView(附源码)

    动态更新ListView是指在运行时修改ListView的数据源,并让ListView自动反映出这些变化。本文将重点介绍如何使用Handler和AsyncTask这两种方法来实现ListView的动态更新。 首先,Handler是Android中的一个关键组件,...

    Android 根据EditText搜索框 ListView动态显示数据

    本教程将详细介绍如何根据EditText的输入内容,动态更新ListView的数据并实时显示。 首先,我们需要在布局文件中设置EditText和ListView。EditText作为搜索框,用户在此输入搜索关键词;ListView用于展示数据,我们...

    ListView的嵌套,动态设置ListView的高度

    4. **处理滚动事件**:为了保证嵌套的ListView正常滚动,需要监听父ListView的滚动事件,确保子ListView在滚动时同步更新。这可以通过实现`OnScrollListener`接口并在`onScroll()`方法中处理。 5. **性能优化**:...

    vb6.0 listview 可修改内容代码

    综上所述,这个"vb6.0 listview 可修改内容代码"示例展示了如何利用Text控件与ListView控件进行交互,实现动态更新ListView中的数据,这对于创建用户友好的数据编辑界面非常有用。理解并掌握这些知识点,有助于你更...

    listview刷新

    `listview刷新`这个话题主要涉及如何在用户交互(如点击某行)时动态更新ListView的内容,且新增的数据能够正确地添加到底部,而不是覆盖原有的顶部数据。下面将详细阐述ListView的刷新机制及其相关知识点。 1. **...

    WPF后台动态绑定ListView数据源

    你可以将任何实现了`IEnumerable`接口的对象(如`ObservableCollection&lt;T&gt;`)绑定到ListView的`ItemsSource`,从而实现数据的动态更新。 以下是一些关键步骤来实现动态绑定: 1. 创建数据模型:定义一个类,表示你...

    Android ListView动态查询更新代码

    在Android开发中,ListView是一种常用的组件,用于展示大量的列表数据。动态查询和更新ListView是...通过SearchListView这个例子,我们可以学习如何在ListView中实现高效的搜索和动态更新功能,提升应用的用户体验。

    listview,edittext,checkbox结合的简单实例

    本实例主要探讨如何将EditText、Checkbox与ListView结合,实现用户输入内容后动态更新ListView显示的效果。以下是相关的知识点详解: 1. **ListView的基本使用** - ListView是Android提供的一个可以显示大量数据的...

    自定义布局的动态加载listView

    5. 加载更多数据:在`onScrollStateChanged()`方法中,检查当前是否已到达列表底部,如果是,则向服务器请求更多数据,更新数据源,并调用Adapter的`notifyDataSetChanged()`方法通知ListView数据已更新。...

    ListView具体使用实例

    在Android开发中,ListView是一个非常重要的组件,它用于以列表形式展示数据,且能根据数据...在实际开发中,我们还需要考虑性能优化,如使用ViewHolder模式减少视图查找的时间,以及根据数据变化动态更新ListView等。

    ListView使用Demo

    4. 动态加载:根据网络数据动态更新ListView内容。 综上所述,通过学习和实践ListView的使用,开发者可以轻松地在Android应用中创建功能丰富的数据列表,同时掌握数据绑定、事件处理、性能优化等核心技能。这个...

    ListView动态加载

    然而,ListView的动态加载和它与ScrollView的兼容性问题,是开发者经常遇到的挑战。下面我们将深入探讨这两个主题。 **ListView动态加载** 动态加载,也称为懒加载,是为了提高应用性能和用户体验而采用的一种策略...

    ListView动态加载数据分页

    消息中可以包含分页数据,然后主线程中的Handler实例会接收到这个消息并处理,更新ListView。 步骤如下: 1. 创建一个Handler实例,绑定到主线程。 2. 在需要加载更多数据时,启动新线程,执行数据获取任务。 3. ...

    Android应用源码动态ListView,支持异步更新列表,异步更新图片.zip

    本示例中的“Android应用源码动态ListView,支持异步更新列表,异步更新图片.zip”提供了一个实现动态加载和异步更新功能的ListView的实例。下面将详细讲解这个主题中的关键知识点。 1. **动态ListView**: - 动态...

    ListView显示隐藏Item

    5. **动态更新ListView**:如果你需要在运行时改变Item的显示状态,如响应用户操作或接收到新数据,只需更新数据源,并调用Adapter的`notifyDataSetChanged()`方法,ListView会自动重新绘制。 通过以上步骤,你可以...

Global site tag (gtag.js) - Google Analytics