数据库中的值是不断变化的,如何动态的显示在listview下拉刷新中,去动态刷新listview下拉刷新

Android_ListView_Adapter使用和数据动态加载 - 推酷
Android_ListView_Adapter使用和数据动态加载
1.ListView概述
:ListView是比较常用的控件,其存在的最根本的原因在于它的高效,ListView通过对象的复用从而减少内存的消耗,也减少了对象的创建从而也减少的cpu的消耗(在Androidk中创建View对象经常伴随着解析xml)。ListView的本质是一张bitmap(当然所有的控件文字等在屏幕上看到的最终都会变成bitmap),ListView会按照需求,根据Adapter提供的信息把需要的Item画出来显示在屏幕上,当屏幕滚动的时候会重新计算Item的位置并绘制出新的bitmap显示在屏幕上。这样听起来感觉可能不是很高效,但这样带的好处就是,每用为一第个Item&
创建一个View对象,样式一样的对象可以共用一个View对象,减少了内存的消耗。而且ListView是事件驱动的,只有当需要的时候才会重新绘制,并且只会&
绘制当前屏幕上所显示的Items.
2.ListView有关的三要素
(1).ListVeiw
用来展示列表的View,如果继承了ListActivity则使用getListView()得到listView对象
(2).Adapter
用来把数据映射到ListView上的中介,常用的有ArrayAdapter,SimpleAdapter,CursorAdapter和SimpleCursorAdapter.BaseAdapter
1).ArrayAdapter
构造函数objects接收一个集合或者数组,将会按照集合的元素(或者数组的子集)逐条在ListView列出,一个一行;
//ArrayAdapter Constructor
new ArrayAdapter(Context context, //The current context.
int resource,
The resource ID for a layout file containing a layout to use when instantiating views
例如:android.R.layout.simple_list_item_single_choice
List&T& objects)
//数据对象
2).CursorAdapter
Adapter that exposes data from a&Cursor to a&&ListView widget. The Cursor must include& a column named &_id& or this class will not work;
3).SimpleAdapter
有最好的扩充性,通过自定义xml样式文件,达到自定义的列表文件
//SimpleAdapter Constructor
SimpleAdapter (Context context, // 上下文
List&? extends Map&String, ?&& data,
* A List of Maps.每个list元素就是一列
* Map集合中的key集合,应该包含后面参数(from)中每个元素
int resource,
//为view layout定义的一列,其中应该包含后面参数(to)中每个元素
String[] from,
//从data引出的某些列名
//从resource对应的layout文件中,找到相应的id而组成的数组
4).SimpleCursorAdapter
可以理解为SimpleAdapter对数据库的简单结合,可以方面的把数据库的内容以列表的形式展示出来。
5).BaseAdapter
* 自定义适配器,常见将Cursor或者其他的数据存储在一个集合中,效率提高!
private class MyAdapter extends BaseAdapter {
private List&String&
//为该适配器设置展现的数据,当我们为该适配器指定了新的数据后,应该调用notifyDataSetChanged()方法后才能完成数据的动态加载
public void setList( List&String& list){
this.list =
public int getCount() {
return list.size();
public Object getItem(int position) {
return list.get(position);
public long getItemId(int position) {
//重要方法,用于展现该listview的item条目
public View getView(int position, View convertView, ViewGroup parent) {
* convertView为一个item条目对象,每个item滑过之后,创建的item对象有被重新销毁,为此安卓提供一种机制,
* 创建的条目不被销毁而是供后来展现的item重复使用,大大提高了效率
TextView textView =
if (convertView == null) { //如果没有可供重复使用的item View对象
textView = new TextView(getActivity());
* 里面包含一种高效的处理机制,当每个item比较复杂,如果重复的执行类型转换、查找控件等操作,将会很大浪费,
* 可以定义一个类,专门用来存放控件对象的引用。后面的例子键会介绍到
textView = (TextView) convertV //如果已经加载将重复使用
textView.setText(list.get(position));
textView.setPadding(20, 20, 20, 20);
textView.setBackgroundColor(Color.GREEN);
return textV
(3).Data数据
List集合或者一个Cursor实例对象。但是如果查询数据库,将会很耗时,因此将使用loaderManager进行统一的管理,异步完成Cursor到数据集合的转化,可参考
3.ListView的id说明
(1).ListActivity子类
如果java类继承了ListActivity,那么表明该类只能存在一个ListView控件,可以通过getListView()方法取得默认的控件,但是在相应的xml文件中,定义的ListView必须指明固定的id,android:id=&@android:id/list&
(2).Activity子类
如果java类继承了Activity,那么id就没有特定的要求,xml支持自定义id
4.ListView的滚动事件
(1).AbsListView.OnScrollListener事件类型
SCROLL_STATE_IDLE
当前item处于空闲状态,没有发生滚动
SCROLL_STATE_TOUCH_SCROLL
item正在滚动,但是手指还停留在屏幕上
SCROLL_STATE_FLING
类似惯性,当前item正在滚动
&(2).OnScrollListener方法
listView.setOnScrollListener(new AbsListView.OnScrollListener() {
public void onScrollStateChanged(AbsListView view, int scrollState) {
//监听listView的状态是否改变
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
//在滚动的过程中会触发该事件
(3).下拉刷新底部
listView.setOnScrollListener(new OnScrollListener() {
private boolean isBottom = //用于标记是否到达顶端
//listview的状态发送改变时执行
public void onScrollStateChanged(AbsListView view, int scrollState) {
System.out.println(&scrollState:&+scrollState);
if(isBottom && scrollState==OnScrollListener.SCROLL_STATE_IDLE){
System.out.println(&数据加载&);
//简单模拟数据加载过程
for(int j=0; j&10; j++){
Map&String, String& map = new HashMap&String, String&();
map.put(&id&, String.valueOf((i++)));
map.put(&name&, &newName=&+i);
map.put(&age&, String.valueOf(i));
adapter.getList().add(map);
adapter.notifyDataSetChanged();
isBottom =
//在滚动的过程中不断执行
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
System.out.println(firstVisibleItem+&:&+visibleItemCount+&:&+totalItemCount);
if(firstVisibleItem+visibleItemCount == totalItemCount){
isBottom =
isBottom =
5.ListView数据的动态刷新
ListView动态更新应用很广,比如执行添加或者删除后,数据的动态更新展现。为了达到这种目的,不得不提到适配器的notifyDataSetChanged()方法,有时可能读者在使用的过程中,会发现即便调用了该方法数据并没有实时的更新,先别急,后面将分析原因。
下面一个应用,在主Activity中EditText中添加一条数据,在其内部的ListFragment动态更新数据。
public class MainActivity extends Activity {
private FragmentM
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
manager = getFragmentManager();
button = (Button) findViewById(R.id.confirm);
//将ListFragment添加进主Activity中,如果没有使用布局加载一个ListView对象
if (manager.findFragmentByTag(&right&) == null) {
manager.beginTransaction()
.replace(R.id.right, new RightFrag(), &right&)
.addToBackStack(&right&)
.commit(); //事务提交
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
//使用内容提供者,添加数据
Uri uri = Uri.parse(&content://com.baidu.provider/music&);
ContentValues values = new ContentValues();
values.put(&name&, ((EditText) findViewById(R.id.name)).getText().toString());
Uri u = getContentResolver().insert(uri, values);
//判断数据是否添加成功
if (u != null) {
Toast.makeText(MainActivity.this, &添加成功!&, 1).show();
* 重启loader对象,完成数据的动态加载,
读者可能遇到一个问题,数据时重新加载了,但是listView的item重新回到了第一个item位置,
这是因为我们在重启的过程中,又为该listView设置了适配器,只要不重新设置,item的位置不会改变
getLoaderManager().restartLoader(
//该loaderManger管理下的Id为1的loader
//传递参数bundle,常为null
(RightFrag) (getFragmentManager().findFragmentByTag(&right&)));
//LoaderManager.LoaderCallbacks的回掉函数,由于该ListFragment实现了该接口
Toast.makeText(MainActivity.this, &添加失败&, 1).show();
public class RightFrag extends ListFragment implements LoaderCallbacks&Cursor& {
private LoaderM
private MyA
private List&String& //用于存放数据库数据,这里每个item只简单展现一条文本数据
//完成一些初始化操作
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
manager = getLoaderManager();
list = new ArrayList&String&();
adapter = new MyAdapter(); //创建自定义适配器
* 为该listView设置adapter,如果普通的listView使用setAdapter()方法
* 如果该方法在Cursor数据查询完成后设置,listView的将会查询回到第一个。
setListAdapter(adapter);
manager.initLoader(1, null, this); //初始化一个loader对象
/*完成layout布局文件的加载并返回,
* 该方法不用重写,由于ListFragment已经默认返回一个listView对象
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.list, null);
//使用内容提供者,返回loader对象
public Loader&Cursor& onCreateLoader(int id, Bundle args) {
Uri uri = Uri.parse(&content://com.baidu.provider/music&);
//CursorLoader是AsyncTaskLoader的子类,异步查询
return new CursorLoader(getActivity(), uri, new String[] { &name& },
null, null, null);
public void onLoadFinished(Loader&Cursor& loader, Cursor data) {
* 将list数据清空
* 如果数据量很大,这种操作就有问题,如果只有增加,我们就不要清空,
只需要记录上次查询的id,这次查询满足_id & id即可,提高效率
list.clear();
while (data.moveToNext()) {
list.add(data.getString(data.getColumnIndex(&name&)));
* 使用该方法应该注意,如果数据库的数据发送改变,listView不能动态更新,
只有适配器的对应的list数据发生了改变,调用该方法才能达到更新的效果
adapter.notifyDataSetChanged();
public void onLoaderReset(Loader&Cursor& loader) {
* 自定义适配器,常见将Cursor或者其他的数据存储在一个集合中,效率提高!
private class MyAdapter extends BaseAdapter {
public int getCount() {
return list.size();
public Object getItem(int position) {
return list.get(position);
public long getItemId(int position) {
public View getView(int position, View convertView, ViewGroup parent) {
* convertView为一个item条目对象,每个item滑过之后,创建的item对象有被重新销毁,为此安卓提供一种机制,
* 创建的条目不被销毁而是供后来展现的item重复使用,大大提高了效率
View view =
if (convertView == null) { //如果没有可供重复使用的item View对象
view = getActivity().getLayoutInflater().inflate(R.layout.item, null);
//如果view的布局很复杂,可以将内部的控件保存下来
TextView textView = (TextView) view.findViewById(R.id.text);
ViewSet set = new ViewSet();
set.textView = textV
view.setTag(set);
view = convertV //如果已经加载将重复使用
//不用重复的查找控件
ViewSet views = (ViewSet) view.getTag();
views.textView.setText(list.get(position));
//保存item控件
static class ViewSet{
TextView textV
&6.简单适配器的使用
* ListViewTest.java
* @author Administrator
public class MainActivity extends ListActivity {
private ListView listV
private List&Map&String, String&&
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = this.getListView();//由于继承了ListActivity,可以直接得到listView控件,但是前提xml文件中需指定默认id
////////method1()
listView.setAdapter(new SimpleAdapter(MainActivity.this, resource,
R.layout.item, new String[] { &name&, &info& }, new int[] {
R.id.name,
listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); //设定后才可选中
////////method2()
listView.setAdapter(new ArrayAdapter&String&(this,
android.R.layout.simple_list_item_single_choice, new String[] {
&河南&, &湖北&, &北京&, &上海&, &河南&, &湖北&, &北京&, &上海&, &河南&,
&湖北&, &北京&, &上海&, &河南&, &湖北&, &北京&, &上海& }));
listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
public void get() {
resource = new ArrayList&Map&String, String&&();
Map&String, String& map1 = new HashMap&String, String&();
map1.put(&name&, &小李飞刀&);
map1.put(&info&, &good!&);
resource.add(map1);
Map&String, String& map2 = new HashMap&String, String&();
map2.put(&name&, &北京爱情故事&);
map2.put(&info&, &ok!&);
resource.add(map2);
Map&String, String& map3 = new HashMap&String, String&();
map3.put(&name&, &亮剑&);
map3.put(&info&, &22~~~~~~~~&);
resource.add(map3);
&!-- activity_main.xml --&
&LinearLayout xmlns:android=&/apk/res/android&
xmlns:tools=&/tools&
android:layout_width=&match_parent&
android:layout_height=&match_parent&
android:orientation=&vertical& &
&LinearLayout android:orientation=&horizontal&
android:layout_width=&match_parent&
android:layout_height=&wrap_content&&
&TextView android:layout_height=&wrap_content&
android:layout_width=&match_parent&
android:layout_weight=&1&
android:text=&@string/name&
android:layout_marginLeft=&3sp&/&
&TextView android:layout_height=&wrap_content&
android:layout_width=&match_parent&
android:layout_weight=&1&
android:text=&@string/age&
android:layout_marginLeft=&3sp&/&
&/LinearLayout&
&!-- 一定要注意ListView空间的id,详细说明要看本页说明 --&
android:id=&@android:id/list&
android:layout_width=&fill_parent&
android:layout_height=&match_parent&
&/LinearLayout&
&!-- item.xml --&
&LinearLayout xmlns:android=&/apk/res/android&
xmlns:tools=&/tools&
android:layout_width=&match_parent&
android:layout_height=&match_parent&
android:orientation=&vertical& &
android:id=&@+id/name&
android:layout_width=&match_parent&
android:layout_height=&wrap_content&
android:textSize=&20sp&
android:layout_marginLeft=&3sp& /&
android:id=&@+id/info&
android:layout_width=&match_parent&
android:layout_height=&wrap_content&
android:textSize=&15sp&
android:layout_marginLeft=&10sp& /&
&/LinearLayout&
已发表评论数()
&&登&&&陆&&
已收藏到推刊!
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见当前位置: >
listview刷新-ListView内容变化后的动态刷新
时间: 10:16 来源:教程资料 作者:listview刷新 阅读:次
ListView内容变化后的动态刷新
基本知识点:
1.更新适配器Adapter数据源
2.调用适配器Adapter的刷新方法notifyDataSetChanged()
首先需要定义ListView和对应适配器Adapter:
Java代码 &收藏代码
//用于显示用户列表的ListView &
private ListView userList = &
//用户列表userList对应的适配器 &
SimpleAdapter simpleAdapter = &
//用户列表userList对应的适配器的数据源 &
List&Map&String,?&& dataSimpleAdapter = new ArrayList&Map&String,?&&(); &
//用户列表ListView行布局元素 &
int[] userListViewTo = &
//用户列表ListView行布局元素对应的适配器key值 &
String[] userListViewFrom = &
& & &* 初始化用户列表组件适配器.&
& & public void initUserListViewAdapter(){ &
& & & & userList = (ListView)findViewById(R.id.user_list_users); & & & & &
& & & & userListViewTo = new int[]{R.id.user_list_item_user_id, &
& & & & & & & & R.id.user_list_item_user_Login_id, &
& & & & & & & & R.id.user_list_item_user_login_pass}; &
& & & & &&
& & & & int len = userListViewTo. &
& & & & userListViewFrom = new String[len]; &
& & & & for(int i=0;i&i++){ &
& & & & & & userListViewFrom[i]=String.valueOf(i); &
& & & & } &
然后配置ListView的适配器 Adapter:
Java代码 &收藏代码
& & * 显示ListView组件.&
& &public void showListView(){ &
& & //用户列表ListView布局文件 &
& & int resource = R.layout.user_list_ &
& & //准备适配器数据源 &
& & createAdapterData(); &
& & //绑定适配器并返回 &
& & simpleAdapter = new SimpleAdapter(context, dataSimpleAdapter, resource, userListViewFrom, userListViewTo); &
& & //设置ListView组件的适配器. &
& & userList.setAdapter(simpleAdapter); &
& & * 生成适配器数据源&
& & * @param itemCount&
public void createAdapterData(){ &
& & //准备适配器内容 &
& & dataSimpleAdapter.clear();//确保数据源是空的 &
& & int itemLength = 3; &
& & for(int i=0;i&itemLi++){ &
& & & & Map&String,Object& map = new HashMap&String,Object&(); &
& & & & map.put(userListViewFrom[0], &数据列1-&+i); &
& & & & map.put(userListViewFrom[1], &数据列2-&+i); &
& & & & map.put(userListViewFrom[2], &数据列3-&+i); &
& & & & dataSimpleAdapter.add(map); &
最后,只要更新适配器simpleAdapter的数据源dataSimpleAdapter,然后执行方法:
Java代码 &收藏代码
//刷新listview &
simpleAdapter.notifyDataSetChanged(); &foreach(ListViewItem item in listView1.SelectedItems){
Console.WriteLine(items.Index);
Console.WriteLine(items.Name);}if(listView1.SelectedItems.Count
0)& {& this.listView1.SelectedItems[0].Tag.ToString();& this.listView1.SelectedItems[0].SubItems[1].T& this.listView1.SelectedItems[0].SubItems[2].T& }& private void ListView1_SelectedIndexChanged_UsingItems(&
object sender, System.EventArgs e)&
string s=&&;&
ListView.SelectedListViewItemCollection lst=&
this.ListView1.SelectedI&
foreach ( ListViewItem item in lst)&
s+= item.SubItems[1].Text+&,&;&
TextBox1.Text =&
}顶一下(0)0%踩一下(0)0%------分隔线------上一篇: 下一篇: 栏目列表推荐内容首先说下我的项目,开发一个WEB网站,是用模板做的,我负责登...
我做的是windows窗体编程! up 需要用到什么控件去连接ACCESS数据库...android笔记--在ListView中显示图片及ListView的动态刷新 - coolxing - ITeye技术网站
博客分类:
[coolxing按: 转载请注明作者和出处, 如有谬误, 欢迎在评论中指正.]
最近在做一个天气预报的小课题, 其中涉及到了ListView的动态刷新, 以及如何在ListView上显示图片.
1. 在ListView上显示图片.
为了实现这个功能, 首先需要定义一个布局文件, 用于显示ListView的每个Item. 比如list_item.xml:
&?xml version="1.0" encoding="utf-8"?&
&LinearLayout xmlns:android="/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent"&
&ImageView android:id="@+id/list_image"
android:layout_marginTop="6px" android:layout_marginBottom="6px"
android:layout_marginLeft="6px" android:layout_marginRight="6px"
android:layout_width="wrap_content" android:layout_height="wrap_content" /&
&TextView android:id="@+id/list_text"
android:layout_marginLeft="6px" android:layout_marginRight="6px" android:layout_gravity="center_vertical"
android:layout_width="fill_parent" android:layout_height="wrap_content" /&
&/LinearLayout&
接下来需要选择一个合适的adapter, 由于系统提供的adapter都无法满足显示图片的需求(这点我并不确定), 因此在这里我自定义了一个BaseAdapter的子类:
public class MyListAdapter extends BaseAdapter {
private List&WeatherInfomation&
public MyListAdapter(Activity context, List&WeatherInfomation& list) {
this.context =
this.list =
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = context.getLayoutInflater();
View itemView = inflater.inflate(R.layout.list_item, null);
WeatherInfomation info = list.get(position);
TextView textView = (TextView) itemView.findViewById(R.id.list_text);
ImageView imageView = (ImageView) itemView
.findViewById(R.id.list_image);
textView.setText(info.getWeatherText());
imageView.setImageBitmap(info.getWeatherBitmap());
return itemV
public int getCount() {
return list.size();
public Object getItem(int position) {
return list.get(position);
public long getItemId(int position) {
可以看到, 定义BaseAdapter的子类需要重写很多方法, 其他方法都不难, 关键就是getView()方法. getView()方法返回的itemView对象用来显示ListView的一个Item. 使用LayoutInflater类的inflater方法可以从ist_item.xml文件中解析出itemView对象, 但此时不可直接将itemView返回, 还需定义itemView中的ImageView和TextView的行为. 可以将itemView理解为ImageView和TextView的父控件. 源文件中涉及的WeatherInfomation是我定义的一个实体类, 代码如下:
public class WeatherInfomation {
* 代表天气状况的图片
private Bitmap weatherB
* 具体天气的文字说明
private String weatherT
public WeatherInfomation(Bitmap weatherBitmap, String weatherText) {
this.weatherBitmap = weatherB
this.weatherText = weatherT
public Bitmap getWeatherBitmap() {
return weatherB
public void setWeatherBitmap(Bitmap weatherBitmap) {
this.weatherBitmap = weatherB
public String getWeatherText() {
return weatherT
public void setWeatherText(String weatherText) {
this.weatherText = weatherT
接下来只需要创建出MyListAdapter对象并调用listview的setAdapter()方法就可以:
infomations = new ArrayList&WeatherInfomation&();
myListAdapter = new MyListAdapter(MainActivity.this, infomations);
listView.setAdapter(myListAdapter);
这样就可以在listview上显示图片了.
2. 很多朋友都知道, 想要动态刷新listview中的内容, 只要调用在数据发生改变之后调用adapter的notifyDataSetChanged()方法就可以了. 这里需要注意的是所谓的"数据发生改变"到底指的是什么, 比如说如下的代码:
infomations = new ArrayList&WeatherInfomation&();
infomations.add(new WeatherInfomation());
此时是否满足发生了数据改变的情形? 其实是没有的!(这个问题导致我浪费了很长时间, 我怎么花了一天时间才找出无法动态刷新listview的原因, 希望可以让看到的朋友避免这个问题). adapter在android中属于MVC中的mode, 它是UI界面和数据之间的桥梁, 而此时的数据, 并不是只infomations, 而是infomations这个引用所指向的WeatherInfomation集合, 因此重新创建一个 ArrayList&WeatherInfomation&并将其赋值给infomations改变的只是infomations的值,
而adapter关联的数据并没有发生变化. 后来我的处理代码是:
infomations.clear();
infomations.add(new WeatherInfomation());
这样就真正改变了adapter所关联的数据了.
浏览: 241753 次
来自: 北京
浏览量:38673
抄来抄去有意思么? 《effectivejava》
注:伪集群模式下clientPort各个节点也要不同
这不是windows的,作者就写着自己明白就行了
楼主你的代码还是有问题的:
List&String&g ...
没看出有什么用?

我要回帖

更多关于 listview 刷新 的文章

 

随机推荐