自己封装的工具类,使用原生SwipeRefreshLayout+RecycleView实现下拉刷新和加载更多

1 篇文章 0 订阅
1 篇文章 0 订阅

实现SwipeRefreshLayout+RecycleView实现刷新

在你的xml文件里写上如下代码:
        <android.support.v4.widget.SwipeRefreshLayout
            android:id="@+id/SwipeRefreshLayout"
            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:cacheColorHint="#00000000"
                android:overScrollMode="never"
                android:scrollbars="none"/>
        </android.support.v4.widget.SwipeRefreshLayout>
在你的Activity或Fragment实现RecyclerViewLoadMoreUtil.RefreshDataListener刷新接口并调用以下代码初始化:

这里的init()方法中的
参数一:content
参数二:SwipeRefreshLayout控件
参数三:RecyclerView控件
参数四:继承RecyclerView.Adapter的adapter,这里可以使用我另外写的一篇关于adapter的封装
参数五:刷新接口,这里如果在Activity或Fragment实现RecyclerViewLoadMoreUtil.RefreshDataListener就可以在此处填this了

        recyclerViewLoadMoreUtil = new RecyclerViewLoadMoreUtil();
        recyclerViewLoadMoreUtil.init(mContext, mSwipeRefreshLayout, mRecyclerView, mAdapter, this);
        recyclerViewLoadMoreUtil.setColorSchemeResources(R.color.yellow_press, R.color.green, R.color.red);
        recyclerViewLoadMoreUtil.autoRefreshing();//第一次自动加载一次
        ....
 @Override
    public void onRefresh() {
        recyclerViewLoadMoreUtil.endRefreshing();
        //Do the things you want to do
    }    
 @Override
    public boolean loadMore() {
        recyclerViewLoadMoreUtil.endLoading();
        //Do the things you want to do
        return true;
    }
下面介绍该工具类中的几个方法
  • autoRefreshing(); // 自动加载上拉刷新
  • endRefreshing();// 关闭SwipeRefreshLayout的小圆圈
  • endLoading();// 关闭加载更多
  • setPullDownRefreshEnable(boolean isRefresh);// 设置列表是否禁止下拉刷新,是否显示下拉刷新动画只能通过该方法设置
  • setPullUpRefreshEnable(boolean isLoadMore);// 设置列表是否禁止上拉刷新

以下是该刷新工具类的全部代码

/**
 * Created by xiongxuesong-pc on 2016/6/17.
 * 配合原生RecyclerVew和SwipeRefreshLayout加载更多
 */
public class RecyclerViewLoadMoreUtil {
    protected Context mContext;
    protected SwipeRefreshLayout mSwipeRefreshLayout;
    protected RecyclerView mRecyclerView;
    protected RecyclerView.Adapter mAdapter;
    protected RefreshDataListener mRefreshDataListener;
    private boolean mIsRefresh = true;//是否禁止下拉刷新,默认是不禁止下拉刷新
    private boolean mIsLoadMore = true;//是否禁止上拉刷新,默认是不禁止上拉刷新
    private boolean isSlidingToScreenBottom = false;//用来标记是否正在向最后一个滑动,既是否向右滑动或向下滑动

    public RecyclerViewLoadMoreUtil() {

    }

