Androi_SwipeRefreshLayout上拉刷新、AVLoadingIndicatorView加载动画

来源:互联网 发布:五色旗 知乎 编辑:程序博客网 时间:2024/05/21 22:23

一:介绍SwipeRefreshLayout上拉刷新与AVLoadingIndicatorView动画的联动,使页面效果更美观

上拉v4自带   动画需要添加依赖

 compile 'com.wang.avi:library:2.1.3'

二:布局

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    xmlns:app="http://schemas.android.com/apk/res-auto"    android:layout_height="match_parent">    <!--刚进入页面加载中动画-->    <com.wang.avi.AVLoadingIndicatorView        android:id="@+id/avi"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_centerInParent="true"        app:indicatorColor="?attr/colorPrimary"        app:indicatorName="BallSpinFadeLoaderIndicator"/>    <!--上拉刷新,只能有一个子控件,所以放入了RelativeLayout-->    <android.support.v4.widget.SwipeRefreshLayout        android:id="@+id/swiperedreshlayout"        android:layout_width="match_parent"        android:layout_height="match_parent">        <RelativeLayout            android:layout_width="match_parent"            android:layout_height="match_parent">    <android.support.v7.widget.RecyclerView        android:id="@+id/recyclerview"        android:layout_width="match_parent"        android:layout_height="match_parent"></android.support.v7.widget.RecyclerView>            <!--下拉刷新时显示  默认隐藏-->        <LinearLayout            android:id="@+id/layout_loadmore"            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:layout_alignParentBottom="true"            android:layout_centerHorizontal="true"            android:layout_marginBottom="6dp"            android:layout_marginTop="6dp"            android:gravity="center_horizontal"            android:orientation="horizontal"            android:padding="12dp"            android:visibility="gone">            <!--加载数据中动画-->            <com.wang.avi.AVLoadingIndicatorView                android:id="@+id/avi_loadmore"                style="@style/AVLoadingIndicatorView.Small"                android:layout_width="wrap_content"                android:layout_height="wrap_content"                app:indicatorColor="?attr/colorPrimary"                app:indicatorName="LineScalePartyIndicator"/>            <TextView                android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:layout_marginLeft="6dp"                android:gravity="center"                android:text="加载更多"                android:textSize="16sp"/>        </LinearLayout>        </RelativeLayout>    </android.support.v4.widget.SwipeRefreshLayout></RelativeLayout>


三:代码

