Android中动态更新ListView(转)

在使用ListView时,会遇到当ListView列表滑动到最底端时,添加新的列表项的问题,本文通过代码演示如何动态的添加新的列表项到ListView中。
实现步骤:调用ListView的setOnScrollListener()方法设置滑动监听器,实现OnScrollListener接口的方法,判断当列表滑动到最低端时,加载新的列表项。
其中OnScrollListener接口需要实现如下两个方法:
onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount)
view 报告滑动状态的视图
firstVisibleItem 可视的第一个列表项的索引
visibleItemCount 可视的列表项个数
totalItemCount 总共的列表项个数
onScrollStateChanged(AbsListView view, int scrollState)
view 报告滑动状态的视图
scrollState 滑动状态
滑动状态包括
SCROLL_STATE_IDLE : 0  视图没有滑动
SCROLL_STATE_TOUCH_SCROLL : 1  用户正在触摸滑动,手指仍在屏幕上
SCROLL_STATE_FLING : 2  用户之前触摸滑动,现在正在滑行,直到停止
下面通过代码给大家演示效果
main.xml

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:orientation="vertical"
 4     android:layout_width="fill_parent"
 5     android:layout_height="fill_parent"
 6     >
 7     <ListView
 8         android:id="@id/android:list"
 9         android:layout_width="match_parent"
10         android:layout_height="match_parent"
11         android:layout_weight="1"
12         android:drawSelectorOnTop="false"
13         />
14 </LinearLayout>

footer.xml

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:layout_width="fill_parent"
 4     android:layout_height="wrap_content"
 5     android:gravity="center"
 6     android:orientation="horizontal"
 7     >
 8     <ProgressBar
 9         android:id="@+id/progressbar"
10         android:layout_width="wrap_content"
11         android:layout_height="wrap_content"
12         style="\?android:attr/progressBarStyleSmall"
13         />
14     <TextView
15         android:layout_width="wrap_content"
16         android:layout_height="wrap_content"
17         android:textSize="20.0sp"
18         android:text="正在加载..."
19         />
20 </LinearLayout>

MainActicity.xml

  1 package com.szy.listview;
  2 
  3 import android.app.ListActivity;
  4 import android.os.Bundle;
  5 import android.os.Handler;
  6 import android.os.Message;
  7 import android.view.Gravity;
  8 import android.view.View;
  9 import android.view.ViewGroup;
 10 import android.widget.AbsListView;
 11 import android.widget.BaseAdapter;
 12 import android.widget.ListView;
 13 import android.widget.TextView;
 14 
 15 /**
 16  *@author coolszy
 17  *@date 2012-3-27
 18  *@blog http://blog.92coding.com
 19  */
 20 public class MainActivity extends ListActivity
 21 {
 22     private ListView mListView;
 23     private CustomAdapter mAdapter;
 24     private int mScrollState;
 25     private View mFooter;
 26 
 27     @Override
 28     public void onCreate(Bundle savedInstanceState)
 29     {
 30         super.onCreate(savedInstanceState);
 31         setContentView(R.layout.main);
 32 
 33         //获取ListView
 34         mListView = getListView();
 35         //根据footer.xml描述创建View
 36         mFooter = getLayoutInflater().inflate(R.layout.footer, null);
 37         // 在ListView底部添加正在加载视图
 38         //注意:addFooterView方法需要在调用setListAdapter方法前调用!
 39         mListView.addFooterView(mFooter);
 40         mAdapter = new CustomAdapter();
 41         setListAdapter(mAdapter);
 42         //给ListView添加滚动监听器
 43         mListView.setOnScrollListener(new AbsListView.OnScrollListener()
 44         {
 45             @Override
 46             public void onScrollStateChanged(AbsListView view, int scrollState)
 47             {
 48                 //记录当前状态
 49                 mScrollState = scrollState;
 50             }
 51 
 52             @Override
 53             public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount)
 54             {
 55                 // 可视的最后一个列表项的索引
 56                 int lastVisibleItem = firstVisibleItem + visibleItemCount - 1;
 57                 //当列表正处于滑动状态且滑动到列表底部时,执行
 58                 if (mScrollState != AbsListView.OnScrollListener.SCROLL_STATE_IDLE
 59                     && lastVisibleItem == totalItemCount - 1)
 60                 {
 61                     // 执行线程,模拟睡眠5秒钟后添加10个列表项
 62                     new Thread()
 63                     {
 64 
 65                         private Handler handler = new Handler()
 66                         {
 67 
 68                             @Override
 69                             public void handleMessage(Message msg)
 70                             {
 71                                 super.handleMessage(msg);
 72                                 //增加Item数量
 73                                 mAdapter.count += 10;
 74                                 //通知数据集变化
 75                                 mAdapter.notifyDataSetChanged();
 76                             }
 77 
 78                         };
 79 
 80                         @Override
 81                         public void run()
 82                         {
 83                             super.run();
 84                             try
 85                             {
 86                                 sleep(5000);
 87                                 handler.sendEmptyMessage(0);
 88                             } catch (InterruptedException e)
 89                             {
 90                                 e.printStackTrace();
 91                             }
 92                         }
 93 
 94                     }.start();
 95                 }
 96             }
 97         });
 98     }
 99 
100     private class CustomAdapter extends BaseAdapter
101     {
102         // 初始列表项数量
103         int count = 20; 
104 
105         @Override
106         public int getCount()
107         {
108             return count;
109         }
110 
111         @Override
112         public Object getItem(int position)
113         {
114             return position;
115         }
116 
117         @Override
118         public long getItemId(int position)
119         {
120             return position;
121         }
122 
123         @Override
124         public View getView(int position, View convertView, ViewGroup parent)
125         {
126             TextView result = (TextView) convertView;
127             //动态创建TextView添加早ListView中
128             if (result == null)
129             {
130                 result = new TextView(MainActivity.this);
131                 result.setTextAppearance(MainActivity.this, android.R.style.TextAppearance_Large);
132                 AbsListView.LayoutParams layoutParams = new AbsListView.LayoutParams
133                                                         (AbsListView.LayoutParams.FILL_PARENT,
134                                                         AbsListView.LayoutParams.WRAP_CONTENT);
135                 result.setLayoutParams(layoutParams);
136                 result.setGravity(Gravity.CENTER);
137             }
138             result.setText("第 " + (position + 1)+"行");
139             return result;
140         }
141     }
142 }

效果预览
若水工作室

Android中动态更新ListView | 若水工作室 http://www.92coding.com/blog/index.php/archives/382.html

posted @ 2013-08-04 16:55  欢醉  阅读(1765)  评论(0编辑  收藏