    public void init(final Context context, final SwipeRefreshLayout swipeRefreshLayout, RecyclerView recyclerView, final RecyclerView.Adapter adapter, final RefreshDataListener refreshDataListener) {
        initConfig(context, swipeRefreshLayout, recyclerView, adapter, refreshDataListener);
        swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                boolean isRefreshing = swipeRefreshLayout.isRefreshing();
                if (isRefreshing) {
                    refreshDataListener.onRefresh();
                }
            }
        });

        final LinearLayoutManager layoutManager = new LinearLayoutManager(context);
        recyclerView.setLayoutManager(layoutManager);
        recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {

            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                LinearLayoutManager manager = (LinearLayoutManager) recyclerView.getLayoutManager();
                // 当不滚动时
                boolean idleFlag = newState == RecyclerView.SCROLL_STATE_IDLE;
                if (idleFlag) {
                    //获取最后一个完全显示的ItemPosition
                    int lastVisibleItem = manager.findLastCompletelyVisibleItemPosition();
                    int totalItemCount = mAdapter.getItemCount();

                    // 判断是否滚动到屏幕底部,并且是向右滚动
                    if (lastVisibleItem == (totalItemCount - 1) && isSlidingToScreenBottom) {
                        if (mScrolledBottomListener != null) {
                            mScrolledBottomListener.ScrolledBottom(recyclerView);
                        }

                        if (mIsLoadMore) {//可以加载更多
                            mSwipeRefreshLayout.setEnabled(false);//禁止使用下拉刷新
                            mRefreshDataListener.loadMore();
                            Log.d("TAG", "howes right=" + manager.findLastCompletelyVisibleItemPosition());
//                                Toast.makeText(mContext, "加载更多", Toast.LENGTH_SHORT).show();
                        } else {
//                            Toast.makeText(mContext, "不能加载更多", Toast.LENGTH_SHORT).show();
                        }
                    }
                }
            }

            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                Log.d("TAG", "dy=" + dy);
                //dx用来判断横向滑动方向,dy用来判断纵向滑动方向
                //当列表项的总高度小于屏幕,即不会滚动列表时,dx、dy都等于0
                if (dy > 0) {
                    //大于0表示,正在向右滚动,向上滚动
                    isSlidingToScreenBottom = true;
                } else {
                    //小于等于0 表示停止或向左滚动,向下滚动
                    isSlidingToScreenBottom = false;
                }
                if (mScrollingListener != null) {
                    mScrollingListener.scroll(isSlidingToScreenBottom);
                }
            }
        });
    }

    private void initConfig(Context context, SwipeRefreshLayout swipeRefreshLayout, RecyclerView recyclerView, RecyclerView.Adapter adapter, RefreshDataListener refreshDataListener) {
        this.mContext = context;
        this.mSwipeRefreshLayout = swipeRefreshLayout;
        this.mRecyclerView = recyclerView;
        this.mAdapter = adapter;
        this.mRefreshDataListener = refreshDataListener;
    }

    /**
     * 首次进入页面可以自动加载,要使用必须在{@link #init(Context, SwipeRefreshLayout, RecyclerView, RecyclerView.Adapter, RefreshDataListener)}
     * 之后调用
     */
    public void autoRefreshing() {
        mSwipeRefreshLayout.post(new Runnable() {
            @Override
            public void run() {
                mSwipeRefreshLayout.setRefreshing(true);
                mRefreshDataListener.onRefresh();
            }
        });
    }

    /**
     * 要使用必须在{@link #init(Context, SwipeRefreshLayout, RecyclerView, RecyclerView.Adapter, RefreshDataListener)}
     * 之后调用
     *
     * @param colorResIds
     */
    public void setColorSchemeResources(@ColorRes int... colorResIds) {
        mSwipeRefreshLayout.setColorSchemeResources(colorResIds);
    }

    public void endRefreshing() {
        mSwipeRefreshLayout.setRefreshing(false);
    }

    public void endLoading() {
        if (mIsRefresh) {//如果之前已经设置过禁止下拉刷新,此时不应该在设置成可下拉刷新
            setPullDownRefreshEnable(true);//可以使用下拉刷新
        } else {//如果之前已经设置过禁止下拉刷新,此时不应该在设置成可下拉刷新
            setPullDownRefreshEnable(false);//不可以使用下拉刷新
        }
    }

    /**
     * 设置列表是否禁止下拉刷新,是否显示下拉刷新动画只能通过该方法设置
     *
     * @param isRefresh true 可以使用下拉刷新;false 不可以使用下拉刷新
     */
    public void setPullDownRefreshEnable(boolean isRefresh) {
        mIsRefresh = isRefresh;
        mSwipeRefreshLayout.setEnabled(isRefresh);
    }

    /**
     * 设置列表是否禁止上拉刷新
     *
     * @param isLoadMore true 可以使用上拉刷新;false 不可以使用上拉刷新
     */
    public void setPullUpRefreshEnable(boolean isLoadMore) {
        mIsLoadMore = isLoadMore;
    }

    public interface RefreshDataListener {
        void onRefresh();

        boolean loadMore();
    }

    private ScrollingListener mScrollingListener;

    public interface ScrollingListener {
        /**
         * true 向上滚动;false 向下滚动
         *
         * @param scrollState
         */
        void scroll(boolean scrollState);
    }

    public void setScrollingListener(ScrollingListener listener) {
        mScrollingListener = listener;
    }

    private ScrolledBottomListener mScrolledBottomListener;

    public interface ScrolledBottomListener {
        /**
         * 列表滚动到屏幕底部时调用
         *
         * @param recyclerView
         */
        void ScrolledBottom(RecyclerView recyclerView);
    }

    public void setScrollingListener(ScrolledBottomListener listener) {
        mScrolledBottomListener = listener;
    }

}

