PullrefreshLibrary(PullToRefreshGridView)上拉刷新,下拉加载+异步AsyncTask(二)

原创 2016年06月01日 10:32:32

第三方架包下载地址:https://github.com/chrisbanes/Android-PullToRefresh
解压后使用其中的library
Activity_main.xml

<com.handmark.pulltorefresh.library.PullToRefreshGridView  
        xmlns:ptr="http://schemas.android.com/apk/res-auto"  
        android:id="@+id/g_gv"  
        android:layout_width="fill_parent"  
        android:layout_height="fill_parent"  
        android:columnWidth="100dp"  
        android:gravity="center_horizontal"  
        android:horizontalSpacing="1dp"  
        android:numColumns="auto_fit"  
        android:stretchMode="columnWidth"  
        android:verticalSpacing="1dp"  
        ptr:ptrDrawable="@drawable/ic_launcher"  
        ptr:ptrMode="both" /> </RelativeLayout>

MainActivity.class
我们添加了一个属性:ptr:ptrMode=”both” ,意思:上拉和下拉都支持。

可选值为:disabled(禁用下拉刷新),pullFromStart(仅支持下拉刷新),pullFromEnd(仅支持上拉刷新),both(二者都支持),manualOnly(只允许手动触发)

当然了,如果你不喜欢在布局文件中指定,完全可以使用代码设置,在onCreate里面写:mPullRefreshListView.setMode(Mode.BOTH);//设置你需要的模式

当然了这是旋转的效果,一般常用的还有,一个箭头倒置的效果,其实也很简单,一个属性:

ptr:ptrAnimationStyle=”flip”

去掉 ptr:ptrDrawable=”@drawable/ic_launcher”这个属性,如果你希望用下图默认的箭头,你也可以自定义。

ptr:ptrAnimationStyle的取值:flip(翻转动画), rotate(旋转动画) 。

ptr:ptrDrawable则就是设置图标了。

设置了模式为双向都支持,当然必须为上拉和下拉分别设置回调,请看下面的代码:

package com.example.libin_yuekao;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;

import android.app.Activity;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.view.Menu;
import android.widget.GridView;
import android.widget.Toast;

import com.example.adapter.Gadapter;
import com.example.bean.Book;
import com.example.bean.Book.Bdata;
import com.google.gson.Gson;
import com.handmark.pulltorefresh.library.PullToRefreshBase;
import com.handmark.pulltorefresh.library.PullToRefreshBase.Mode;
import com.handmark.pulltorefresh.library.PullToRefreshBase.OnRefreshListener2;
import com.handmark.pulltorefresh.library.PullToRefreshGridView;

public class SecondsActivity extends  Activity {

    private PullToRefreshGridView gv;
    private ArrayList<Bdata> list=new ArrayList< Bdata>();
    private Gadapter adapter;
    private int start=0;
    private int down=0;

