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

第三方架包下载地址: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所有支持的属性~~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的示例代码: 首先,在XML布局文件中添加一个RecyclerView和SwipeRefreshLayout控件: ```xml <androidx.swiperefreshlayout.widget.SwipeRefreshLayout android:id="@+id/swipe_refresh_layout" android:layout_width="match_parent" android:layout_height="match_parent"> <androidx.recyclerview.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent" /> </androidx.swiperefreshlayout.widget.SwipeRefreshLayout> ``` 然后,在Activity或Fragment中初始化RecyclerView和SwipeRefreshLayout,并设置相应的监听器: ```java // 初始化RecyclerView和SwipeRefreshLayout mRecyclerView = findViewById(R.id.recycler_view); mSwipeRefreshLayout = findViewById(R.id.swipe_refresh_layout); // 设置布局管理器和适配器 mLayoutManager = new LinearLayoutManager(this); mAdapter = new MyAdapter(mDataList); mRecyclerView.setLayoutManager(mLayoutManager); mRecyclerView.setAdapter(mAdapter); // 设置下拉刷新监听器 mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { // 进行下拉刷新操作 refreshData(); } }); // 设置上拉加载更多监听器 mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); if (newState == RecyclerView.SCROLL_STATE_IDLE && isSlideToBottom(recyclerView)) { // 滑动到底部,触发加载更多操作 loadMoreData(); } } }); // 判断RecyclerView是否滑动到底部 private boolean isSlideToBottom(RecyclerView recyclerView) { LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager(); int lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition(); int itemCount = layoutManager.getItemCount(); return lastVisibleItemPosition == (itemCount - 1); } // 进行下拉刷新操作 private void refreshData() { // 在这里进行刷新数据的操作 // 刷新完成后调用mSwipeRefreshLayout.setRefreshing(false)停止刷新动画 } // 进行上拉加载更多操作 private void loadMoreData() { // 在这里进行加载更多数据的操作 // 加载完成后调用mAdapter.notifyDataSetChanged()更新列表 } ``` 需要注意的是,上述代码中的MyAdapter是自定义的RecyclerView适配器,需要根据实际情况进行修改。另外,刷新加载更多操作需要在子线程中进行,可以使用AsyncTask等方式进行异步处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值