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所有支持的属性~~

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Android设计模式学习之观察者模式

观察者模式在实际项目中使用的也是非常频繁的,它最常用的地方是GUI系统、订阅——发布系统等。因为这个模式的一个重要作用就是解耦,使得它们之间的依赖性更小,甚至做到毫无依赖。以GUI系统来说,应用的UI...

关注CSDN程序人生公众号,轻松获得下载积分

关注公众号 在公众号里回复“”秘密“”两个字 返回 http://task.csdn.net/m/task/home?task_id=398 领取奖励 提示:根据公众号里的自动回复,完成...

属性动画----把图片渐渐变小不见(主函数MainActivity 页面)(XML布局)(本布局和渐变布局一样)

LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schema...

JavaEE 6及以上版本的web.xml问题?

JavaEE 6及以上版本的web.xml问题?MyEclipse JavaEE 6版本开始web.xml突然消失不见?没这回事,只是不太必须而已,有需要的项目可以自行进行添加或在创建项目的时候点击n...

Android 图片毛玻璃的实现方法

注:本文的高斯模糊只能显示,如果想要保存模糊后的图片,请参考另一篇文章:http://blog.csdn.net/fan7983377/article/details/51568059 效果...

PullreFreshLibrary(PullToRefreshListView)上拉刷新,下拉加载(—)

PullreFreshLibrary上拉刷新,下拉加载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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