    private MyAsyncTask m;
    private String ca;
    private HttpURLConnection conn;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_seconds);

        Intent intent = getIntent();
        ca = intent.getStringExtra("ca");

        gv = (PullToRefreshGridView) findViewById(R.id.g_gv);
        m = new MyAsyncTask();
        m.execute("http://apis.juhe.cn/goodbook/query?key=3e100e799d37b42ff2cdbecc67ecb12b&catalog_id="+ca+"&rn=0&rn=5" );
        gv.setOnRefreshListener(new OnRefreshListener2<GridView>()  {

            @Override
            public void onPullDownToRefresh(PullToRefreshBase refreshView) {
                // TODO Auto-generated method stub
                list.clear();
                start+=1;
                down=start;
                m = new MyAsyncTask();
                m.execute("http://apis.juhe.cn/goodbook/query?key=3e100e799d37b42ff2cdbecc67ecb12b&catalog_id="+ca+"&rn="+start+"&rn=5");
            }

            @Override
            public void onPullUpToRefresh(PullToRefreshBase refreshView) {
                // TODO Auto-generated method stub
                down-=1;
                if(down>=0){
                    m = new MyAsyncTask();
                    m.execute("http://apis.juhe.cn/goodbook/query?key=3e100e799d37b42ff2cdbecc67ecb12b&catalog_id="+ca+"&rn="+down+"&rn=5");
                }else{
                    Toast.makeText(SecondsActivity.this, "到底喽", 0).show();
                    gv.onRefreshComplete();
                }

            }
        });         
    }
    class MyAsyncTask extends AsyncTask<String, String, ArrayList<Bdata>>{


        @Override
        protected ArrayList<Bdata> doInBackground(String... params) {
            // TODO Auto-generated method stub
            return getUrlData(params[0]);
        }
        @Override
        protected void onPostExecute(ArrayList<Bdata> result) {
            super.onPostExecute(result);
            if(adapter==null){
                adapter = new Gadapter(SecondsActivity.this,result);
                gv.setAdapter(adapter);
            } else{
                adapter.notifyDataSetChanged();
                gv.onRefreshComplete();
            }

        }

    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.second, menu);
        return true;
    }
    public ArrayList<Bdata> getUrlData(String url) {
        try {
            conn = (HttpURLConnection) new URL(url).openConnection();
            conn.setReadTimeout(6000);
            conn.setConnectTimeout(6000);
            conn.setRequestMethod("GET");
            if(conn.getResponseCode()==200){
                InputStream is = conn.getInputStream();
                int len;
                byte[] arr=new byte[1024];
                ByteArrayOutputStream baos=new ByteArrayOutputStream();
                while((len=is.read(arr))!=-1){
                    baos.write(arr, 0, len);
                }
                Gson g=new Gson();
                Book b=g.fromJson(baos.toString(), Book.class);
                list.addAll(b.result.data);
            }
        } catch ( Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return list;
    }
}

1、自定义下拉指示器文本内容等效果

可以在初始化完成mPullRefreshListView后,通过mPullRefreshListView.getLoadingLayoutProxy()可以得到一个ILoadingLayout对象,这个对象可以设置各种指示器中的样式、文本等。

在CODE上查看代码片派生到我的代码片

    ILoadingLayout startLabels = mPullRefreshListView  
                    .getLoadingLayoutProxy();  
            startLabels.setPullLabel("你可劲拉,拉...");// 刚下拉时,显示的提示  
            startLabels.setRefreshingLabel("好嘞,正在刷新...");// 刷新时  
            startLabels.setReleaseLabel("你敢放,我就敢刷新...");// 下来达到一定距离时,显示的提示  

如果你比较细心,会发现,前面我们设置上次刷新时间已经用到了:

// Update the LastUpdatedLabel
refreshView.getLoadingLayoutProxy().setLastUpdatedLabel(label);

现在的效果是:
这里写图片描述
这里写图片描述
这里写图片描述
2、默认是上拉和下拉的字同时改变的,如果我希望单独改变呢?

    private void initIndicator()  
        {  
            ILoadingLayout startLabels = mPullRefreshListView  
                    .getLoadingLayoutProxy(true, false);  
            startLabels.setPullLabel("你可劲拉,拉...");// 刚下拉时,显示的提示  
            startLabels.setRefreshingLabel("好嘞,正在刷新...");// 刷新时  
            startLabels.setReleaseLabel("你敢放,我就敢刷新...");// 下来达到一定距离时,显示的提示  

            ILoadingLayout endLabels = mPullRefreshListView.getLoadingLayoutProxy(  
                    false, true);  
            endLabels.setPullLabel("你可劲拉,拉2...");// 刚下拉时,显示的提示  
            endLabels.setRefreshingLabel("好嘞,正在刷新2...");// 刷新时  
            endLabels.setReleaseLabel("你敢放,我就敢刷新2...");// 下来达到一定距离时,显示的提示  
        }  

mPullRefreshListView.getLoadingLayoutProxy(true, false);接收两个参数,为true,false返回设置下拉的ILoadingLayout;为false,true返回设置上拉的。
3、常用的一些属性

当然了,pull-to-refresh在xml中还能定义一些属性:

ptrMode,ptrDrawable,ptrAnimationStyle这三个上面已经介绍过。

ptrRefreshableViewBackground 设置整个mPullRefreshListView的背景色

ptrHeaderBackground 设置下拉Header或者上拉Footer的背景色

ptrHeaderTextColor 用于设置Header与Footer中文本的颜色

ptrHeaderSubTextColor 用于设置Header与Footer中上次刷新时间的颜色

ptrShowIndicator如果为true会在mPullRefreshListView中出现icon,右上角和右下角,挺有意思的。

