史上最全recyclewView集合,下拉刷新,上拉加载,左滑删除,点击按钮滑动到指定位置

码云链接,欢迎clone

史上最全recycleView 集合,下拉刷新+上拉加载+左滑删除+点击按钮滑动到指定位置

最近项目需求,需要使用viewpager+fragment,同时还有类似支付宝的滑动到指定位置需求,另外还有点击顶部button,使recycleView滑动到指定位置,简直是把我这个老黄牛给累死了,好在万能的百度,给了我指引。于是我这个搬砖工,把网上现在的东西组合了下,有了今天的成果。话不多说,上效果图

在这里插入图片描述
在这里插入图片描述

主要思路

  1. 使用viewpager+tablelqyout,这个没啥好说的,现在比较流行的多页面框架
  2. 下拉刷新,上拉加载,这个使用了git上非常著名的smartRefreshLayout,不过话说回来,自从用了这个框架,一句话:谁用谁知道!
  3. 左滑菜单,这个网上实现的也非常多,但是很可惜,像easySwipterLayout,还有其它的一些实现方式都是在recycleView上实现,这样造成了与recycleView代码混合在一起,非常不利于现在的少侵入式框架,最终发现有一个WeSwipe,可以实现与recycleView的最少侵入。于是就选择了这款左滑框架。

关键代码

  1. recycleView设置关键代码 ,其中有上拉刷新,下拉加载,还有滑动的监听,在滑动监听中找到当前屏幕可见的第一条item的position,其中下面的代码 是关键
  LinearLayoutManager ll = (LinearLayoutManager) recyclerView.getLayoutManager();
        int firstItem = ll.findFirstVisibleItemPosition();
//下拉刷新设置
   refreshLayout.setOnRefreshListener(new OnRefreshListener() {
            @Override
            public void onRefresh(@NonNull RefreshLayout refreshLayout) {
                refreshLayout.finishRefresh(2000);
            }
        });
        //上拉加载设置
        refreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() {
            @Override
            public void onLoadMore(@NonNull RefreshLayout refreshLayout) {
                refreshLayout.finishLoadMore(2000);
            }
        });
        LinearLayoutManager layoutManager = new LinearLayoutManager(getContext());
        layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        recyclerView.setLayoutManager(layoutManager);
        mAdapter.setDelectedItemListener(new WorkAdapter.DeletedItemListener() {
            @Override
            public void deleted(int position) {
                dataList.remove(position);
                mAdapter.notifyItemRemoved(position);
            }
        });
        recyclerView.setAdapter(mAdapter);
        WeSwipe.attach(recyclerView);
       
 // recycleView滚动需要的类
        recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
                if (mShouldScroll && RecyclerView.SCROLL_STATE_IDLE == newState) {
                    mShouldScroll = false;
                    smoothMoveToPosition(recyclerView, mToPosition);
                } else if (newState == RecyclerView.SCROLL_STATE_IDLE) {
                    //滑动终止
                    settabbarTop();
                }
            }
        });
          /**
     * 滑动到指定位置
     */
    private void smoothMoveToPosition(RecyclerView mRecyclerView, final int position) {
        // 第一个可见位置
        int firstItem = mRecyclerView.getChildLayoutPosition(mRecyclerView.getChildAt(0));
        // 最后一个可见位置
        int lastItem = mRecyclerView.getChildLayoutPosition(mRecyclerView.getChildAt(mRecyclerView.getChildCount() - 1));
        if (position < firstItem) {
            // 第一种可能:跳转位置在第一个可见位置之前,使用smoothScrollToPosition
            mRecyclerView.smoothScrollToPosition(position);
        } else if (position <= lastItem) {
            // 第二种可能:跳转位置在第一个可见位置之后,最后一个可见项之前
            int movePosition = position - firstItem;
            if (movePosition >= 0 && movePosition < mRecyclerView.getChildCount()) {
                int top = mRecyclerView.getChildAt(movePosition).getTop();
                // smoothScrollToPosition 不会有效果,此时调用smoothScrollBy来滑动到指定位置
                mRecyclerView.smoothScrollBy(0, top);
            }
        } else {
            // 第三种可能:跳转位置在最后可见项之后,则先调用smoothScrollToPosition将要跳转的位置滚动到可见位置
            // 再通过onScrollStateChanged控制再次调用smoothMoveToPosition,执行上一个判断中的方法
            mRecyclerView.smoothScrollToPosition(position);
            mToPosition = position;
            mShouldScroll = true;
        }
    }

