码云链接,欢迎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() {@Overridepublic void onRefresh(@NonNull RefreshLayout refreshLayout) {refreshLayout.finishRefresh(2000);}});//上拉加载设置refreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() {@Overridepublic 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() {@Overridepublic void deleted(int position) {dataList.remove(position);mAdapter.notifyItemRemoved(position);}});recyclerView.setAdapter(mAdapter);WeSwipe.attach(recyclerView);
 // recycleView滚动需要的类recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {@Overridepublic 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) {// 第一种可能:跳转位置在第一个可见位置之前,使用smoothScrollToPositionmRecyclerView.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
 @Overridepublic float getSwipeWidth() {//布局隐藏超过父布局的范围的时候这里得不到宽度return dip2px(context, 240);}@Overridepublic View needSwipeLayout() {return slideItem;}@Overridepublic 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);}}@Overridepublic RecViewholder onCreateViewHolder(ViewGroup parent, int viewType) {View view = layoutInflater.inflate(R.layout.layout_item_twotype, parent, false);return new RecViewholder(view);}@Overridepublic void onBindViewHolder(final RecViewholder holder, int position) {holder.textView.setText(dataList.get(holder.getAdapterPosition()));holder.textView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(context, "s  " + holder.getAdapterPosition(), Toast.LENGTH_SHORT).show();}});holder.zhiding.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(context, "置顶" + holder.getAdapterPosition(), Toast.LENGTH_SHORT).show();}});holder.yidu.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(context, "已读" + holder.getAdapterPosition(), Toast.LENGTH_SHORT).show();}});holder.shanchu.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (null != delectedItemListener) {delectedItemListener.deleted(holder.getAdapterPosition());}}});}@Overridepublic 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);}@Overridepublic float getSwipeWidth() {//布局隐藏超过父布局的范围的时候这里得不到宽度return dip2px(context, 240);}@Overridepublic View needSwipeLayout() {return slideItem;}@Overridepublic 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"><RelativeLayoutandroid:id="@+id/slide_itemView"android:clipChildren="false"android:tag="slide_flag"android:layout_width="match_parent"android:layout_height="match_parent"><TextViewandroid: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" /><LinearLayoutandroid: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"><TextViewandroid:id="@+id/tv_totop"android:layout_width="80dp"android:layout_height="match_parent"android:background="#C8C7CD"android:gravity="center"android:text="置顶"android:textColor="#ffffff" /><TextViewandroid:id="@+id/tv_read"android:layout_width="80dp"android:layout_height="match_parent"android:background="#FF9D00"android:gravity="center"android:text="设为已读"android:textColor="#ffffff" /><TextViewandroid: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. 左滑菜单组件

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

  1. (仿头条APP项目)6.点击过的新闻列表文字变灰和下拉刷新与滚动加载新闻数据

    文章目录 一.点击过的新闻列表文字变灰 效果图 实现思路 导入ormlite数据库类依赖 利用ormlite创建数据库和表 创建数据库类MyDbHelper 创建数据库中的新闻实体类NewInfo 页 ...

  2. uni-app下拉刷新触底加载更多

    首先在pages.json 配置文件中配置    "enablePullDownRefresh": true  需要在哪用加载就配置在路由的style里 两个事件 //下拉刷新 o ...

  3. recyclerview的数据刷新(下拉刷新和自动加载更多)以及添加提示语(例如:“数据已加载完毕”)

    下拉加载更多的核心是SwipeRefreshLayout搭配Recyclerview进行使用.布局为 <android.support.v4.widget.SwipeRefreshLayout ...

  4. Vue 下拉刷新及无限加载组件 - 有你便是晴天 - 博客园

    原文  https://github.com/wangdahoo/vue-scroller 主题 Vue.js Vue Scroller Vue Scroller is a foundational ...

  5. Flutter开发之ListView下拉刷新上拉加载更多(35)

    在Flutter开发之ListView组件(21) 文章中,我们了解了ListView组件的基本使用.但是数据比较少,没有涉及分页加载.而实际开发中,下拉刷新和分页加载几乎是所有APP的标配.在iOS ...

  6. android listview下拉刷新动画,android 安卓 listview 支持下拉刷新 上拉加载更多

    [1]重写listViewimport java.text.SimpleDateFormat; import java.util.Date; import com.example.testdddlea ...

  7. Android所有View通用下拉刷新上拉加载控件

    转载请声明出处http://blog.csdn.net/zhongkejingwang/article/details/38868463 前面写过一篇关于下拉刷新控件的博客下拉刷新控件终结者:Pull ...

  8. Android下拉刷新上拉加载控件,对所有View通用!

    前面写过一篇关于下拉刷新控件的博客下拉刷新控件终结者:PullToRefreshLayout,后来看到好多人还有上拉加载更多的需求,于是就在前面下拉刷新控件的基础上进行了改进,加了上拉加载的功能.不仅 ...

  9. android verticalviewpager 下拉刷新 上拉加载_设计规范 | 详解组件控件结构体系:加载类...

    设计师在进行APP设计时,往往会更加专注于界面的布局.界面和界面之间怎么跳转.操作反馈,却往往忽略掉一个比较重要的环节,就是APP数据加载中的设计.那么我们怎么处理好界面交互中的加载设计,保证体验无缝 ...

  10. Android项目:使用pulltorefresh开源项目扩展为下拉刷新上拉加载更多的处理方法,监听listview滚动方向...

    很多android应用的下拉刷新都是使用的pulltorefresh这个开源项目,但是它的扩展性在下拉刷新同时又上拉加载更多时会有一定的局限性.查了很多地方,发现这个开源项目并不能很好的同时支持下拉刷 ...

最新文章

  1. 数据结构 – 顺序表
  2. 大盘点|基于RGB图像下的机器人抓取
  3. crt0.S(_main)代码分析
  4. 赛门铁克备份软件服务起不来_软件安全开发服务资质和信息系统灾难备份与恢复服务资质...
  5. 阻塞/非阻塞/同步/异步方法和多线程的关系?没有任何关系,俩不挨着
  6. python安装pyserial模块_Python使用模块Pyserial模块报
  7. Druid : 慢SQL统计与监控
  8. 计算机四级网络工程师考点速查,计算机四级《网络工程师》考点习题
  9. 弱逼发福利——BZOJ简易题解
  10. cs229 课程知识点 简要记录
  11. 魅蓝note6救砖_魅蓝NOTE6救砖工具及线刷包
  12. ssh介绍和使用--SecureCRT工具和ssh命令使用,以及sshd配置
  13. 用百度OCR识别URL图片中的文字
  14. 设置Solidworks为Ansys Workbench进行参数化设计作准备
  15. 推荐个php在线手册,非常的全
  16. eclipse的.java文件有蓝色三角符号
  17. 360WiFi之愚见
  18. 那些值得借鉴的的国外创意404错误页面设计
  19. Ubuntu16.04无法连接Wifi解决方案 (绝对有效)
  20. Linux入门学习(六)—— 怎么更改文件的所有者、所属组?以及怎么更改系统创建的默认权限?

热门文章

  1. unity 场景模型烘焙黑斑、黑点、漏光、不正常
  2. Python3.8场景式编程学习与训练- 第1章 入门基础 Python学习方法论与学习资源
  3. openssl建立证书和私钥方法
  4. Springboot顺利达驾校预约管理系统毕业设计-附源码191748
  5. 以云为翼—走近神州数码武汉云基地
  6. 【重磅】云栖社区2017年度内容特辑
  7. 微信好友排行榜 最简教程 一
  8. 十年之前..., 十年之后...
  9. font-spider压缩web font字体
  10. SGE(集群任务管理系统)常用操作命令