ptrHeaderTextAppearance , ptrSubHeaderTextAppearance分别设置拉Header或者上拉Footer中字体的类型颜色等等。

ptrRotateDrawableWhilePulling当动画设置为rotate时,下拉是是否旋转。

ptrScrollingWhileRefreshingEnabled刷新的时候,是否允许ListView或GridView滚动。觉得为true比较好。

ptrListViewExtrasEnabled 决定了Header,Footer以何种方式加入mPullRefreshListView,true为headView方式加入,就是滚动时刷新头部会一起滚动。

最后2个其实对于用户体验还是挺重要的,如果设置的时候考虑下~。其他的属性自己选择就好。

注:上述属性很多都可以代码控制,如果有需要可以直接mPullRefreshListView.set属性名 查看

以上为pull-to-refresh所有支持的属性~~

PullToRefreshGridView 带下拉刷新,上拉加载的GridView控件

PullToRefreshGridView 带下拉刷新,上拉加载的GridView控件
  • mmm1019669085
  • mmm1019669085
  • 2016年05月06日 16:12
  • 1405

android开发之PullToRefresh (GridView 下拉刷新,上拉加载)

首先,看布局文件: 主布局文件(activity_main.xml):
  • zz1175854992
  • zz1175854992
  • 2015年04月29日 15:05
  • 2518

带下拉刷新,上拉加载以及带自定义头布局的GridView

一、引言 相信很多人都会遇到GridView,一般都会带有下拉刷新和上拉加载,于是我们可以使用第三方框架去实现,实现方式有很多,这里我就不一一列举了,这里我经常使用的是这个https://github...
  • Algerhf
  • Algerhf
  • 2016年11月08日 18:43
  • 1214

android 开源框架之——下拉刷新,上拉加载更多总结

最近项目中需要用到下拉刷新的功能,发现自己的写的不是很好,网上搜了一下,发现开源的框架好多啊,而且类似的框架也有很多,不过也很杂,各有优缺点。在这里,我就总结一下比较常用的,争取全面一些,以后自己用起...
  • da_caoyuan
  • da_caoyuan
  • 2016年11月24日 19:34
  • 10317

android 打造真正的下拉刷新上拉加载recyclerview(三):下拉刷新上拉加载

这篇文章主要对WZMRecyclerView的上拉刷新和下拉加载部分,从思路、实现方式、问题解决三个方面进行了介绍。...
  • anyfive
  • anyfive
  • 2016年11月04日 16:04
  • 2093

移动端下拉刷新、上拉异步加载的插件以及轮播图插件

https://pan.baidu.com/s/1eSOOm2m dropload+swiper最近项目中用到了这两个插件,十分好用。这里简单介绍一下。一.dropload 1.引入css和js...
  • u012318873
  • u012318873
  • 2017年04月11日 10:10
  • 1082

一个简单好用的下拉刷新、上拉加载控件

*本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 本文为原创,转载必须保留出处! http://www.jianshu.com/p/1a82cdab2249 写在前面: ...
  • zhangtuodd
  • zhangtuodd
  • 2017年10月31日 09:38
  • 257

IScroll5实现下拉刷新上拉加载更

声明:虽然本文章为原创,但是很大部分参考了博客园博主MRxia的一篇iscroll的下拉刷新的实现方式,我个人把demo简化了一下,具体原来的demo可以参考:点击打开链接 实现效果:类似网...
  • chenzhiyong12
  • chenzhiyong12
  • 2016年08月17日 11:53
  • 17991

PullToRefreshGridView上拉刷新,下拉加载

PullToRefreshGridView上拉刷新,下拉加载   布局: 1 2
  • weixin_40399313
  • weixin_40399313
  • 2017年12月19日 18:34
  • 14

Android自定义控件——ListView的下拉刷新与上拉加载

无疑,在Android开发中,ListView是使用非常频繁的控件之一,ListView提供一个列表的容易,允许我们以列表的形式将数据展示到界面上,但是Google给我们提供的原生ListView的控...
  • lee_tianya
  • lee_tianya
  • 2014年10月10日 20:14
  • 17199
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:PullrefreshLibrary(PullToRefreshGridView)上拉刷新,下拉加载+异步AsyncTask(二)
举报原因:
原因补充:

(最多只允许输入30个字)