package com.lgank.fragment;import android.content.Intent;import android.os.Bundle;import android.support.annotation.Nullable;import android.support.v4.app.Fragment;import android.support.v4.widget.SwipeRefreshLayout;import android.support.v7.widget.GridLayoutManager;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import android.support.v7.widget.StaggeredGridLayoutManager;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.LinearLayout;import com.lgank.R;import com.lgank.adapter.HomeASReAdapter;import com.lgank.bean.AndroidBean;import com.lgank.presenter.HomeAsPresenter;import com.lgank.view.DetailsActivity;import com.wang.avi.AVLoadingIndicatorView;import java.util.ArrayList;import java.util.List;import butterknife.BindView;import butterknife.ButterKnife;import butterknife.Unbinder;/** * Created by 绅V科技 on 2017/12/17 0017. */public class HomeFragmentA extends Fragment implements IView {    @BindView(R.id.recyclerview)    RecyclerView recyclerview;    Unbinder unbinder;    @BindView(R.id.swiperedreshlayout)    SwipeRefreshLayout swiperedreshlayout;    @BindView(R.id.avi_loadmore)    AVLoadingIndicatorView aviLoadmore;    @BindView(R.id.layout_loadmore)    LinearLayout layoutLoadmore;    @BindView(R.id.avi)    AVLoadingIndicatorView avi;    private View view;    private HomeAsPresenter homeAsPresenter;    List<AndroidBean.ResultsBean> relist = new ArrayList<>();    private HomeASReAdapter homeAReAdapter;    private int page = 1;    @Nullable    @Override    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {        view = inflater.inflate(R.layout.home_a, container, false);        unbinder = ButterKnife.bind(this, view);        return view;    }    @Override    public void onActivityCreated(@Nullable Bundle savedInstanceState) {        super.onActivityCreated(savedInstanceState);        //开启加载中动画        startLoading();        //布局管理器        LinearLayoutManager manager = new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false);        //适配器        homeAReAdapter = new HomeASReAdapter(getActivity(), relist);        //recyclerview设置        recyclerview.setLayoutManager(manager);        recyclerview.setAdapter(homeAReAdapter);        //创建p层        homeAsPresenter = new HomeAsPresenter(this);        //请求数据        homeAsPresenter.get("http://gank.io/api/data/", "Android", 10, page);        //点击跳转        homeAReAdapter.setOnClick(new HomeASReAdapter.ItemClick() {            @Override            public void onClick(View view,String url) {                Intent intent = new Intent(getActivity(),DetailsActivity.class);                intent.putExtra("url",url);                startActivity(intent);                getActivity().overridePendingTransition(R.anim.in, R.anim.out);            }        });        //下拉刷新        swiperedreshlayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {            @Override            public void onRefresh() {                relist.clear();                page = 1;                homeAsPresenter.get("http://gank.io/api/data/", "Android", 10, page);            }        });        //监听上拉加载更多        recyclerview.addOnScrollListener(new RecyclerView.OnScrollListener() {            @Override            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {                super.onScrollStateChanged(recyclerView, newState);                if (relist.size() < 1) {                    return;                }                //如果正在下拉刷新则放弃监听状态                if (swiperedreshlayout.isRefreshing()) {                    return;                }                //当前RecyclerView显示出来的最后一个的item的position,默认为-1                int lastPosition = -1;                //当前状态为停止滑动状态SCROLL_STATE_IDLE时                if (newState == RecyclerView.SCROLL_STATE_IDLE) {                    RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();                    //分别判断三种类型                    if (layoutManager instanceof GridLayoutManager) {                        //通过LayoutManager找到当前显示的最后的item的position                        lastPosition = ((GridLayoutManager) layoutManager).findLastVisibleItemPosition();                    } else if (layoutManager instanceof LinearLayoutManager) {                        lastPosition = ((LinearLayoutManager) layoutManager).findLastVisibleItemPosition();                    } else if (layoutManager instanceof StaggeredGridLayoutManager) {                        //因为StaggeredGridLayoutManager的特殊性可能导致最后显示的item存在多个,所以这里取到的是一个数组                        //得到这个数组后再取到数组中position值最大的那个就是最后显示的position值了                        int[] lastPositions = new int[((StaggeredGridLayoutManager) layoutManager).getSpanCount()];                        ((StaggeredGridLayoutManager) layoutManager).findLastVisibleItemPositions(lastPositions);                        lastPosition = findMax(lastPositions);                    }                    // 判断界面显示的最后item的position是否等于itemCount总数-1也就是最后一个item的position                    //如果相等则说明已经滑动到最后了                    if (lastPosition == recyclerView.getLayoutManager().getItemCount() - 1) {                        //此时需要请求等过数据,显示加载更多界面                        page++;                        startLoadingMore();                        homeAsPresenter.get("http://gank.io/api/data/", "Android", 10, page);                    }                }            }        });    }    public int findMax(int[] lastPositions) {        int max = lastPositions[0];        for (int value : lastPositions) {            if (value > max) {                max = value;            }        }        return max;    }    /**     * 开启加载中动画     */    public void startLoading() {        avi.smoothToShow();    }    /**     * 开启加载更多动画     */    public void startLoadingMore() {        layoutLoadmore.setVisibility(View.VISIBLE);        aviLoadmore.smoothToShow();    }    /**     * 关闭加载中动画     */    public void stopLoading() {        if (avi.isShown()) {            avi.smoothToHide();        }    }    /**     * 关闭加载更多动画     */    public void stopLoadingMore() {        layoutLoadmore.setVisibility(View.GONE);        aviLoadmore.smoothToHide();    }    /**     * 停止下拉刷新     */    public void stopRefreshing() {        if (swiperedreshlayout.isRefreshing()) {            swiperedreshlayout.setRefreshing(false);        }    }    @Override    public void onSuccess(Object o) {        if (o != null) {            AndroidBean b = (AndroidBean) o;            List<AndroidBean.ResultsBean> results = b.getResults();            relist.addAll(results);            homeAReAdapter.notifyDataSetChanged();            //关闭动画            stopLoading();            stopLoadingMore();            stopRefreshing();        }    }    @Override    public void onFailed(Exception e) {    }    @Override    public void onDestroy() {        super.onDestroy();        if (homeAsPresenter != null) {            homeAsPresenter.detatch();        }    }    @Override    public void onDestroyView() {        super.onDestroyView();        unbinder.unbind();    }}