pulltorefresh 实现瀑布流的方式(基于recycleview)
来源:互联网 发布:淘宝天猫年交易额 编辑:程序博客网 时间:2024/06/07 02:39
我在项目中的需求是:
1、项目本身我是集进人了pulltofresh的类库实现下拉刷新及上拉加载
2、某一个页面要实现瀑布流的形式,第一想到的是recycleview的staggredGridLayoutManager 的布局管理器实现。
3、将pulltoRefresh的控件对recycleview实现扩展
4、处理下拉、上拉之后的逻辑
一、实现的第一步:
要想用pulltorefresh实现下拉刷新,你首先得导入pulltorefresh的类库,具体的代码先不细说了。
如图:
二、添加recycleview的依赖
compile 'com.android.support:cardview-v7:23.1.0'
compile 'com.android.support:recyclerview-v7:23.1.0'
三、在导入的pulltofresh 的类库中添加一个支持recycleview的类
package com.sinolbs.seeyou.pulltorefresh.library.extras.recyclerview;import android.content.Context;import android.support.v7.widget.RecyclerView;import android.util.AttributeSet;import android.view.View;import com.sinolbs.seeyou.pulltorefresh.library.PullToRefreshBase;/** * Created by Administrator on 2017/11/7. * pulltorefresh扩展recycleview; * 实现recycle的下拉刷新 * */public class PullToRefreshRecycleView extends PullToRefreshBase<RecyclerView> { private RecyclerView mRecyclerView; public PullToRefreshRecycleView(Context context) { super(context); } public PullToRefreshRecycleView(Context context, AttributeSet attrs) { super(context, attrs); } public PullToRefreshRecycleView(Context context, PullToRefreshBase.Mode mode) { super(context, mode); } public PullToRefreshRecycleView(Context context, Mode mode, AnimationStyle style) { super(context, mode, style); } @Override public final Orientation getPullToRefreshScrollDirection() { return Orientation.VERTICAL; } @Override protected RecyclerView createRefreshableView(Context context, AttributeSet attrs) { mRecyclerView = new RecyclerView(context, attrs); return mRecyclerView; } @Override protected boolean isReadyForPullStart() { return isFirstItemVisible(); } @Override protected boolean isReadyForPullEnd() { return isLastItemVisible(); } /** * @Description: 判断第一个条目是否完全可见 * * @return boolean: * @version 1.0 * @date 2015-9-23 * @Author zhou.wenkai */ private boolean isFirstItemVisible() { final RecyclerView.Adapter<?> adapter = getRefreshableView().getAdapter(); // 如果未设置Adapter或者Adapter没有数据可以下拉刷新 if (null == adapter || adapter.getItemCount() == 0) { return true; } else { // 第一个条目完全展示,可以刷新 if (getFirstVisiblePosition() == 0) { return mRecyclerView.getChildAt(0).getTop() >= mRecyclerView .getTop(); } } return false; } /** * @Description: 获取第一个可见子View的位置下标 * * @return int: 位置 * @version 1.0 * @date 2015-9-23 * @Author zhou.wenkai */ private int getFirstVisiblePosition() { View firstVisibleChild = mRecyclerView.getChildAt(0); return firstVisibleChild != null ? mRecyclerView .getChildAdapterPosition(firstVisibleChild) : -1; } /** * @Description: 判断最后一个条目是否完全可见 * * @return boolean: * @version 1.0 * @date 2015-9-23 * @Author zhou.wenkai */ private boolean isLastItemVisible() { final RecyclerView.Adapter<?> adapter = getRefreshableView().getAdapter(); // 如果未设置Adapter或者Adapter没有数据可以上拉刷新 if (null == adapter || adapter.getItemCount() == 0) { return true; } else { // 最后一个条目View完全展示,可以刷新 int lastVisiblePosition = getLastVisiblePosition(); if(lastVisiblePosition >= mRecyclerView.getAdapter().getItemCount()-1) { return mRecyclerView.getChildAt( mRecyclerView.getChildCount() - 1).getBottom() <= mRecyclerView .getBottom(); } } return false; } /** * @Description: 获取最后一个可见子View的位置下标 * * @return int: 位置 * @version 1.0 * @date 2015-9-23 * @Author zhou.wenkai */ private int getLastVisiblePosition() { View lastVisibleChild = mRecyclerView.getChildAt(mRecyclerView .getChildCount() - 1); return lastVisibleChild != null ? mRecyclerView .getChildAdapterPosition(lastVisibleChild) : -1; }}
四、对控件进行引用
<com.sinolbs.seeyou.pulltorefresh.library.extras.recyclerview.PullToRefreshRecycleView xmlns:ptr="http://schemas.android.com/apk/res-auto" android:id="@+id/recycle_view" android:layout_width="fill_parent" android:layout_height="fill_parent" ptr:ptrMode="both" ptr:ptrHeaderBackground="@color/edittext_bg" ptr:ptrHeaderTextColor="@color/text_gray" />
五、使用的方法
mRecycle_view = (PullToRefreshRecycleView) baseview.findViewById(R.id.recycle_view);
//获取pulltofresh的实体控件 final RecyclerView refreshableView = mRecycle_view.getRefreshableView(); StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL); SpacesItemDecoration decoration=new SpacesItemDecoration(8); refreshableView.addItemDecoration(decoration); layoutManager.setReverseLayout(false); layoutManager.setOrientation(LinearLayoutManager.VERTICAL); refreshableView.setLayoutManager(layoutManager); // 设置item动画 refreshableView.setItemAnimator(new DefaultItemAnimator()); RecommendGridAdapter gridAdapter = new RecommendGridAdapter(getActivity(), datas); //2.设置adapter refreshableView.setAdapter(gridAdapter); gridAdapter.getRandomHeight(datas); mRecycle_view.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<RecyclerView>() { @Override public void onPullDownToRefresh(PullToRefreshBase<RecyclerView> refreshView) { Toast.makeText(getActivity(), "Pull Down!", Toast.LENGTH_SHORT).show(); new Handler().postDelayed(new Runnable(){ @Override public void run() { Log.e("延时两秒","延时两秒检索"); mRecycle_view.onRefreshComplete(); } }, 3000); } @Override public void onPullUpToRefresh(PullToRefreshBase<RecyclerView> refreshView) { Toast.makeText(getActivity(), "Pull Up!", Toast.LENGTH_SHORT).show(); } });
六、完美实现
欧耶!!!
阅读全文
0 0
- pulltorefresh 实现瀑布流的方式(基于recycleview)
- pulltorefresh+recycleview 实现的瀑布流(带下拉刷新,上拉加载更多)
- RecycleView实现瀑布流
- Recycleview实现瀑布流
- recycleview实现瀑布流
- RecycleView实现瀑布流的效果
- RecycleView的使用(包括瀑布流)
- RecycleView 实现瀑布流效果
- 瀑布流 RecycleView 的 StaggeredGridLayoutManager?
- RecycleView实现item错落且高度不同的瀑布流
- RecycleView 实现瀑布流 添加分隔
- RecycleView实现瀑布流添加分隔线
- RecycleView的瀑布流的使用
- PullToReFresh 实现 RecycleView 横向滑动的刷新和加载更多
- recycleView 瀑布流
- Android RecycleView瀑布流
- 基于RecyclerView的瀑布流实现
- 简单粗暴实现RecycleView的瀑布流的粘性头部(非ItemDecoration实现)
- 深入理解pthread_cond_wait、pthread_cond_signal
- iOS 把UILabel的text设置成斜体
- 微信公众号自定义转发朋友圈
- 洛谷八连测 #R6
- Android项目去掉Java Builder后引起的问题
- pulltorefresh 实现瀑布流的方式(基于recycleview)
- 表达式解析器(MVEL)
- git仓库相关知识03-搭建远程仓库服务器
- clip介绍
- Spring和Mybatis整合(原始dao)
- 【金融财经】金融市场一周简报(2017-11-03)
- C++原始字符串raw
- linux基础——给用户添加sudo权限
- 将指定的第4个字符放到该字符串的最前面。如 String str="abcdefg",将d放到最前面后为“dabcefg”