Android中下拉加载的实现

Android中下拉加载的实现

                                                                                                                     2013-08-04      16:12:21

  最近在做项目的过程中,需要用到下拉加载的功能。总结了一下下拉加载实现的实现。

  首先,我们在main.xml中加入一个listview

 

 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     android:layout_width="fill_parent"
 3     android:layout_height="fill_parent"
 4     android:orientation="vertical">
 5 
 6     <ListView
 7         android:layout_width="fill_parent"
 8         android:layout_height="wrap_content"
 9         android:id="@+id/lvNews"/>
10 
11 </LinearLayout>


  然后,设置listview中每一个item的布局item.xml

 

 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     android:layout_width="fill_parent"
 3     android:layout_height="fill_parent"
 4     android:orientation="vertical">
 5 
 6     <TextView
 7         android:layout_width="fill_parent"
 8         android:layout_height="wrap_content"
 9         android:id="@+id/newstitle"/>
10 
11     <TextView
12         android:layout_width="fill_parent"
13         android:layout_height="wrap_content"
14         android:id="@+id/newscontent"/>
15 </LinearLayout>

 以上的对item的布局实现的是每一个item中放置了一上一下的两个Textview

 最后我们设置一个Button,这个Button加在listview的下面,是用来实现点击加载的  loadmore.xml

 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     android:layout_width="fill_parent"
 3     android:layout_height="fill_parent">
 4 
 5     <Button
 6         android:layout_width="fill_parent"
 7         android:layout_height="wrap_content"
 8         android:id="@+id/loadMoreButton"
 9         android:text="查看更多..."/>
