zoukankan      html  css  js  c++  java
  • Android之分页加载数据

    基本的原理和我的上一篇随笔“Android之下拉刷新ListView”差不多,代码里面有注释,这里就不废话了,直接上代码。

    自定义的分页显示ListView——PagedListView.java代码如下:

     1 public class PagedListView extends ListView implements OnScrollListener {
     2     private View footer; // 底部布局
     3     private LayoutInflater inflater;
     4     private int totalItemCount; // 总的Item的数量
     5     private int lastVisibleItemIndex; // 最后一个可见的Item的索引
     6     private boolean isLoading; // 是否正在加载
     7     private ListViewLoadListener listener; // 加载更多数据的回掉接口
     8 
     9     public PagedListView(Context context) {
    10         this(context, null);
    11     }
    12 
    13     public PagedListView(Context context, AttributeSet attrs) {
    14         this(context, attrs, 0);
    15     }
    16 
    17     public PagedListView(Context context, AttributeSet attrs, int defStyleAttr) {
    18         super(context, attrs, defStyleAttr);
    19         initView(context);
    20     }
    21 
    22     // 加载底部布局到ListView中
    23     private void initView(Context context) {
    24         inflater = LayoutInflater.from(context);
    25         footer = inflater.inflate(R.layout.sideworks_layout_footer, null);
    26         footer.findViewById(R.id.control_layout_footer).setVisibility(View.GONE);
    27         this.addFooterView(footer);
    28         this.setOnScrollListener(this);
    29     }
    30 
    31     @Override
    32     public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
    33         this.lastVisibleItemIndex = firstVisibleItem + visibleItemCount;
    34         this.totalItemCount = totalItemCount;
    35     }
    36 
    37     @Override
    38     public void onScrollStateChanged(AbsListView view, int scrollState) {
    39         if (totalItemCount == lastVisibleItemIndex && scrollState == SCROLL_STATE_IDLE) {
    40             if (!isLoading) {
    41                 isLoading = true;
    42                 footer.findViewById(R.id.control_layout_footer).setVisibility(View.VISIBLE);
    43                 listener.loadData(); // 调用接口中的回调方法进行数据更新
    44             }
    45         }
    46     }
    47 
    48     // 加载更多数据的回掉接口
    49     public interface ListViewLoadListener {
    50         public void loadData();
    51     }
    52 
    53     public void setListViewLoadInterface(ListViewLoadListener listener) {
    54         this.listener = listener;
    55     }
    56 
    57     // 数据加载完成之后,隐藏footer布局
    58     public void onLoadComplete() {
    59         isLoading = false;
    60         footer.findViewById(R.id.control_layout_footer).setVisibility(View.GONE);
    61     }
    62 }

    底部布局sideworks_layout_footer.xml的代码如下:

     1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     2     android:layout_width="match_parent"
     3     android:layout_height="wrap_content" >
     4 
     5     <!-- 这里必须要套一层LinearLayout,不然在代码中设置Visibility为Gone时底部总是会有一部分空白区域 -->
     6     <LinearLayout
     7         android:id="@+id/control_layout_footer"
     8         android:layout_width="match_parent"
     9         android:layout_height="wrap_content"
    10         android:background="#e7e7e7"
    11         android:gravity="center"
    12         android:orientation="horizontal"
    13         android:paddingBottom="10.0dip"
    14         android:paddingTop="10.0dip" >
    15 
    16         <ProgressBar
    17             style="?android:attr/progressBarStyleSmall"
    18             android:layout_width="wrap_content"
    19             android:layout_height="wrap_content" />
    20 
    21         <TextView
    22             android:layout_width="wrap_content"
    23             android:layout_height="wrap_content"
    24             android:layout_marginLeft="15.0dip"
    25             android:text="@string/str_footer_tip"
    26             android:textColor="#777777" />
    27     </LinearLayout>
    28 
    29 </LinearLayout>

    主页面布局activity_main.xml代码如下:

     1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     2     xmlns:tools="http://schemas.android.com/tools"
     3     android:layout_width="match_parent"
     4     android:layout_height="match_parent" >
     5 
     6     <com.view.PagedListView
     7         android:id="@+id/control_main_listview"
     8         android:layout_width="match_parent"
     9         android:layout_height="match_parent" />
    10 
    11 </RelativeLayout>

    主界面MainActivity.java代码如下:

     1 public class MainActivity extends Activity implements ListViewLoadListener {
     2     private PagedListView listView;
     3     private ArrayAdapter<String> listAdapter;
     4     private List<String> listData;
     5 
     6     @Override
     7     protected void onCreate(Bundle savedInstanceState) {
     8         super.onCreate(savedInstanceState);
     9         setContentView(R.layout.activity_main);
    10         initView();
    11     }
    12 
    13     private void initView() {
    14         listView = (PagedListView) findViewById(R.id.control_main_listview);
    15         listView.setListViewLoadInterface(this);
    16         listData = new ArrayList<String>();
    17         for (int i = 0; i < 10; i++) {
    18             listData.add("This is an initial data.");
    19         }
    20         listAdapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_expandable_list_item_1, listData);
    21         listView.setAdapter(listAdapter);
    22     }
    23 
    24     @Override
    25     public void loadData() {
    26         new Handler().postDelayed(new Runnable() {
    27             public void run() {
    28                 // 增加两条数据并通知ListView进行数据的更新
    29                 for (int i = 0; i < 2; i++) {
    30                     listData.add("This is a new data.");
    31                 }
    32                 listAdapter.notifyDataSetChanged();
    33                 listView.onLoadComplete();
    34             }
    35         }, 2000);
    36     }
    37 }
  • 相关阅读:
    2015-01-27-从实验出发理解buffer与cache区别-吴伟顺
    【实习记】2014-09-26恢复linux下误删的ntfs盘中的文件
    【实习记】2014-09-24万事达卡bin查询项目总结
    【实习记】2014-09-04浏览代码查middle资料+总结我折腾过的源码浏览器
    【实习记】2014-09-01从复杂到简单:一行命令区间查重+长整型在awk中的bug
    【实习记】2014-08-29算法学习Boyer-Moore和最长公共子串(LCS)
    【实习记】2014-08-28知值求范围问题
    【实习记】2014-08-27堆排序理解总结+使用typedef指代函数指针
    【实习记】2014-08-26都是回车惹的祸——shell脚本必须是unix行尾
    【实习记】2014-08-24实习生无法映射磁盘替代方案rsync+非默认端口22设置
  • 原文地址:https://www.cnblogs.com/blog-wzy/p/5313528.html
Copyright © 2011-2022 走看看