Android应用开发中,采用ListView组件来展示数据是很常用的功能,当一个应用要展现很多的数据时,一般情况下都不会把所有的数据一次就展示出来,而是通过分页的形式来展示数据,个人觉得这样会有更好的用户体验。因此,很多应用都是采用分批次加载的形式来获取用户所需的数据。例如:微博客户端可能会在用户滑动至列表底端时自动加载下一页数据,也可能在底部放置一个"查看更多"按钮,用户点击后,加载下一页数据。一种情况在服务器实现实现分页功能,当ListView滑动到最后的时候,请求下一页,还有一种情况是在客户端控制请求的数量。

我这里只是用本地数据简单的模拟分页加载,主要是思路。首先是XML布局,只有一个ListView,

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><ListViewandroid:id="@+id/listview"android:layout_width="match_parent"android:layout_height="wrap_content"></ListView></LinearLayout>

然后是ListView中item的布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:padding="10dp" ><ImageViewandroid:id="@+id/item_iv_img"android:layout_width="105dp"android:layout_height="70dp"android:layout_centerVertical="true"android:contentDescription="@null"android:scaleType="fitXY"android:src="@drawable/empty_photo" /><TextViewandroid:id="@+id/item_tv_title"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentTop="true"android:layout_marginLeft="20dp"android:layout_toRightOf="@id/item_iv_img"android:text="流光溢彩下的经典传承"android:textColor="#313131"android:textSize="18sp" /><TextViewandroid:id="@+id/item_tv_time"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignLeft="@id/item_tv_title"android:layout_alignParentBottom="true"android:text="2013-02-12"android:textColor="#909090"android:textSize="14sp" /><TextViewandroid:id="@+id/item_tv_count"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:layout_alignParentRight="true"android:text="213"android:textColor="#909090"android:textSize="14sp" /><ImageViewandroid:layout_width="16dp"android:layout_height="15dp"android:layout_alignParentBottom="true"android:layout_marginBottom="1dp"android:layout_marginRight="5dp"android:layout_toLeftOf="@id/item_tv_count"android:contentDescription="@null"android:scaleType="fitCenter"android:src="@drawable/news_ic_comment" /></RelativeLayout>

当ListView滑动到底部的时候有一个FootView的效果,就是一个转圈的动画效果,这个布局是

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/listview_loading_llyt"android:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"android:padding="10dp"android:orientation="horizontal" ><ProgressBarstyle="@android:style/Widget.ProgressBar.Inverse"android:layout_width="29.83dip"android:layout_height="29.83dip"android:background="@null"android:indeterminateDrawable="@drawable/progress_rotate_large" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="10dp"android:text="加载更多" /></LinearLayout>

在ProgressBar中自定义旋转动画是progerss_rotate_large.xml,它的效果是以中心为圆点,匀速旋转

<?xml version="1.0" encoding="utf-8"?>
<animated-rotate xmlns:android="http://schemas.android.com/apk/res/android"android:drawable="@drawable/progress_rotate"android:pivotX="50%"android:pivotY="50%">
</animated-rotate>

实现分页加载其实主要靠LivtView中onScroll和onScrollStateChanged这两个方法,其中onScroll方法是监听滑动过程,只要滑动就会触发这个方法。 onScrollStateChanged是监听滑动状态的改变,比如滑动到底部或者顶部时就会触发这个方法。然后是一大段代码,不过都是很简单的,大概思路是在onScroll中判断是否是滑动到最后一行,如果是最后一行就在onScrollStateChanged中用AsyncTask模拟加载下一页

public class MainActivity extends AppCompatActivity {private ListView listView;private List<String> list;private LinearLayout linearLayout;private boolean isLastRow = false;// 是否还有更多数据private boolean isMore = true;// 是否正在加载数据private boolean isLoading = false;private MyAdapter adapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();}private void initView() {listView = (ListView) findViewById(R.id.listview);linearLayout = (LinearLayout) LayoutInflater.from(this).inflate(R.layout.listview_loading_view, null);list = new ArrayList<>();for (int i = 0; i < 20; i++) {String str = "这是一条新闻" + i;list.add(str);}//注意添加FooterView要在setAdapter之前listView.addFooterView(linearLayout);adapter = new MyAdapter();listView.setAdapter(adapter);listView.setOnScrollListener(new AbsListView.OnScrollListener() {@Overridepublic void onScrollStateChanged(AbsListView view, int scrollState) {//判断是最后一行并且停止滑动的时候加载更多if (isLastRow && scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE) {//判断当还有更多数据并且当前页面不是正在加载时,用AsyncTask模拟加载下一页if (!isLoading && isMore) {new AsyncTask<Void, Void, Void>() {@Overrideprotected Void doInBackground(Void... params) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}list.addAll(list);return null;}@Overrideprotected void onPostExecute(Void aVoid) {super.onPostExecute(aVoid);isLoading = false;isMore = false;adapter.notifyDataSetChanged();}}.execute();} else {listView.removeFooterView(linearLayout);Toast.makeText(MainActivity.this, "已没有更多数据", Toast.LENGTH_SHORT).show();}isLastRow = false;}}//判断是否滑动到最后一行,用当前屏幕可见第一行的行数加上可见屏幕上显示的函数,如果等于总行数说明是最后一行了@Overridepublic void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {if (firstVisibleItem + visibleItemCount == totalItemCount && totalItemCount > 0) {isLastRow = true;}}});}class MyAdapter extends BaseAdapter {@Overridepublic int getCount() {return list.size();}@Overridepublic Object getItem(int position) {return list.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder;if (convertView == null) {holder = new ViewHolder();convertView = LayoutInflater.from(MainActivity.this).inflate(R.layout.news_item, null);holder.titleText = (TextView) convertView.findViewById(R.id.item_tv_title);convertView.setTag(holder);} else {holder = (ViewHolder) convertView.getTag();}holder.titleText.setText(list.get(position));return convertView;}class ViewHolder {private TextView titleText;}}
}