adapter关键代码,使用weSwip左滑菜单 ,必须实现WeSwipeHelper.SwipeLayoutTypeCallBack,这里有三个关键方法
解释如下:

  • getSwipeWidth 方法是指定可左滑动的距离
  • needSwipeLayout 方法是右滑的菜单view
  • onScreenView 返回的是contentView,即全屏的view
 @Override
       public float getSwipeWidth() {
           //布局隐藏超过父布局的范围的时候这里得不到宽度
           return dip2px(context, 240);
       }

       @Override
       public View needSwipeLayout() {
           return slideItem;
       }

       @Override
       public View onScreenView() {
           return textView;
       }

package cn.ttxs.wq.adapter;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;

import androidx.recyclerview.widget.RecyclerView;

import java.util.ArrayList;
import java.util.List;

import cn.ttxs.wq.R;
import cn.we.swipe.helper.WeSwipeHelper;

/**
 * Created by WANG on 18/4/24.
 */

public class WorkAdapter extends RecyclerView.Adapter<WorkAdapter.RecViewholder> {


    private Context context;
    private List<String> dataList = new ArrayList<>();
    private LayoutInflater layoutInflater;
    DeletedItemListener delectedItemListener;

    public void setDelectedItemListener(DeletedItemListener deletedItemListener) {
        this.delectedItemListener = deletedItemListener;
    }

    public WorkAdapter(Context context, List<String> dataList) {
        this.context = context;
        this.dataList = dataList;
        layoutInflater = LayoutInflater.from(context);
    }

    public void setList(List<String> list) {
        dataList.clear();
        dataList.addAll(list);
        notifyItemMoved(0, dataList.size() - 1);
    }

    public List<String> getDataList() {
        return dataList;
    }

    public void removeDataByPosition(int position) {
        if (position >= 0 && position < dataList.size()) {
            dataList.remove(position);
            notifyItemRemoved(position);
        }
    }

    @Override
    public RecViewholder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = layoutInflater.inflate(R.layout.layout_item_twotype, parent, false);
        return new RecViewholder(view);
    }

    @Override
    public void onBindViewHolder(final RecViewholder holder, int position) {
        holder.textView.setText(dataList.get(holder.getAdapterPosition()));
        holder.textView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(context, "s  " + holder.getAdapterPosition(), Toast.LENGTH_SHORT).show();
            }
        });

        holder.zhiding.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(context, "置顶" + holder.getAdapterPosition(), Toast.LENGTH_SHORT).show();
            }
        });
        holder.yidu.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(context, "已读" + holder.getAdapterPosition(), Toast.LENGTH_SHORT).show();
            }
        });
        holder.shanchu.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (null != delectedItemListener) {
                    delectedItemListener.deleted(holder.getAdapterPosition());
                }
            }
        });
    }

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


    /**
     * view.getWidth()获取的是屏幕中可以看到的大小.
     */
    public class RecViewholder extends RecyclerView.ViewHolder implements WeSwipeHelper.SwipeLayoutTypeCallBack {
        public TextView textView;
        public LinearLayout slide;
        public TextView zhiding, yidu, shanchu;
        public RelativeLayout slideItem;

        public RecViewholder(View itemView) {
            super(itemView);
            textView = itemView.findViewById(R.id.item_text);
            zhiding = itemView.findViewById(R.id.tv_totop);
            yidu = itemView.findViewById(R.id.tv_read);
            shanchu = itemView.findViewById(R.id.tv_del);
            slide = itemView.findViewById(R.id.slide);
            slideItem = itemView.findViewById(R.id.slide_itemView);
        }

        @Override
        public float getSwipeWidth() {
            //布局隐藏超过父布局的范围的时候这里得不到宽度
            return dip2px(context, 240);
        }

        @Override
        public View needSwipeLayout() {
            return slideItem;
        }

        @Override
        public View onScreenView() {
            return textView;
        }
    }

    /**
     * 根据手机分辨率从DP转成PX
     *
     * @param context
     * @param dpValue
     * @return
     */
    public static int dip2px(Context context, float dpValue) {
        float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dpValue * scale + 0.5f);
    }

    public interface DeletedItemListener {

        void deleted(int position);
    }


}