这是本人从项目中抽取出来的,暂时没在项目中出现问题,希望能帮助到你。

转载请注明出处,谢谢!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现抖音评论收起功能,可以使用以下步骤: 1. 在布局文件中添加BottomSheet和RecycleView。 2. 创建一个Adapter类来处理RecycleView的数据和布局。 3. 在Adapter中,添加一个方法用于控制评论的展开和收起。 4. 在Activity中,将Adapter设置给RecycleView,并在点击收起按钮时调用Adapter中的方法。 5. 在BottomSheet的回调函数中,设置BottomSheet的高度为RecycleView的高度。 以下是示例代码: 1. 布局文件 ``` <androidx.coordinatorlayout.widget.CoordinatorLayout android:layout_width="match_parent" android:layout_height="match_parent"> <!-- 底部弹出的BottomSheet --> <com.google.android.material.bottomsheet.BottomSheetBehavior android:id="@+id/bottom_sheet" android:layout_width="match_parent" android:layout_height="wrap_content" app:behavior_hideable="true" app:behavior_peekHeight="0dp" app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior"> <androidx.recyclerview.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="wrap_content" /> </com.google.android.material.bottomsheet.BottomSheetBehavior> </androidx.coordinatorlayout.widget.CoordinatorLayout> ``` 2. Adapter类 ``` public class CommentAdapter extends RecyclerView.Adapter<CommentAdapter.CommentViewHolder> { private List<Comment> commentList; private boolean isExpanded = false; public CommentAdapter(List<Comment> commentList) { this.commentList = commentList; } @NonNull @Override public CommentViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_comment, parent, false); return new CommentViewHolder(view); } @Override public void onBindViewHolder(@NonNull CommentViewHolder holder, int position) { Comment comment = commentList.get(position); holder.tvComment.setText(comment.getCommentText()); } @Override public int getItemCount() { if (isExpanded) { return commentList.size(); } else { return Math.min(commentList.size(), 2); // 只显示前两条评论 } } public void expandComments() { isExpanded = true; notifyDataSetChanged(); } static class CommentViewHolder extends RecyclerView.ViewHolder { TextView tvComment; CommentViewHolder(View itemView) { super(itemView); tvComment = itemView.findViewById(R.id.tv_comment); } } } ``` 3. Activity代码 ``` public class MainActivity extends AppCompatActivity { private CommentAdapter commentAdapter; private BottomSheetBehavior bottomSheetBehavior; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); RecyclerView recyclerView = findViewById(R.id.recyclerView); recyclerView.setLayoutManager(new LinearLayoutManager(this)); List<Comment> commentList = generateDummyComments(); commentAdapter = new CommentAdapter(commentList); recyclerView.setAdapter(commentAdapter); Button btnCollapse = findViewById(R.id.btn_collapse); btnCollapse.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { commentAdapter.expandComments(); } }); // 获取BottomSheetBehavior实例 View bottomSheet = findViewById(R.id.bottom_sheet); bottomSheetBehavior = BottomSheetBehavior.from(bottomSheet); bottomSheetBehavior.setPeekHeight(0); bottomSheetBehavior.setHideable(true); bottomSheetBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() { @Override public void onStateChanged(@NonNull View bottomSheet, int newState) { if (newState == BottomSheetBehavior.STATE_HIDDEN) { finish(); } } @Override public void onSlide(@NonNull View bottomSheet, float slideOffset) { // 设置BottomSheet的高度为RecycleView的高度 View recyclerView = bottomSheet.findViewById(R.id.recyclerView); ViewGroup.LayoutParams layoutParams = bottomSheet.getLayoutParams(); layoutParams.height = (int) (recyclerView.getHeight() * (1 - slideOffset)); bottomSheet.setLayoutParams(layoutParams); } }); } private List<Comment> generateDummyComments() { List<Comment> commentList = new ArrayList<>(); for (int i = 0; i < 10; i++) { Comment comment = new Comment("这是第" + (i + 1) + "条评论"); commentList.add(comment); } return commentList; } } ``` 这样就可以实现抖音评论收起功能了。当点击收起按钮时,RecycleView会展开显示所有评论;当底部弹出的BottomSheet向上滑动时,会动态改变BottomSheet的高度,实现平滑的动画效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值