10 
11 </LinearLayout>

 

  接下来是下拉加载的实现代码,首先,类要继承OnScrollListener,继承该接口需要实现两个重载方法:onScrollStateChanged()、onScroll()。下面直接上代码,代码中有详细的注解。

 

  1 public class PaginationListViewActivity extends Activity implements OnScrollListener {
  2     
  3     private ListView listView;  
  4     private int visibleLastIndex = 0;   //最后的可视项索引  
  5     private int visibleItemCount;       // 当前窗口可见项总数  
  6     private int datasize = 38;          //模拟数据集的条数
  7     private PaginationAdapter adapter;  
  8     private View loadMoreView;  
  9     private Button loadMoreButton;  
 10     private Handler handler = new Handler(); 
 11     
 12     /** Called when the activity is first created. */
 13     @Override
 14     public void onCreate(Bundle savedInstanceState) {
 15         super.onCreate(savedInstanceState);
 16         setContentView(R.layout.activity_pagination_list_view);
 17         
 18         loadMoreView = getLayoutInflater().inflate(R.layout.loadmore, null);
 19         loadMoreButton = (Button)loadMoreView.findViewById(R.id.loadMoreButton);
 20         loadMoreButton.setOnClickListener(new View.OnClickListener() {
 21             
 22             @Override
 23             public void onClick(View v) {
 24                 loadMoreButton.setText("正在加载中...");   //设置按钮文字
 25                 handler.postDelayed(new Runnable() {
 26                     
 27                     @Override
 28                     public void run() {
 29                         loadMoreData();
 30                         adapter.notifyDataSetChanged();
 31                         loadMoreButton.setText("查看更多...");  //恢复按钮文字
 32                     }
 33                 },2000);

 34                 
 35             }
 36         });
 37         
 38         listView = (ListView)findViewById(R.id.lvNews);
 39         listView.addFooterView(loadMoreView);    //设置列表底部视图
 40         initializeAdapter();
 41         listView.setAdapter(adapter);
 42         listView.setOnScrollListener(this);
 43     }
 44     
 45     @Override
 46     public void onScrollStateChanged(AbsListView view, int scrollState) {
 47         int itemsLastIndex = adapter.getCount()-1;  //数据集最后一项的索引  
 48         int lastIndex = itemsLastIndex + 1;
 49         if (scrollState == OnScrollListener.SCROLL_STATE_IDLE
 50                 && visibleLastIndex == lastIndex) {
 51             // 如果是自动加载,可以在这里放置异步加载数据的代码
 52         }
 53     }
 54 
 55 
 56     @Override
 57     public void onScroll(AbsListView view, int firstVisibleItem,
 58             int visibleItemCount, int totalItemCount) {
 59         this.visibleItemCount = visibleItemCount;
 60         visibleLastIndex = firstVisibleItem + visibleItemCount - 1;
 61         
 62         Log.e("========================= ","========================");
 63         Log.e("firstVisibleItem = ",firstVisibleItem+"");
 64         Log.e("visibleItemCount = ",visibleItemCount+"");
 65         Log.e("totalItemCount = ",totalItemCount+"");
 66         Log.e("========================= ","========================");
 67         
 68         //如果所有的记录选项等于数据集的条数,则移除列表底部视图
 69         if(totalItemCount == datasize+1){
 70             listView.removeFooterView(loadMoreView);
 71             Toast.makeText(this, "数据全部加载完!", Toast.LENGTH_LONG).show();
 72         }
 73     }
 74     
 75     /**
 76      * 初始化ListView的适配器
 77      */
 78     private void initializeAdapter(){
 79         List<News> news = new ArrayList<News>();
 80         for(int i=1;i<=10;i++){
 81             News items = new News();
 82             items.setTitle("Title"+i);
 83             items.setContent("This is News Content"+i);
 84             news.add(items);
 85         }
 86         adapter = new PaginationAdapter(news);
 87     }
 88     
 89     /**
 90      * 加载更多数据
 91      */
 92     private void loadMoreData(){
 93         int count = adapter.getCount();
 94         
 95         if(count+10 <= datasize){
 96             for(int i=count+1; i<=count+10; i++){
 97                 News item = new News();
 98                 item.setTitle("Title"+i);
 99                 item.setContent("This is News Content"+i);
100                 adapter.addNewsItem(item);
101             }
102         }else{
103             for(int i=count+1; i<=datasize; i++){
104                 News item = new News();
105                 item.setTitle("Title"+i);
106                 item.setContent("This is News Content"+i);
107                 adapter.addNewsItem(item);
108             }
109         }
110         
111     }
112     
113     
114     class PaginationAdapter extends BaseAdapter{
115         
116         List<News> newsItems;
117         
118         public PaginationAdapter(List<News> newsitems){
119             this.newsItems = newsitems;
120         }
121 
122         @Override
123         public int getCount() {
124             return newsItems.size();
125         }
126 
127         @Override
128         public Object getItem(int position) {
129             return newsItems.get(position);
130         }
131 
132         @Override
133         public long getItemId(int position) {
134             return position;
135         }
136 
137         @Override
138         public View getView(int position, View view, ViewGroup parent) {
139             if(view == null){
140                 view = getLayoutInflater().inflate(R.layout.list_item, null);
141             }
142             
143             //新闻标题
144             TextView tvTitle = (TextView)view.findViewById(R.id.newstitle);
145             tvTitle.setText(newsItems.get(position).getTitle());
146             //新闻内容
147             TextView tvContent = (TextView)view.findViewById(R.id.newscontent);
148             tvContent.setText(newsItems.get(position).getContent());
149             
150             return view;
151         }
152         
153         /**
154          * 添加数据列表项
155          * @param newsitem
156          */
157         public void addNewsItem(News newsitem){
158             newsItems.add(newsitem);
159         }
160         
161     }
162 
163 }


 通过以上的代码就可以实现下拉加载的效果了,显示效果如下图所示。当点击查看更多时listview会在后面加载10条记录,直到记录加载完毕,加载按钮会消失,并且提示用户已经加载完毕。

 

 

posted @ 2013-08-04 16:21  蠢驴  阅读(726)  评论(0)    收藏  举报