谷歌推荐的下拉刷新swiprefreshLayout

最近越来越多的客户端上使用上谷歌推荐的下拉刷新,效果如下:

这里写图片描述

这里是一个简单的下拉刷新+listview配合使用的。

首先看xml布局代码:

<?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

    <korean.swipeorefreshlayoutgoogle.RefreshLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/refresh_widget"
        >

    <ListView
        android:divider="@null"
        android:dividerHeight="0dp"
        android:fadingEdge="none"
        android:overScrollMode="never"
        android:id="@+id/listview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></ListView>

    </korean.swipeorefreshlayoutgoogle.RefreshLayout>
</LinearLayout>

这个RefreshLayout是继承SwipeRefreshLayout的,代码如下:

public class RefreshLayout extends SwipeRefreshLayout implements AbsListView.OnScrollListener {

private View mListViewFooter;

private ListView mListView;

private RecyclerView mRecyclerView;

private boolean isLoading = false;

private OnLoadListener mLoadListener;

public int lastIndex = 0;

public RefreshLayout(Context context) {
    super(context);
}

public RefreshLayout(Context context, AttributeSet attrs) {
    super(context, attrs);

    mListViewFooter = LayoutInflater.from(context).inflate(R.layout.listview_footer, null, false);
}

@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
    super.onLayout(changed, left, top, right, bottom);
    if (mListView == null) {
        getListView();
    }
}

private void getListView() {

    int childs = getChildCount();
    if (childs > 0) {
        View childView = getChildAt(0);
        if (childView instanceof ListView) {
            mListView = (ListView) childView;
            mListView.setOnScrollListener(this);
        } else if (childView instanceof RecyclerView) {
            mRecyclerView = (RecyclerView) childView;
            mRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {
                @Override
                public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                    super.onScrollStateChanged(recyclerView, newState);
                }

                @Override
                public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                    super.onScrolled(recyclerView, dx, dy);

                    //判断是否到了底部,并且不是在加载数据的状态

                    LinearLayoutManager linearLayoutManager = (LinearLayoutManager) mRecyclerView.getLayoutManager();
                    lastIndex = linearLayoutManager.findLastVisibleItemPosition()+1;
                    Log.d("TAG" ,"linearLayoutManager.findLastVisibleItemPosition():"+linearLayoutManager.findLastCompletelyVisibleItemPosition());
                    if(linearLayoutManager.findLastVisibleItemPosition() == 19 && isLoading == false){
                        //首先设置加载状态
                        setLoading(true,true);
                        //调用加载更多的方法
                        mLoadListener.onLoadMore();
                    }
                }
            });
        }
    }
}

public void setLoading(boolean loading) {
    this.isLoading = loading;
    if (isLoading) {
        mListView.addFooterView(mListViewFooter);
    } else {

        mListView.removeFooterView(mListViewFooter);
    }
}
public void setLoading(boolean loading,boolean flag) {
    this.isLoading = loading;
    if (isLoading) {

        mRecyclerView.addView(mListViewFooter,20);
        //mListView.addFooterView(mListViewFooter);
    } else {
        mRecyclerView.removeViewAt(20);
        //mListView.removeFooterView(mListViewFooter);
    }
}


public void setOnLoadListener(OnLoadListener loadListener) {
    this.mLoadListener = loadListener;
}

// 加载更多的接口
public interface OnLoadListener {
    public void onLoadMore();
}

@Override
public void onScrollStateChanged(AbsListView absListView, int i) {

}

@Override
public void onScroll(AbsListView absListView, int i, int i1, int i2) {

    //判断是否到了底部,并且不是在加载数据的状态
    if (mListView.getLastVisiblePosition() == mListView.getAdapter().getCount() - 1
            && isLoading == false) {
        //首先设置加载状态
        setLoading(true);
        //调用加载更多的方法
        mLoadListener.onLoadMore();
    }
}

因为要监听加载更多嘛,我这里采用的是 监听listview滚动,当滚动到底部时,让footView显示,然后调用loadMore方法。
使用时,直接设置加载更多监听即可:
@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    listView = (ListView) findViewById(R.id.listview);
    mRefreshLayout = (RefreshLayout) findViewById(R.id.refresh_widget);

    mList = new ArrayList<>();
    for (int i = 0; i < 20; i++) {
        mList.add(String.valueOf(i));
    }

    adapter = new SampleAdapter(this, R.layout.list_item, mList);
    listView.setAdapter(adapter);

    //调整那个下拉刷新距离顶部的距离
    //mRefreshLayout.setProgressViewEndTarget(true,400);
    //设置中间圈圈的颜色
    mRefreshLayout.setColorSchemeColors(Color.parseColor("#2B91D8"));

    mRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {

        @Override

        public void onRefresh() {
            Log.d("TAG", "正在刷新");

            //刷新2s后停止刷新
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    mRefreshLayout.setRefreshing(false);
                }
            }, 2000);
        }
    });

    mRefreshLayout.setOnLoadListener(new RefreshLayout.OnLoadListener() {
        @Override
        public void onLoadMore() {

            if(mList.size() >= 30){
                mRefreshLayout.setLoading(false);
                return;
            }
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {

                    for (int i = 20; i < 30; i++) {
                        mList.add(String.valueOf(i));
                    }

                    mRefreshLayout.setLoading(false);
                    adapter.notifyDataSetChanged();
                }
            },3000);
        }
    });

    //设置正在刷新
    //mRefreshLayout.setRefreshing(true);
}

class SampleAdapter extends ArrayAdapter<String> {

    private final LayoutInflater mInflater;
    private final List<String> mData;

    public SampleAdapter(Context context, int layoutResourceId, List<String> data) {
        super(context, layoutResourceId, data);
        mData = data;
        mInflater = LayoutInflater.from(context);
    }

    @Override
    public View getView(final int position, View convertView, @NonNull ViewGroup parent) {
        final ViewHolder viewHolder;
        if (convertView == null) {
            viewHolder = new ViewHolder();
            convertView = mInflater.inflate(R.layout.list_item, parent, false);
            viewHolder.tvNum = (TextView) convertView.findViewById(R.id.tv_num);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }

        viewHolder.tvNum.setText(mData.get(position));
        return convertView;
    }

    class ViewHolder {
        TextView tvNum;
    }
}


class HomeAdapter extends  RecyclerView.Adapter<HomeAdapter.MyViewHolder>{


    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        MyViewHolder holder = new MyViewHolder(LayoutInflater.from(MainActivity.this).inflate(R.layout.list_item, parent, false));

        return holder;
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {

        holder.tv.setText(mList.get(position));
    }

    @Override
    public int getItemCount() {
        return mList.size();
    }

    class MyViewHolder extends RecyclerView.ViewHolder{

        TextView tv;
        public MyViewHolder(View itemView) {
            super(itemView);
            tv = (TextView) itemView.findViewById(R.id.tv_num);
        }
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值