Android动态更新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  用户之前触摸滑动,现在正在滑行,直到停止

示例代码:

  1. package dyingbleed.iteye;   
  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.LayoutInflater;   
  9. import android.view.View;   
  10. import android.view.ViewGroup;   
  11. import android.widget.AbsListView;   
  12. import android.widget.BaseAdapter;   
  13. import android.widget.ListView;   
  14. import android.widget.TextView;   
  15.   
  16. public class Main extends ListActivity {   
  17.        
  18.     private ListView listView;   
  19.     private MyListViewAdapter adapter;   
  20.        
  21.     private int scrollState;   
  22.        
  23.     private View footerView;   
  24.        
  25.     @Override  
  26.     public void onCreate(Bundle savedInstanceState) {   
  27.         super.onCreate(savedInstanceState);   
  28.         setContentView(R.layout.main);   
  29.            
  30.         listView = getListView();   
  31.            
  32.         footerView = LayoutInflater.from(this).inflate(R.layout.progress, null);   
  33.                    
  34.         listView.addFooterView(footerView); //在ListView底部添加正在加载视图     
  35.         //注意:addFooterView方法需要在调用setListAdapter方法前调用!   
  36.         adapter = new MyListViewAdapter();   
  37.         setListAdapter(adapter);   
  38.         getListView().setOnScrollListener(new AbsListView.OnScrollListener() {   
  39.                
  40.             @Override  
  41.             public void onScrollStateChanged(AbsListView view, int scrollState) {   
  42.                 Main.this.scrollState = scrollState;   
  43.             }   
  44.                
  45.             @Override  
  46.             public void onScroll(AbsListView view, int firstVisibleItem,   
  47.                     int visibleItemCount, int totalItemCount) {   
  48.                 int lastVisibleItem = firstVisibleItem + visibleItemCount - 1//可视的最后一个列表项的索引   
  49.                 /*  
  50.                  * 当列表正处于滑动状态且滑动到列表底部时,执行  
  51.                  * */  
  52.                 if(Main.this.scrollState != AbsListView.OnScrollListener.SCROLL_STATE_IDLE   
  53.                         && lastVisibleItem == totalItemCount - 1) {   
  54.                     /*  
  55.                      * 执行线程,睡眠5秒钟后添加10个列表项  
  56.                      * */  
  57.                     new Thread() {   
  58.                            
  59.                         private Handler handler = new Handler() {   
  60.   
  61.                             @Override  
  62.                             public void handleMessage(Message msg) {   
  63.                                 super.handleMessage(msg);   
  64.                                 adapter.count += 10;   
  65.                                 adapter.notifyDataSetChanged();   
  66.                             }   
  67.                                
  68.                         };   
  69.   
  70.                         @Override  
  71.                         public void run() {   
  72.                             super.run();   
  73.                             try {   
  74.                                 sleep(5000);   
  75.                                 handler.sendEmptyMessage(0);   
  76.                             } catch (InterruptedException e) {   
  77.                                 e.printStackTrace();   
  78.                             }   
  79.                         }   
  80.                            
  81.                     }.start();   
  82.                        
  83.                 }   
  84.             }   
  85.         });   
  86.     }   
  87.        
  88.     private class MyListViewAdapter extends BaseAdapter {   
  89.            
  90.         int count = 50//初始列表项数量   
  91.   
  92.         @Override  
  93.         public int getCount() {   
  94.             return count;   
  95.         }   
  96.   
  97.         @Override  
  98.         public Object getItem(int position) {   
  99.             return position;   
  100.         }   
  101.   
  102.         @Override  
  103.         public long getItemId(int position) {   
  104.             return position;   
  105.         }   
  106.   
  107.         @Override  
  108.         public View getView(int position, View convertView, ViewGroup parent) {   
  109.             TextView result = (TextView) convertView;   
  110.             if(result == null) {   
  111.                 result = new TextView(Main.this);   
  112.                 result.setTextAppearance(Main.this, android.R.style.TextAppearance_Large);   
  113.                 AbsListView.LayoutParams layoutParams = new AbsListView.LayoutParams(AbsListView.LayoutParams.FILL_PARENT,   
  114.                         AbsListView.LayoutParams.WRAP_CONTENT);   
  115.                 result.setLayoutParams(layoutParams);   
  116.                 result.setGravity(Gravity.CENTER);   
  117.             }   
  118.             result.setText("Item "+(position+1));   
  119.             return result;   
  120.         }   
  121.            
  122.     }   
  123. }  

运行结果

Android动态更新ListView

相关内容