android使用PullToRefresh框架实现ListView下拉刷新上拉加载更多

本文实例为大家分享了Android实现ListView下拉刷新上拉加载更多的具体代码,供大家参考,具体内容如下

其实谷歌官方目前已经推出ListView下拉刷新框架SwipeRefreshLayout,想了解的朋友可以点击 android使用SwipeRefreshLayout实现ListView下拉刷新上拉加载了解一下;

大家不难发现当你使用SwipeRefreshLayout下拉的时候布局文件不会跟着手势往下滑,而且想要更改这个缺陷好像非常不容易。

虽然SwipeRefreshLayout非常简单易懂,但是需求需要下拉刷新的时候跟着手势下滑就不能用SwipeRefreshLayout了;

上面图片效果使用的是PullToRefresh框架,在我的工程里面没有导入类库和jar包,而是把下拉刷新功能直接抽取出来使用;
当下拉的时候回调监听,在抽取完下拉刷新功能的基础上实现上拉加载更多功能实现也非常简单,所以顺手写上了;
我是从github上下载的Android-PullToRefresh-master框架,在library中抽取的;
首先需要复制的类大概有十个左右:

然后跟进报错查看需要什么文件就复制什么文件;把错误搞定之后首先来看下布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical"> 

 <!-- 我们添加了一个属性:ptr:ptrMode="both" ,意思:上拉和下拉都支持。
  可选值为:disabled(禁用下拉刷新),pullFromStart(仅支持下拉刷新),
  pullFromEnd(仅支持上拉刷新),both(二者都支持),manualOnly(只允许手动触发) -->
 <!--
  ptr:ptrAnimationStyle="rotate"
  FlipLoadingLayout为iOS风格的箭头颠倒的刷新动画
  ptr:ptrAnimationStyle="flip"
  RotateLoadingLayout为android风格的图片旋转动画 -->
 <com.ptrflv.www.pulltorefreshlistview.PullToRefreshListView
  xmlns:ptr="http://schemas.android.com/apk/res-auto"
  android:id="@+id/pull_to_refresh_listview"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  ptr:ptrMode="both"
  ptr:ptrAnimationStyle="flip"
   /> 

</LinearLayout>

值得注意的是默认情况下下拉刷新的执行动画中显示的文本是英文,这里我们需要手动修改pull_refresh_strings.xml中的内容:

<?xml version="1.0" encoding="utf-8"?>
<resources> 

 <!-- 上拉刷新 -->
 <!-- …代表三个点 ... -->
 <string name="pull_to_refresh_pull_label">向下拉刷新…</string>
 <string name="pull_to_refresh_release_label">松开更新…</string>
 <string name="pull_to_refresh_refreshing_label">正在加载…</string> 

 <!-- 下拉加载更多 -->
 <string name="pull_to_refresh_from_bottom_pull_label">向下拉加载更多…</string>
 <string name="pull_to_refresh_from_bottom_release_label">松开加载更多…</string>
 <string name="pull_to_refresh_from_bottom_refreshing_label">正在加载…</string> 

</resources>

下面是调用下拉刷新和上下加载更多的代码:

public class MainActivity extends Activity { 

 private PullToRefreshListView pullToRefreshListView;
 //adapter的数据源
 private List<String> numList=new ArrayList<String>();
 private ArrayAdapter<String> arrayAdapter; 

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  pullToRefreshListView=(PullToRefreshListView) findViewById(R.id.pull_to_refresh_listview);
  //初始化数据
  for(int x=0;x<18;x++){
   numList.add(""+x);
  } 

  arrayAdapter = new ArrayAdapter<String>(this, R.layout.item_listview,R.id.textview,numList);
  pullToRefreshListView.setAdapter(arrayAdapter); 

  //设定刷新监听
  pullToRefreshListView.setOnRefreshListener(new OnRefreshListener<ListView>() { 

   @Override
   public void onRefresh(PullToRefreshBase<ListView> refreshView) { 

    String label = DateUtils.formatDateTime(getApplicationContext(), System.currentTimeMillis(),
       DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_ABBREV_ALL); 

     // 显示最后更新的时间
     refreshView.getLoadingLayoutProxy() .setLastUpdatedLabel(label); 

     //代表下拉刷新
     if(refreshView.getHeaderLayout().isShown()){ 

      new Thread(){
       public void run() {
        try {
         sleep(1000); 

         handler.sendEmptyMessage(99); 

        } catch (InterruptedException e) {
         e.printStackTrace();
        }
       };
      }.start();
     } 

     //代表下拉刷新
     if(refreshView.getFooterLayout().isShown()){
      new Thread(){
       public void run() {
        try {
         sleep(1000); 

         handler.sendEmptyMessage(98); 

        } catch (InterruptedException e) {
         e.printStackTrace();
        }
       };
      }.start();
     } 

   }
  }); 

 } 

 private Handler handler=new Handler(){
  public void handleMessage(android.os.Message msg) { 

   if(msg.what==99){
    numList.add(0, "英雄联盟");
    arrayAdapter.notifyDataSetChanged();
    //关闭刷新的动画
    pullToRefreshListView.onRefreshComplete();
   } 

   if(msg.what==98){
    numList.add(numList.size(), "魔兽世界");
    arrayAdapter.notifyDataSetChanged();
    //关闭刷新的动画
    pullToRefreshListView.onRefreshComplete();
   } 

  };
 }; 

}

