Android listView滑动刷新代码(分页功能)

三个代码都是从网上下载来的,但是导入到eclipse里面以后,中文注释出现乱码,所以我文章里面的注释有很多可能是自己添加的,如有不准确的地方,敬请谅解和留言告知!

这个例子是listview一开始显示10个,下拉listview,就会更新添加列表,知道第50个。

       首先,布局文件是非常简单,可以直接看代码,首先,先看下自定义的一个简单的Adapter:

[java] view
plain
copy

  1. class listViewAdapter extends BaseAdapter {  
  2.         int count = 10;  
  3.   
  4.         public int getCount() {  
  5.             return count;  
  6.         }  
  7.   
  8.         public Object getItem(int pos) {  
  9.             return pos;  
  10.         }  
  11.   
  12.         public long getItemId(int pos) {  
  13.             return pos;  
  14.         }  
  15.   
  16.         public View getView(int pos, View v, ViewGroup p) {  
  17.             TextView view;  
  18.             if (v==null) {  
  19.                 view = new TextView(MainActivity.this);  
  20.             }  
  21.             else {  
  22.                 view=(TextView)v;  
  23.             }  
  24.             view.setText("ListItem " + pos);  
  25.             view.setTextSize(20f);  
  26.             view.setGravity(Gravity.CENTER);  
  27.             view.setHeight(60);  
  28.             return view;  
  29.         }  
  30.     }  

在这里初始化的count,就是listview的item个数是十个,当滑动的时候,再动态增加。

在看一下,在oncreate方法里面通过代码把控件添加进去。

[java] view
plain
copy

  1. //线性布局  
  2.         LinearLayout layout = new LinearLayout(this);  
  3.        //设置布局 水平方向  
  4.         layout.setOrientation(LinearLayout.HORIZONTAL);  
  5.          //进度条  
  6.         progressBar = new ProgressBar(this);  
  7.          //进度条显示位置  
  8.         progressBar.setPadding(0, 0, 15, 0);  
  9.         //把进度条加入到layout中  
  10.         layout.addView(progressBar, mLayoutParams);  
  11.         //文本内容  
  12.         TextView textView = new TextView(this);  
  13.         textView.setText("加载中。。。");  
  14.         textView.setGravity(Gravity.CENTER_VERTICAL);  
  15.         //把文本加入到layout中  
  16.         layout.addView(textView, FFlayoutParams);  
  17.         //设置layout的重力方向,即对齐方式是  
  18.         layout.setGravity(Gravity.CENTER);  
  19.           
  20.         ///设置ListView的页脚layout  
  21.         loadingLayout = new LinearLayout(this);  
  22.         loadingLayout.addView(layout, mLayoutParams);  
  23.         loadingLayout.setGravity(Gravity.CENTER);  
  24.           
  25.         //得到一个ListView用来显示条目  
  26.         listView = getListView();  
  27.         //添加到页脚显示  
  28.         listView.addFooterView(loadingLayout);  
  29.         //给ListView添加适配器  
  30.         setListAdapter(adapter);  
  31.         //给ListView注册滚动监听  
  32.         listView.setOnScrollListener(this);  

这里面用到了两个layout属性,它们的声明是:

[java] view
plain
copy

  1. /** 
  2.      * 设置布局显示属性 
  3.      */  
  4.     private LayoutParams mLayoutParams =new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT);  
  5.     /** 
  6.      * 设置布局显示目标最大化属性 
  7.      */  
  8.     private LayoutParams FFlayoutParams =new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT,LinearLayout.LayoutParams.FILL_PARENT);  
  9.       

       最重要的代码如下:重写了onScroll和onScrollStateChanged两个方法:

[java] view
plain
copy

  1. @Override  
  2.     public void onScroll(AbsListView v, int firstVisibleItem,int visibleItemCount, int totalItemCount) {  
  3.         Log.v("@@@@@@", "Scroll>>>first: " + firstVisibleItem + ", visible: " + visibleItemCount + ", total: " + totalItemCount);  
  4.         lastItem = firstVisibleItem + visibleItemCount - 1;  
  5.         Log.i("@@@@@@" , "Scroll>>>lastItem:" + lastItem);  
  6.         //显示50条ListItem,即0-49,因为onScroll是在“滑动”执行过之后才触发,所以用adapter.count<=41作条件  
  7.         if (adapter.count<=41) {  
  8.             if (firstVisibleItem+visibleItemCount==totalItemCount) {  
  9.                 adapter.count += 10;  
  10.                 adapter.notifyDataSetChanged();  
  11.                 listView.setSelection(lastItem);  
  12.                 Log.v("@@@@@@","onScroll  "+adapter.count);  
  13.                 int currentPage=adapter.count/10;  
  14.                 Toast.makeText(getApplicationContext(), "第"+currentPage+"页", Toast.LENGTH_LONG).show();  
  15.             }  
  16.         }else {  
  17.              listView.removeFooterView(loadingLayout);   
  18.         }         
  19.     }  
  20.     @Override  
  21.     public void onScrollStateChanged(AbsListView v, int state) {  
  22.         if (lastItem == adapter.count && state == OnScrollListener.SCROLL_STATE_IDLE) {  
  23.             Log.v("@@@@@@", "ScrollStateChanged>>>state:"+state+"lastItem:" + lastItem);  
  24.             if (adapter.count<=41) {  
  25.                 adapter.count += 10;  
  26.                 adapter.notifyDataSetChanged();  
  27.                 Log.v("@@@@@@","onScrollStateChanged  "+adapter.count);  
  28.             }  
  29.         }  
  30.     }  

先说下onScroll方法的几个参数的意义:

      官方解释如下:

  • view
  • The view whose scroll state is being reported
  • firstVisibleItem
  • the index of the first visible cell (ignore if visibleItemCount == 0)
  • visibleItemCount
  • the number of visible cells
  • totalItemCount
  • the number of items in the list adaptor
  1. firstVisibleItem:当前能看见的第一个列表项ID(从0开始)    
  2. visibleItemCount:当前能看见的列表项总数(小半个也算,部分显示的都算)   
  3. totalItemCount:列表项共数

[java] view
plain
copy

  1. lastItem = firstVisibleItem + visibleItemCount - 1;  

获取最下面那个item的id(position)值.

[java] view
plain
copy

  1. if (firstVisibleItem+visibleItemCount==totalItemCount) {  
  2.                 adapter.count += 10;  
  3.                 adapter.notifyDataSetChanged();  
  4.                 listView.setSelection(lastItem);  
  5.                 Log.v("@@@@@@","onScroll  "+adapter.count);  
  6.                 int currentPage=adapter.count/10;  
  7.                 Toast.makeText(getApplicationContext(), "第"+currentPage+"页", Toast.LENGTH_LONG).show();  
  8.             }  

如果listitem个数不足50,继续添加,并把listview的焦点放到最下面的item上。

这样的话,整个就比较容易理解了。

在listview里面还有几个方法:

listView.getFirstVisiblePosition()是获得现在屏幕第一个ListItem(第一个ListItem部分显示也算)

listView.getLastVisiblePosition()现时屏幕最后一个ListItem(最后ListItem要完全显示出来才算)

时间: 2024-10-03 00:21:54

Android listView滑动刷新代码(分页功能)的相关文章

Android ListView滑动删除操作(SwipeListView)_Android

新版本的微信和QQ上引入的滑动删除功能是现在比较流行的一个功能.其实这个滑动删除的控件,github上已经有了,是一个热门的开源框架SwipeListView.不过,这个SwipeListView是一个framelayout,即是一个两层的布局,上面的布局front覆盖了下面的布局back,滑动的时候则会滑开front,这样下面的back就显示出来了.但是看了一下微信的滑动删除好像不是这样的,感觉更像是一个超出了屏幕的单层布局,滑动的时候是右边超出屏幕的button进入屏幕,猜测应该不是使用Sw

listview-关于Android ListView滑动监听

