ListView的滑动加载

来源:互联网 发布:宰执天下知乎 编辑:程序博客网 时间:2024/05/16 13:58

项目结构如图所示:

 

项目主要包括一个activity和三个xml页面布局,代码如下:

MainActivity.java

  1. package com.android.ray.activity;  
  2.  
  3. import android.app.ListActivity;  
  4. import android.os.Bundle;  
  5. import android.os.Handler;  
  6. import android.view.LayoutInflater;  
  7. import android.view.View;  
  8. import android.view.ViewGroup;  
  9. import android.widget.AbsListView;  
  10. import android.widget.BaseAdapter;  
  11. import android.widget.Button;  
  12. import android.widget.LinearLayout;  
  13. import android.widget.ListView;  
  14. import android.widget.TextView;  
  15. import android.widget.AbsListView.OnScrollListener;  
  16.  
  17. public class MainActivity extends ListActivity implements OnScrollListener {  
  18.       
  19.     private ListView listView;  
  20.     //全局变量,用来记录ScrollView的滚动状态,1表示开始滚动,2表示正在滚动,0表示停止滚动  
  21.     private int scrollState;  
  22.     //可加载记录的条数  
  23.     private int count = 100;  
  24.     private int lastItem;  
  25.     //当前可见页面中的Item总数  
  26.     private int visibleItemCount;  
  27.       
  28.     private Button footerButton;  
  29.     private LinearLayout footerProgressBarLayout;  
  30.     private View view;  
  31.     private ListAdapter mAdapter = new ListAdapter();  
  32.       
  33.     public void onCreate(Bundle savedInstanceState) {  
  34.         super.onCreate(savedInstanceState);  
  35.         //加载主页面布局  
  36.         setContentView(R.layout.main);  
  37.           
  38.         LayoutInflater inflater = LayoutInflater.from(this);  
  39.         //加载底部布局  
  40.         view = inflater.inflate(R.layout.main_more, null);  
  41.         footerButton = (Button) view.findViewById(R.id.button);  
  42.         footerProgressBarLayout = (LinearLayout) view.findViewById(R.id.linearlayout);  
  43.         footerProgressBarLayout.setVisibility(View.GONE);  
  44.         //更多按钮点击事件  
  45.         footerButton.setOnClickListener(new View.OnClickListener() {  
  46.               
  47.             public void onClick(View v) {  
  48.                 if(lastItem == mAdapter.count && scrollState == OnScrollListener.SCROLL_STATE_IDLE){  
  49.                     //设置页面底部布局控件可见性  
  50.                     footerButton.setVisibility(View.GONE);  
  51.                     footerProgressBarLayout.setVisibility(View.VISIBLE);  
  52.                     if(mAdapter.count <= count){  
  53.                         //使用Handler动态加载数据  
  54.                         new Handler().postDelayed(new Runnable() {  
  55.                               
  56.                             public void run() {  
  57.                                 mAdapter.count += 10;  
  58.                                 mAdapter.notifyDataSetChanged();  
  59.                                 listView.setSelection(lastItem - visibleItemCount + 1);  
  60.                                 //获取数据成功设置Layout不可见,Button设为可见  
  61.                                 footerButton.setVisibility(View.VISIBLE);  
  62.                                 footerProgressBarLayout.setVisibility(View.GONE);  
  63.                             }  
  64.                         } , 2000);  
  65.                     }  
  66.                 }  
  67.             }  
  68.         });  
  69.           
  70.         listView = getListView();  
  71.         //将布局添加到ListView的Footer中  
  72.         listView.addFooterView(view);  
  73.         listView.setAdapter(mAdapter);  
  74.           
  75.         //设置滑动监听  
  76.         listView.setOnScrollListener(this);  
  77.     }  
  78.  
  79.     public void onScroll(AbsListView view, int firstVisibleItem,  
  80.             int visibleItemCount, int totalItemCount) {  
  81.         this.visibleItemCount = visibleItemCount;  
  82.         lastItem = firstVisibleItem + visibleItemCount - 1;  
  83.         if(mAdapter.count >= count){  
  84.             listView.removeFooterView(view);  
  85.         }  
  86.           
  87. //        boolean loadMore = firstVisibleItem + visibleItemCount >= totalItemCount;  
  88. //        if(loadMore){  
  89. //          mAdapter.count += visibleItemCount;  
  90. //          mAdapter.notifyDataSetChanged();  
  91. //        }  
  92.     }  
  93.  
  94.     public void onScrollStateChanged(AbsListView view, int scrollState) {  
  95.         this.scrollState = scrollState;  
  96.     }  
  97.       
  98.     /**  
  99.      * 数据匹配器  
  100.      * @author qin_lei  
  101.      *  
  102.      */ 
  103.     public class ListAdapter extends BaseAdapter{  
  104.  
  105.         int count = 10;  
  106.           
  107.         public int getCount() {  
  108.             return count;  
  109.         }  
  110.  
  111.         public Object getItem(int position) {  
  112.             return position;  
  113.         }  
  114.  
  115.         public long getItemId(int position) {  
  116.             return position;  
  117.         }  
  118.  
  119.         public View getView(int position, View convertView, ViewGroup parent) {  
  120.             LayoutInflater inflater = LayoutInflater.from(MainActivity.this);  
  121.             View view = inflater.inflate(R.layout.main_item, null);  
  122.             TextView tv = (TextView) view.findViewById(R.id.tv);  
  123.             tv.setText("Hello " + position);  
  124.             return view;  
  125.         }  
  126.     }  

主要布局文件代码如下:

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.     <ListView            
  7.         android:id="@android:id/list"          
  8.         android:layout_width="fill_parent"           
  9.         android:layout_height="wrap_content"/> 
  10. </LinearLayout> 

main_more.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.     <Button          
  7.         android:id="@+id/button"          
  8.         android:layout_width="fill_parent"           
  9.         android:layout_height="wrap_content"           
  10.         android:text="更多"/>      
  11.     <LinearLayout          
  12.         android:orientation="horizontal"          
  13.         android:layout_width="fill_parent"          
  14.         android:layout_height="wrap_content"          
  15.         android:gravity="center"          
  16.         android:id="@+id/linearlayout">          
  17.         <ProgressBar              
  18.             android:layout_width="wrap_content"              
  19.             android:layout_height="wrap_content"/>          
  20.         <TextView              
  21.             android:layout_width="wrap_content"              
  22.             android:layout_height="wrap_content"              
  23.             android:text="正在获取..."/>          
  24.     </LinearLayout> 
  25. </LinearLayout> 

ListView单个显示item布局main_item.xml

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"      
  3.     android:orientation="horizontal"      
  4.     android:layout_width="fill_parent"      
  5.     android:layout_height="fill_parent">      
  6.     <ImageView          
  7.         android:layout_width="wrap_content"          
  8.         android:layout_height="wrap_content"          
  9.         android:scaleType="fitXY"          
  10.         android:src="@drawable/icon_head"/>      
  11.     <TextView          
  12.         android:id="@+id/tv"          
  13.         android:layout_width="fill_parent"           
  14.         android:layout_height="20dp"           
  15.         android:text="@string/hello"/> 
  16. </LinearLayout> 

项目运行结果如下图:

点击更多,十条,依次类推:

 

原创粉丝点击