在判断上拉刷新和下拉加载的时候
refreshView.getFooterLayout().isShown()
refreshView.getHeaderLayout().isShown()会报错,因为PullToRefreshBase这两个方法默认不是共有方法,我们需要手动该更为public

源码下载

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android下拉刷新上拉加载更多左滑动删除

    一.前言 老规矩,别的不说,这demo是找了很相关知识集合而成的,可以说对我这种小白来说是绞尽脑汁!程序员讲的是无图无真相! 现在大家一睹为快! 二.比较关键的还是scroller这个类的 package com.icq.slideview.view; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.util.TypedValue;

  • Android ListView实现上拉加载更多和下拉刷新功能

    本文实例为大家介绍了Android ListView下拉刷新功能的实现方法和功能,供大家参考,具体内容如下 1.ListView优化方式 界面缓存:ViewHolder+convertView 分页加载:上拉刷新 图片缓存 快速滑动ListView禁止刷新 2.效果 3.上拉加载更多原理及实现 当我们手指滑动到listview最后位置的时候,我们触发加载数据的方法.这触发之前我们需要做一些工作,包括: 如何判断滑动到最后? 如何避免重复加载数据? 加载之后如何刷新界面? 1).界面实现AbsLi

  • Android RecyclerView 上拉加载更多及下拉刷新功能的实现方法

    RecyclerView 已经出来很久了,但是在项目中之前都使用的是ListView,最近新的项目上了都大量的使用了RecycleView.尤其是瀑布流的下拉刷新,网上吧啦吧啦没有合适的自己总结了一哈. 先贴图上来看看: 使用RecyclerView实现上拉加载更多和下拉刷新的功能我自己有两种方式: 1.使用系统自带的Android.support.v4.widget.SwipeRefreshLayout这个控价来实现. 2.自定义的里面带有RecyleView的控件. 使用RecycleVie

  • Android实现上拉加载更多以及下拉刷新功能(ListView)

    首先为大家介绍Andorid5.0原生下拉刷新简单实现. 先上效果图: 相对于上一个19.1.0版本中的横条效果好看了很多.使用起来也很简单. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/container" and

  • Android XListView下拉刷新和上拉加载更多

    市面上有好多的类比ListView刷新数据的开源框架,如:v4包自带的SwipeRefreshLayout ,以及集ListView.GridView甚至WebView于一身的Pulltorefresh等等.前述的两个开源框架目前使用也算频繁.有兴趣的读者可以自行搜索,当然有时间一定回来对所有的使用方式做一个汇总和比较.今天介绍的这款框架,专门针对ListView做下拉刷新与上拉加载的,如果单单是ListView就显得更加简单方便易于理解. 1.首先引入xListView_lib库到自己的Dem

  • Android RecyclerView下拉刷新和上拉加载更多

    今天终于有点时间,来写了一下: 为RecyclerView实现下拉刷新和上拉加载更多.今天会在前面的两篇文章的基础上: RecyclerView系列之(1):为RecyclerView添加Header和Footer RecyclerView系列之(2):为RecyclerView添加分隔线 继续讲述RecyclerView中一些常用组件的实现下拉刷新和上拉加载更多的功能. 在现在的Android手机应用中,几乎每一个APP都有下拉刷新和上拉加载更多的功能,它们的重要性不言而喻. 先不多说,先看效

  • Android RecyclerView实现下拉刷新和上拉加载更多

    使用官方的刷新控件SwipeRefreshLayout来实现下拉刷新,当RecyclerView滑到底部实现下拉加载(进度条效果用RecyclerView加载一个布局实现) 需要完成控件的下拉监听和上拉监听,其中,下拉监听通过SwipRefreshLayout的setOnRefreshListener()方法监听,而上拉刷新,需要通过监听列表的滚动,当列表滚动到底部时触发事件,具体代码如下 主布局 <?xml version="1.0" encoding="utf-8&

  • Android中Listview下拉刷新和上拉加载更多的多种实现方案

    listview经常结合下来刷新和上拉加载更多使用,本文总结了三种常用到的方案分别作出说明. 方案一:添加头布局和脚布局 android系统为listview提供了addfootview和addheadview两个API.这样可以直接自定义一个View,以添加视图的形式实现下来刷新和上拉加载. 实现步骤    1.创建一个类继承ListView:class PullToRefreshListView extends ListView: 2.在构造方法中添加HeadView:addHeaderVi

  • Android 仿硅谷新闻下拉刷新/上拉加载更多

    1.添加加载更多布局 1_初始化和隐藏代码 在RefreshListView构造方法中调用 private void initFooterView(Context context) { View footerView = View.inflate(context, R.layout.refresh_listview_footer, null); //隐藏代码 footerView.measure(0, 0); int footerViewHeight = footerView.getMeasur

  • Android实践之带加载效果的下拉刷新上拉加载更多

    前言 之前写的一个LoadingBar,这次把LoadingBar加到下拉刷新的头部.从头写一个下拉刷新,附赠上拉加载更多.下面话不多说了,来一起看看详细的介绍吧. 效果图: 实现过程 首先是自定义属性,attrs.xml中定义头部的高度和上下的padding. ####attrs.xml#### <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable

随机推荐