问题描述 关于Android ListView滑动监听 我想问一个关于ListView的问题,就是setItemSelectedListener无法触发怎么处理,点击事件和长按事件都能触发,有那个好心人帮忙一下,给下setItemSelectedListener部分的代码,我主要是想对listView滑动到了哪里做一个监听 解决方案 能把你的代码发过来吗?有时间我可以看一下 解决方案二: 无法触发报错吗?没报错的话,是不是API版本的问题. 解决方案三: 是 listview 的item 布局的

Android Listview 滑动过程中提示图片重复错乱的原因及解决方法_Android

主要分析Android中Listview滚动过程造成的图片显示重复.错乱.闪烁的原因及解决方法,顺便跟进Listview的缓存机制. 1.原因分析 Listview item 缓存机制:为了使得性能更优,Listview会缓存行item(某行对应的view).listview通过adapter的getview函数获得每行的item.滑动过程中, a.如果某行item已经划出屏幕,若该item不在缓存内,则put进缓存,否则更新缓存: b.获取滑入屏幕的行item之前会先判断缓存中是否有可用的it

Android ListView 单条刷新方法实践及原理解析

对于使用listView配合adapter进行刷新的方法大家都不陌生,先刷新adapter里的数据,然后调用notifydatasetchange通知listView刷新界面. 方法虽然简单,但这里面涉及到一个效率的问题,调用notifydatasetchange其实会导致adpter的getView方法被多次调用 (画面上能显示多少就会被调用多少次),如果是很明确的知道只更新了list中的某一个项的数据(比如用户点击list某一项后更新该项的显示状态,或者 后台回调更新list某一项,等等),

listview 数据阴影-android listview 滑动数据阴影

问题描述 android listview 滑动数据阴影 我的listview,在显示数据时,偶尔会有滑动数据有阴影的现象.如图所示.一旦有阴影就只能重启才会好.请问高手可能怎么回事! 解决方案 Android[ ListView]滑动数据加载android listView滑动加载数据Android ListView 去阴影 解决方案二: listview有去掉阴影的属性,你查查就可以了 解决方案三: android:id=""@+id/id_main_listview"&

Android ListView滑动改变标题栏背景渐变效果

先上ListView滑动改变标题栏背景渐变效果图,透明转变成不透明效果: 图1: 图2: 图3: 图4: 我用的是小米Note手机,状态栏高度是55px,后面会提到,这里先做个说明: 下面的内容包含了所有代码和一些测试数据: 代码: 代码很简单,也做了注释,这里就不废话了. 先来布局文件: activity的布局 activity_main_10 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/androi

android listview局部刷新和模拟应用下载

在android开发中,listview是比较常用的一个组件,在listview的数据需要更新的时候,一般会用notifyDataSetChanged()这个函数,但是它会更新listview中所有可视范围内的item,这样对性能肯定会有影响.比较常见的情景是android应用商店中的下载列表,当我们下载一款游戏的时候,只需要更新这款游戏对应的进度就可以了.本文就来模拟android应用商店的游戏下载,实现对listview的局部刷新,只实现一个简单的demo,不去真的下载文件. 1. 首先来创

Android Listview滑动时不加载数据 停止时加载数据

本文实例为大家分享了Listview滑动时不加载数据 停止时加载数据的具体代码,供大家参考,具体内容如下 数据源配置(Adapter) package com.zhengsonglan.listview_loading.adapter; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import

Android ListView滑动过程中图片显示重复错乱闪烁的原因及解决方法

主要分析Android ListView滚动过程中图片显示重复.错乱.闪烁的原因及解决方法,顺带提及ListView的缓存机制. 1.原因分析 ListView item缓存机制:为了使得性能更优,ListView会缓存行item(某行对应的View).ListView通过adapter的getView函数获得每行的item.滑动过程中, a. 如果某行item已经滑出屏幕,若该item不在缓存内,则put进缓存,否则更新缓存: b. 获取滑入屏幕的行item之前会先判断缓存中是否有可用的ite