• ListView封装实现下拉刷新和上拉加载(方式2)(转载)


    转自:http://blog.csdn.net/jdfkldjlkjdl/article/details/70229465

    这次使用的是系统的SwipeRefreshLayout实现下拉刷新,和设置ListView的滑动监听判断是否滑动到最底部然后加载更多;如果想了解用另一种方式实现这个功能,请移步http://blog.csdn.net/jdfkldjlkjdl/article/details/51277941

    其中,SwipeRefreshLayout的几个方法功能如下:

    1、setOnRefreshListener():设置手势滑动监听器。
    2、setProgressBackgroundColor():设置进度圈的背景色。
    3、setColorSchemeResources():设置进度动画的颜色。
    4、setRefreshing():设置组件的刷洗状态。
    5、setSize():设置进度圈的大小

    下面说一下实现步骤:

    1.添加布局文件

    [html] view plain copy
     
     print?
    1. <android.support.v4.widget.SwipeRefreshLayout  
    2.         android:id="@+id/mSwipeRefreshLayout"  
    3.         android:layout_width="match_parent"  
    4.         android:layout_height="match_parent">  
    5.         <ListView  
    6.             android:id="@+id/mListView"  
    7.             android:layout_width="match_parent"  
    8.             android:layout_height="match_parent"  
    9.             android:divider="#cccccc"  
    10.             android:dividerHeight="1px"/>  
    11.     </android.support.v4.widget.SwipeRefreshLayout>  


    2.添加加载更多的布局文件load_more.xml

    [html] view plain copy
     
     print?
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    3.               android:id="@+id/ll_load_more"  
    4.               android:layout_width="match_parent"  
    5.               android:layout_height="wrap_content"  
    6.               android:orientation="vertical">  
    7.   
    8.     <LinearLayout  
    9.         android:layout_width="wrap_content"  
    10.         android:layout_height="wrap_content"  
    11.         android:layout_gravity="center_horizontal"  
    12.         android:layout_margin="10dip"  
    13.         android:gravity="center_vertical"  
    14.         android:orientation="horizontal">  
    15.   
    16.         <ProgressBar  
    17.             android:layout_width="30dp"  
    18.             android:layout_height="30dp"  
    19.             android:layout_gravity="center"  
    20.             />  
    21.   
    22.         <TextView  
    23.             android:layout_width="wrap_content"  
    24.             android:layout_height="wrap_content"  
    25.             android:layout_marginLeft="10dip"  
    26.             android:text="加载更多"  
    27.             android:textColor="#bbb"  
    28.             android:textSize="12sp"/>  
    29.     </LinearLayout>  
    30.   
    31. </LinearLayout>  


    3.绑定下拉刷新事件

    [java] view plain copy
     
     print?
    1. //设置手势监听  
    2.        mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {  
    3.            @Override  
    4.            public void onRefresh() {  
    5.                mHandler.sendEmptyMessageDelayed(REFRESH, 2000);  
    6.            }  
    7.        });  


    4.绑定上拉加载更多事件

    [java] view plain copy
     
     print?
    1. //给listview设置一个滑动的监听  
    2.        mListView.setOnScrollListener(new AbsListView.OnScrollListener() {  
    3.            int visibleLastIndex = 0;    //最后的可视项索引  
    4.            int visibleItemCount;        // 当前窗口可见项总数  
    5.   
    6.            //当滑动状态发生改变的时候执行  
    7.            public void onScrollStateChanged(AbsListView view, int scrollState) {  
    8.                switch (scrollState) {  
    9.                    //当不滚动的时候  
    10.                    case AbsListView.OnScrollListener.SCROLL_STATE_IDLE:  
    11.                        int itemsLastIndex = adapter.getCount() - 1;    //数据集最后一项的索引  
    12.                        int lastIndex = itemsLastIndex + 1;                //加上底部的loadMoreView项  
    13.                        //判断是否是最底部  
    14.                         //if (view.getLastVisiblePosition() == (view.getCount()) - 1) { //或者  
    15.                        if (visibleLastIndex == lastIndex) {  
    16.                            loadMoreView.setVisibility(View.VISIBLE);  
    17.                            mHandler.postDelayed(new Runnable() {  
    18.                                @Override  
    19.                                public void run() {  
    20.                                    //加载网络数据  
    21.                                    Message msg = new Message();  
    22.                                    msg.what = LOADMORE;  
    23.                                    msg.arg1 = visibleLastIndex - visibleItemCount + 1;  
    24.                                    mHandler.sendMessage(msg);  
    25.                                }  
    26.                            }, 2000);  
    27.                        }  
    28.                        break;  
    29.                }  
    30.            }  
    31.   
    32.            //正在滑动的时候执行  
    33.            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {  
    34.                this.visibleItemCount = visibleItemCount;  
    35.                visibleLastIndex = firstVisibleItem + visibleItemCount - 1;  
    36.            }  
    37.        });  



    完整的activity代码如下:

    [java] view plain copy
     
     print?
    1. package demo.xzy.qh.com.listviewpulltorefreshandloadmore;  
    2.   
    3. import android.app.Activity;  
    4. import android.graphics.Color;  
    5. import android.os.Bundle;  
    6. import android.os.Handler;  
    7. import android.os.Message;  
    8. import android.support.v4.widget.SwipeRefreshLayout;  
    9. import android.view.View;  
    10. import android.widget.AbsListView;  
    11. import android.widget.ArrayAdapter;  
    12. import android.widget.ListView;  
    13.   
    14. import java.util.ArrayList;  
    15. import java.util.List;  
    16.   
    17. /** 
    18.  * ListView下拉刷新,上拉加载demo 
    19.  */  
    20. public class MainActivity extends Activity {  
    21.     private SwipeRefreshLayout mSwipeRefreshLayout;  
    22.     private ListView mListView;  
    23.     private List<String> data = new ArrayList<>();  
    24.     private ArrayAdapter<String> adapter;  
    25.     private static final int REFRESH = 0x01;  
    26.     private static final int LOADMORE = 0x02;  
    27.     private View loadMoreView;  
    28.     private Handler mHandler = new Handler() {  
    29.         @Override  
    30.         public void handleMessage(Message msg) {  
    31.             super.handleMessage(msg);  
    32.             switch (msg.what) {  
    33.                 case REFRESH:  
    34.                     data.add(0, "刷新得到的数据");  
    35.                     adapter.notifyDataSetChanged();  
    36.                     mSwipeRefreshLayout.setRefreshing(false);  
    37.                     break;  
    38.                 case LOADMORE:  
    39.                     for (int x = 0; x < 5; x++) {  
    40.                         data.add(data.size(), "aaaaaa" + x);  
    41.                     }  
    42.                     adapter.notifyDataSetChanged();    //数据集变化后,通知adapter  
    43.                     int position = msg.arg1;  
    44.                     mListView.setSelection(position);    //设置选中项  
    45.                     loadMoreView.setVisibility(View.GONE);  
    46.                     break;  
    47.             }  
    48.         }  
    49.     };  
    50.   
    51.     @Override  
    52.     protected void onCreate(Bundle savedInstanceState) {  
    53.         super.onCreate(savedInstanceState);  
    54.         setContentView(R.layout.activity_main);  
    55.         for (int i = 0; i < 6; i++) {  
    56.             data.add("测试数据" + i);  
    57.         }  
    58.   
    59.         initView();  
    60.     }  
    61.   
    62.     private void initView() {  
    63.         mSwipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.mSwipeRefreshLayout);  
    64.         mListView = (ListView) findViewById(R.id.mListView);  
    65.         loadMoreView = getLayoutInflater().inflate(R.layout.load_more, null);  
    66.   
    67.         loadMoreView.setVisibility(View.GONE);  
    68.         mListView.addFooterView(loadMoreView);  
    69.         mListView.setFooterDividersEnabled(false);  
    70.   
    71.         //设置进度圈的大小;(这里面只有两个值SwipeRefreshLayout.LARGE和DEFAULT,后者是默认效果)  
    72.         mSwipeRefreshLayout.setSize(SwipeRefreshLayout.DEFAULT);  
    73.         //设置进度圈的背景色。这里随便给他设置了一个颜色:浅绿色  
    74.         mSwipeRefreshLayout.setProgressBackgroundColorSchemeColor(Color.CYAN);  
    75.         //设置进度动画的颜色。这里面最多可以指定四个颜色,我这也是随机设置的,大家知道怎么用就可以了  
    76.         mSwipeRefreshLayout.setColorSchemeResources(android.R.color.holo_orange_dark  
    77.                 , android.R.color.holo_blue_dark  
    78.                 , android.R.color.holo_red_dark  
    79.                 , android.R.color.widget_edittext_dark);  
    80.   
    81.         adapter = new ArrayAdapter<>(MainActivity.this, android.R.layout.simple_list_item_1, data);  
    82.         mListView.setAdapter(adapter);  
    83.   
    84.         //设置手势监听  
    85.         mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {  
    86.             @Override  
    87.             public void onRefresh() {  
    88.                 mHandler.sendEmptyMessageDelayed(REFRESH, 2000);  
    89.             }  
    90.         });  
    91.         //给listview设置一个滑动的监听  
    92.         mListView.setOnScrollListener(new AbsListView.OnScrollListener() {  
    93.             int visibleLastIndex = 0;    //最后的可视项索引  
    94.             int visibleItemCount;        // 当前窗口可见项总数  
    95.   
    96.             //当滑动状态发生改变的时候执行  
    97.             public void onScrollStateChanged(AbsListView view, int scrollState) {  
    98.                 switch (scrollState) {  
    99.                     //当不滚动的时候  
    100.                     case AbsListView.OnScrollListener.SCROLL_STATE_IDLE:  
    101.                         int itemsLastIndex = adapter.getCount() - 1;    //数据集最后一项的索引  
    102.                         int lastIndex = itemsLastIndex + 1;                //加上底部的loadMoreView项  
    103.                         //判断是否是最底部  
    104.                          //if (view.getLastVisiblePosition() == (view.getCount()) - 1) { //或者  
    105.                         if (visibleLastIndex == lastIndex) {  
    106.                             loadMoreView.setVisibility(View.VISIBLE);  
    107.                             mHandler.postDelayed(new Runnable() {  
    108.                                 @Override  
    109.                                 public void run() {  
    110.                                     //加载网络数据  
    111.                                     Message msg = new Message();  
    112.                                     msg.what = LOADMORE;  
    113.                                     msg.arg1 = visibleLastIndex - visibleItemCount + 1;  
    114.                                     mHandler.sendMessage(msg);  
    115.                                 }  
    116.                             }, 2000);  
    117.                         }  
    118.                         break;  
    119.                 }  
    120.             }  
    121.   
    122.             //正在滑动的时候执行  
    123.             public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {  
    124.                 this.visibleItemCount = visibleItemCount;  
    125.                 visibleLastIndex = firstVisibleItem + visibleItemCount - 1;  
    126.             }  
    127.         });  
    128.   
    129.     }  
    130. }  


    整个demo很简单,就两个布局文件和一个activity。

    至此,标题中提到的功能已经实现。欢迎留言指正。

  • 相关阅读:
    更改eclipse(myeclipse) author的默认名字(注释的作者)
    Myecplise Tomcat 启动很慢
    Java Enum 比较用 == 还是 eques
    Spring JDBC查询返回对象代码跟踪
    Apache启动失败(Windows 无法在本地计算机启动Apache2.2)
    SQLServer2008 统计表占用空间
    SET IDENTITY_INSERT ON/OFF 权限
    字母出现频率
    统计单词数
    查找最大元素
  • 原文地址:https://www.cnblogs.com/weizhxa/p/7474530.html
Copyright © 2020-2023  润新知