最后效果是这样的:

listview分页加载的实现相关推荐

  1. 基于Android官方AsyncListUtil优化经典ListView分页加载机制(二)

    基于Android官方AsyncListUtil优化经典ListView分页加载机制(二) 我写的附录文章1,介绍了如何使用Android官方的分页加载框架AsyncListUtil优化改进常见的Re ...

  2. 分组显示的ListView分页加载数据

    参考:  http://www.cnblogs.com/qianxudetianxia/archive/2011/06/07/2074326.html 分组的ListView的拖拽  http://w ...

  3. Android中ListView分页加载数据

    熟悉Android的朋友们都知道,不管是微博客户端还是新闻客户端,都离不开列表组件,可以说列表组件是Android数据展现方面最重要的组件,我们今天就要讲一讲列表组件ListView加载数据的相关内容 ...

  4. listview分页加载

    熟悉Android的朋友们都知道,不管是微博客户端还是新闻客户端,都离不开列表组件,可以说列表组件是Android数据展现方面最重要的组件,我们今天就要讲一讲列表组件ListView加载数据的相关内容 ...

  5. Android Room联合AsyncListUtil实现RecyclerView分页加载ORM数据

    Android Room联合AsyncListUtil实现RecyclerView分页加载ORM数据 我之前写了一系列关于AsyncListUtil实现RecyclerView和ListView的分页 ...

  6. listView分批和分页加载数据

    在Android应用程序中,有时候会向listView中加载很多数据,向listView中加载数据是一个耗时的过程,加载过多的数据用户停留在listView上,一直等待,给用户的体验特别不好,比如向服 ...

  7. List 分页加载数据控制机制

    分页加载是一种应用很广泛的数据展示控制机制,相信绝大多数开发者对于这一套机制都非常熟悉.这篇文章的主要目的结合实际的使用场景,对以往在开发中遇到一些概念进行梳理,归纳的同时加深理解,也希望能帮助更多刚 ...

  8. php下拉上滑分页,Flutter实现下拉刷新 上拉分页加载更多

    一.Flutter实现下拉刷新和上拉分页加载更多 在Flutter官方sdk中给我们提供了下拉刷新的组件RefreshIndicator.但是没有提供上拉分页加载更多的组件.但是在Flutter Li ...

  9. 分页加载PullToRefreshLayout+PullableListView

    PullToRefreshLayout+PullableListView实现分页加载功能 1.修改布局文件(添加下拉刷新和上拉加载的布局) <com.abcaaaaa.zyypay.ui.wid ...

  10. ZMY_自定义分页加载

    //自定义分页加载 package com.example.pagedemo; import java.util.ArrayList; import android.app.Activity; imp ...

最新文章

  1. 79. Word Search
  2. java gui 颜色从html_Java GUI显示网页并返回HTML
  3. TRILL技术白皮书
  4. WPF加载程序集中字符串资源
  5. 【阿里云API】 阿里云API调用的若干说明
  6. [VNCFT2021]gocalc0复现
  7. WIN10 vnc 与Jeson ubuntu18.04 vncserver 远程控制的实现(亲测有效)
  8. ant引入html页面,antdesign 中 使用 iconfont symbol方式引入图标不展示
  9. python2.7安装教程选哪个版本运行ride_RobotFramework-RIDE环境搭建二:Robot Framework-RIDE安装过程以及踩雷点...
  10. @RequestBody应用,requestbody
  11. pysimplegui 显示 html,PySimpleGUI 的第一个桌面软件
  12. 被3整除判断准则的证明
  13. Scala的sealed关键字
  14. java 正则表达式 unicode_java正则表达式中的POSIX 字符类和Unicode 块和类别的类介绍...
  15. visual studio插件开发dll类库免加全局缓存处理办法
  16. 百家姓中国心头像大全
  17. hive会产生大量的tmp文件
  18. vue中改变v-html元素样式
  19. 跨境电商平台有哪些?各国电商平台及品类概览
  20. 电脑桌面右键无新建选项

热门文章

  1. 深度学习之MAML笔记
  2. Python好酷|allpairspy一款高效的正交实验法生成用例工具
  3. 手机连接蓝牙扫码枪_如何正确使用蓝牙扫描枪
  4. 今日头条阅读量怎么刷_自动刷今日头条阅读量 头条号自己刷阅读量
  5. 5, Swift tableView点击收起展开的效果
  6. PS零基础自学笔记:常见操作方法记录(去水印、抠图、调色调)
  7. Unity3D C#之IL2CPP Windows端隐藏任务栏图标并添加至托盘
  8. 单核性能强悍,Core i3 这次又要“默秒全”?
  9. 需求与商业模式创新-需求考试复习
  10. [知乎] 开放世界游戏中的大地图背后有哪些实现技术?