1. 程式人生 > >Android--Google官方下拉重新整理SwipeRefreshLayout(附加增加上拉載入)

Android--Google官方下拉重新整理SwipeRefreshLayout(附加增加上拉載入)

Demo_SwipeRefreshLayout

下拉重新整理是用系統的控制元件,但是這控制元件本身不帶有上拉載入,上拉載入需要在ListView的Adapter中設定 需要V4包的支援 compile 'com.android.support:support-v4:23.4.0'

佈局

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.SwipeRefreshLayout
    android:id="@+id/srl"
    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"
    tools:context="com.demo.demo_swiperefreshlayout.MainActivity">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingTop="5dp"
        android:scrollbars="vertical"></android.support.v7.widget.RecyclerView>

</android.support.v4.widget.SwipeRefreshLayout>

程式碼設定

swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.srl);
// 重新整理監聽事件,必須有
swipeRefreshLayout.setOnRefreshListener(this);
  // 設定進度圈的背景色
//        swipeRefreshLayout.setProgressBackgroundColor(R.color.colorAccent);
        // 設定進度動畫的顏色,可以使用多種顏色
        swipeRefreshLayout.setColorSchemeResources(R.color.colorAccent, R.color.colorPrimary, R.color.colorPrimaryDark);

覆寫onRefresh()方法
// 設定下拉重新整理
@Override
public void onRefresh()
{
    initBDatas();
    // 關閉載入進度條
    mSwipeRefreshLayout.setRefreshing(false);
}

在主函式中新增RecyclerView的滑動監聽
// RecyclerView的滑動監聽事件
    private RecyclerView.OnScrollListener mOnScrollListener = new RecyclerView.OnScrollListener()
    {
        private int lastVisibleItem;

        // 滑動狀態改變
        @Override
        public void onScrollStateChanged(RecyclerView recyclerView, int newState)
        {
            super.onScrollStateChanged(recyclerView, newState);
            /**
             * scrollState有三種狀態,分別是SCROLL_STATE_IDLE、SCROLL_STATE_TOUCH_SCROLL、SCROLL_STATE_FLING
             * SCROLL_STATE_IDLE是當螢幕停止滾動時
             * SCROLL_STATE_TOUCH_SCROLL是當用戶在以觸屏方式滾動螢幕並且手指仍然還在螢幕上時
             * SCROLL_STATE_FLING是當用戶由於之前划動螢幕並擡起手指,螢幕產生慣性滑動時
             */
            if (newState == RecyclerView.SCROLL_STATE_IDLE
                    && lastVisibleItem + 1 == mAdapter.getItemCount()
                    && mAdapter.isShowFooter())
            {

                // 上拉載入更多
                initAData();
//                LogUtils.d(TAG, "loading more data");
//                mNewsPresenter.loadNews(mType, pageIndex + Urls.PAZE_SIZE);
            }
        }

        // 滑動位置
        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy)
        {
            super.onScrolled(recyclerView, dx, dy);
            // 給lastVisibleItem賦值
            // findLastVisibleItemPosition()是返回最後一個item的位置
            lastVisibleItem = mLayoutManager.findLastVisibleItemPosition();
        }
    };

上拉載入,在Adapter中設定2套佈局,一套是預設的item佈局,一套是底部載入的顯示佈局

package com.demo.demo_swiperefreshlayout;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import java.util.List;

/**
 * Created by YangJW on 2016/7/1 09:37.
 */
public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
{

    // 設定底部佈局
    private static final int TYPE_FOOTER = 0;
    // 設定預設佈局
    private static final int TYPE_DEFAULT = 1;

    // 資料來源
    private List<String> mData;
    // 上下文
    private Context mContext;
    // 判斷是不是最後一個item,預設是true
    private boolean mShowFooter = true;

    // 建構函式
    public MyAdapter(Context mContext)
    {
        this.mContext = mContext;
    }

    // 設定資料並重新整理
    public void setData(List<String> Data)
    {
        this.mData = Data;
        this.notifyDataSetChanged();
    }

    // 設定不同的item
    @Override
    public int getItemViewType(int position)
    {
        // 判斷當前位置+1是不是等於資料總數(因為陣列從0開始計數),是的就載入底部佈局重新整理,不是就載入預設佈局
        if (position + 1 == getItemCount())
        {
            return TYPE_FOOTER;
        } else
        {
            return TYPE_DEFAULT;
        }
    }

    // 設定佈局(相當於設定convertView)
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
    {

        if (viewType == TYPE_DEFAULT)
        {
            View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_item, parent, false);

            DefaultViewHolder vh = new DefaultViewHolder(v);

            return vh;
        } else
        {
            // 例項化佈局
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.footer, null);
            // 程式碼實現載入佈局
            view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                    ViewGroup.LayoutParams.WRAP_CONTENT));

            return new FooterViewHolder(view);
        }
    }



    // 在佈局中載入資料(繫結資料)
    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position)
    {
        // 用來在執行時指出物件是某一個物件
        if (holder instanceof DefaultViewHolder)
        {
            String str = mData.get(position);

            if (str == null)
            {
                return;
            }

            ((DefaultViewHolder) holder).tv.setText(str);
        }
    }

    // 獲取資料數目
    @Override
    public int getItemCount()
    {
        // 判斷是不是顯示底部,是就返回1,不是返回0
        int begin = mShowFooter? 1 : 0;
        // 沒有資料的時候,直接返回begin
        if (mData == null)
        {
            return begin;
        }
        // 因為底部佈局要佔一個位置,所以總數目要+1
        return mData.size() + begin;
    }


    // 設定是否顯示底部載入提示(將值傳遞給全域性變數)
    public void isShowFooter(boolean showFooter)
    {
        this.mShowFooter = showFooter;
    }

    // 判斷是否顯示底部,資料來自全域性變數
    public boolean isShowFooter()
    {
        return this.mShowFooter;
    }



    // 底部佈局的ViewHolder
    public class FooterViewHolder extends RecyclerView.ViewHolder
    {
        public FooterViewHolder(View view)
        {
            super(view);
        }
    }

    // 預設佈局的ViewHolder
    public class DefaultViewHolder extends RecyclerView.ViewHolder
    {

        public TextView tv;

        public DefaultViewHolder(View itemView)
        {
            super(itemView);

            tv = (TextView) itemView.findViewById(R.id.tv);

        }
    }


}

效果圖