recycleView使用的layout文件关键代码

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:layout_marginBottom="1dp"
    android:clipChildren="false">

    <RelativeLayout
        android:id="@+id/slide_itemView"
        android:clipChildren="false"
        android:tag="slide_flag"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:id="@+id/item_text"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:background="#e1e1e1"
            android:gravity="center"
            android:text="item"
            android:textColor="#333333"
            android:textSize="16sp" />


        <LinearLayout
            android:id="@+id/slide"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_toRightOf="@id/item_text"
            android:clipChildren="false"
            android:orientation="horizontal">

            <TextView
                android:id="@+id/tv_totop"
                android:layout_width="80dp"
                android:layout_height="match_parent"
                android:background="#C8C7CD"
                android:gravity="center"
                android:text="置顶"
                android:textColor="#ffffff" />

            <TextView
                android:id="@+id/tv_read"
                android:layout_width="80dp"
                android:layout_height="match_parent"
                android:background="#FF9D00"
                android:gravity="center"
                android:text="设为已读"
                android:textColor="#ffffff" />

            <TextView
                android:id="@+id/tv_del"
                android:layout_width="80dp"
                android:layout_height="match_parent"
                android:background="#FE3C31"
                android:gravity="center"
                android:text="删除"
                android:textColor="#ffffff" />
        </LinearLayout>

    </RelativeLayout>

</RelativeLayout>

本文使用的第三方开源组件

  1. 下拉刷新组件

  2. 左滑菜单组件

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UGUI ScrollView 是 Unity 的 UI 系统中的一种可滚动显示内容的控件,它常用于显示大量数据或者需要滚动浏览的内容。下拉刷新上拉加载更多是在实际使用中为了增强用户体验而加入的功能。 下拉刷新是指用户在滚动 ScrollView 时,向下拉动一段距离后,触发刷新操作,以更新显示的内容。要实现下拉刷新功能,我们可以通过在 ScrollView 的上方增加一个控件,例如一个下拉刷新的提示文字或者一个带有动画效果的图标。当用户下拉 ScrollView 时,通过监听用户手势的滑动距离,当滑动距离超过一定阈值时,触发刷新操作。在刷新操作过程中,我们可以调用相应的数据加载函数,重新加载数据,并将新加载的数据更新显示在 ScrollView 中。 上拉加载更多是指用户在滚动 ScrollView 时,当滑动到底部后,触发加载更多操作,以继续显示后续的内容。要实现上拉加载更多功能,我们可以通过在 ScrollView 的下方增加一个控件,例如一个上拉加载的提示文字或者一个带有动画效果的图标。当用户滑动到底部时,我们通过监听 ScrollView 的滚动位置或者判断 ScrollView 内容视图是否完全可见,判断是否需要加载更多内容。在加载更多操作中,我们可以调用相应的数据加载函数,加载更多的数据,并将新加载的数据追加到 ScrollView 中。 通过实现下拉刷新上拉加载更多功能,可以使用户在浏览大量数据或者滚动显示内容时更加方便快捷。这些功能的实现可以增加用户的交互体验,并且带来更好的用户滚动体验。同时,我们在开发中还可以根据具体需求,添加一些附加的功能,例如自定义刷新和加载动画、刷新和加载失败处理等,以进一步提升用户体验。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值