先看效果图,有波浪纹的是我点击的~~~:

可以看出,这个 RcyclerView 我想让它滑动置顶它就会到顶部,想点击置顶也可以到顶部。那么如何实现的呢,具体看下面,因为下面内容太多。如果不想了解,可以直接下载下面的例子,下面是下载地址:

CSDN 下载地址:https://download.csdn.net/download/wuqingsen1/10810684

GitHub 下载地址:https://github.com/wuqingsen/RecyclerViewTop

下面是讲的主要内容:

  • MainActivity 和 activity_main 主要代码
  • MainAdapter

1. MainActivity 和 activity_main 主要代码

public class MainActivity extends AppCompatActivity {private MainAdapter adapter;private RecyclerView recyclerView;private List<String> mDatas;private View include;private String str;//目标项是否在最后一个可见项之后private boolean mShouldScroll;//记录目标项位置private int mToPosition;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);include = findViewById(R.id.include);recyclerView = findViewById(R.id.recyclerView);//添加数据addData();adapter = new MainAdapter(MainActivity.this, mDatas);recyclerView.setAdapter(adapter);recyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this));//滑动监听recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {@Overridepublic void onScrolled(RecyclerView recyclerView, int dx, int dy) {super.onScrolled(recyclerView, dx, dy);//定位初始点坐标View stickyInfoView = recyclerView.findChildViewUnder(recyclerView.getMeasuredWidth() / 2, 1);if (stickyInfoView != null) {TextView typeName = stickyInfoView.findViewById(R.id.typeName);if (typeName != null) {str = typeName.getText().toString();}//标题为聊天室榜单部分的标识、筛选为筛选部分的标识,内容为数据内容的标识if (str.equals("标题")) {include.setVisibility(View.GONE);} else if (str.equals("筛选")) {include.setVisibility(View.VISIBLE);} else if (str.equals("内容")) {include.setVisibility(View.VISIBLE);}}}@Overridepublic void onScrollStateChanged(RecyclerView recyclerView, int newState) {super.onScrollStateChanged(recyclerView, newState);if (mShouldScroll && RecyclerView.SCROLL_STATE_IDLE == newState) {mShouldScroll = false;smoothMoveToPosition(recyclerView, mToPosition);}}});//点击置顶adapter.setmOnItemClickListerer(new MainAdapter.OnItemClickListener() {@Overridepublic void onItemClick(View view, int position) {if (position != -1) {smoothMoveToPosition(recyclerView, position);}}});}private void addData() {mDatas = new ArrayList<>();//手动添加两条数据,adapter判断的依据mDatas.add("0");mDatas.add("1");//for循环加入30条数据for (int i = 1; i <= 30; i++) {mDatas.add("这是第" + i + "条数据");}}/*** 平滑的滑动到指定位置*/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) {// 第一种可能:跳转位置在第一个可见位置之前mRecyclerView.smoothScrollToPosition(position);} else if (position <= lastItem) {// 第二种可能:跳转位置在第一个可见位置之后int movePosition = position - firstItem;if (movePosition >= 0 && movePosition < mRecyclerView.getChildCount()) {int top = mRecyclerView.getChildAt(movePosition).getTop();mRecyclerView.smoothScrollBy(0, top);}} else {// 第三种可能:跳转位置在最后可见项之后mRecyclerView.smoothScrollToPosition(position);mToPosition = position;mShouldScroll = true;}}
}

看一下上面的注释,其实很好理解,不明白回复我~~。下面是 activity_main 的代码:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#FFFFFF"android:orientation="vertical"><android.support.v7.widget.RecyclerViewandroid:id="@+id/recyclerView"android:layout_width="match_parent"android:layout_height="wrap_content" /><!-- 这是筛选布局 --><includeandroid:id="@+id/include"layout="@layout/adapter_one"android:visibility="gone" /></RelativeLayout>

代码内只有一个 RecyclerView 和一个筛选布局。

2. MainAdapter 和布局文件

public class MainAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {private Context context;private final int type_zero = 0;private final int type_one = 1;private final int type_two = 2;private List<String> mDatas;public interface OnItemClickListener {void onItemClick(View view, int position);}public MainAdapter.OnItemClickListener mOnItemClickListerer;public void setmOnItemClickListerer(MainAdapter.OnItemClickListener listerer) {this.mOnItemClickListerer = listerer;}public MainAdapter(Context context, List<String> mDatas) {this.context = context;this.mDatas = mDatas;}@Overridepublic RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {View view;if (viewType == type_zero) {view = LayoutInflater.from(parent.getContext()).inflate(R.layout.adapter_zero, parent, false);return new ZeroViewHolder(view);} else if (viewType == type_one) {//排序view = LayoutInflater.from(parent.getContext()).inflate(R.layout.adapter_one, parent, false);return new OneViewHolder(view);} else {view = LayoutInflater.from(parent.getContext()).inflate(R.layout.adapter_other, parent, false);}return new MyViewHolder(view);}@Overridepublic void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {switch (holder.getItemViewType()) {case type_zero:ZeroViewHolder zeroViewHolder = (ZeroViewHolder) holder;//聊天室榜单,逻辑break;case type_one:OneViewHolder oneViewHolder = (OneViewHolder) holder;//筛选,adapter点击置顶oneViewHolder.itemView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {mOnItemClickListerer.onItemClick(view,position);}});break;default:MyViewHolder myViewHolder = (MyViewHolder) holder;//内容,写逻辑myViewHolder.tv_text.setText(mDatas.get(position));break;}}@Overridepublic int getItemViewType(int position) {if (position == 0) {return type_zero;} else if (position == 1) {return type_one;} else {return type_two;}}@Overridepublic int getItemCount() {return mDatas.size();}class ZeroViewHolder extends RecyclerView.ViewHolder {public ZeroViewHolder(View itemView) {super(itemView);}}public class OneViewHolder extends RecyclerView.ViewHolder {public OneViewHolder(View itemView) {super(itemView);}}class MyViewHolder extends RecyclerView.ViewHolder {TextView tv_text;public MyViewHolder(View itemView) {super(itemView);tv_text = itemView.findViewById(R.id.tv_text);}}
}

Adapter 中主要判断为 position == 0 是聊天室榜单, position == 1 是筛选,其他的为显示的数据。

欢迎提出意见~~~

RecyclerView滑动置顶点击置顶的实现相关推荐

  1. android列表实现置顶,Android利用RecyclerView实现全选、置顶和拖拽功能示例

    Android利用RecyclerView实现全选.置顶和拖拽功能示例 发布时间:2020-08-23 16:26:42 来源:脚本之家 阅读:159 作者:爱开发 前言 今天给大家分享是如何在Rec ...

  2. html 窗口置顶,通用窗口置上(窗口置顶)工具

    您打开了N多个窗口,是否想让某一个窗口置顶或保持在最前面显示呢?本次发布的这款窗口置顶窗口置上工具可以帮您把将指定窗口设置为总在最上,让该窗口在其他窗口的上面显示,不被其他窗口所覆盖,总在最前面显示. ...

  3. RecyclerView 滑动显示返回按钮,点击返回到顶部

    底部有demo 地址*************************** 需要提前知道一些只是 RecyclerView.SCROLL_STATE_IDLE 是RecyclerView 滑动停止状态 ...

  4. RecyclerView跳转到指定位置,RecyclerView上下滑动监听,RecyclerView滑动速度

    1.RecyclerView跳转到指定位置 只需调用recycleview的置顶方法: recyclerView.scrollToPosition(15); 如果你需要让第15item在屏幕居中,只需 ...

  5. Android RecyclerView 滑动到指定位置 RecyclerView 滑动到顶部

    志在巅峰的攀登者,不会陶醉在沿途的某个脚印之中,在码农的世界里,优美的应用体验,来源于程序员对细节的处理以及自我要求的境界,年轻人也是忙忙碌碌的码农中一员,每天.每周,都会留下一些脚印,就是这些创作的 ...

  6. JS-内置对象内置构造函数事件-拖拽轮播图无缝滚动

    内置对象&内置构造函数 日期时间格式 // 创建一个当前时刻的日期时间对象 var date = new Date(); // 获取date对象中的年月日时分秒 var y = date.ge ...

  7. vue导航栏滑动切换居中,导航栏超出部分可以滑动,点击触发滑动对应的index,且滑动时导航栏会自动对应

    效果图 模仿婚礼纪电子请帖模块 导航栏超出部分可以滑动,点击触发滑动对应的index,且滑动时导航栏会自动对应 Html部分  <template><div class=" ...

  8. android—ListView与RecyclerView滑动显示和隐藏浮动按钮

    效果 自定义悬浮按钮 package cn.tsou.floatingactionbuttondemo.view;import android.content.Context; import andr ...

  9. 从源码角度入手实现RecyclerView的Item点击事件

    转载请注明出处:http://www.cnblogs.com/cnwutianhao/p/6758373.html RecyclerView 作为 ListView 和 GridView 的替代产物, ...

最新文章

  1. docker-compose常用命令
  2. graylog2 架构--转载
  3. 如何使用Maven的archetype快速生成一个新项目(解决生成项目目录不完整问题)...
  4. ppt给图片增加高斯模糊_制作PPT时,图片不清晰你如何处理?
  5. VS2010下使用dmp文件和pdb文件定位程序异常代码行号的注意事项
  6. opencv如何显示中文?
  7. 搭搭机器人科技活动中心怎么样_搭搭乐乐机器人怎么样?感受科技创收力量
  8. MySQL 启动故障 处理 小记
  9. python画猫和老鼠_观察者模式(猫与老鼠的故事!)
  10. 大数据之-Hadoop之HDFS_NameNode故障处理_NameNode元数据恢复_案例---大数据之hadoop工作笔记0073
  11. 用AI帮你画新年贺卡:只需输入几个单词,就能模仿大师名作
  12. 中国男性的私密数据大赏,女生勿入!
  13. LINUX内核协议栈分析初探
  14. 线性回归方程b保留几位小数_简单线性回归分析(python)
  15. 深度学习中评估指标:准确率Accuracy、召回率Recall、精确率Precision、特异度(真阴性率)和误报率、灵敏度(真阳性率)和漏报率、F1、PR、ROC、AUC、Dice系数、IOU
  16. 支付宝开发中,抱歉,该商户未开通支付宝服务,无法支付
  17. 微信公众平人数多服务器会崩溃吗,微信公众号平台推新功能 再也不怕文章崩溃...
  18. 推荐基于深度学习实时同步生成2D动画口型算法
  19. 金匮要略重点整理 笔记
  20. mongodb的安装与配置

热门文章

  1. unity 监听文件夹更新,获取本地图片并显示
  2. 微信小程序优选驾考驾照考试预约+后台管理系统SSM-JAVA【数据库设计、论文、源码、开题报告】
  3. 风力机叶片气动设计 matlab 程序,基于MATLAB的小型风力机叶片设计
  4. 2011年国庆2天厦门到平潭岛湄洲岛自驾游
  5. php布道师,百度智能小程序布道师计划发布,打造全链条导师服务
  6. 编程题 java 密码锁_Java实现 蓝桥杯VIP 算法提高 密码锁
  7. 搜狗输入法——导入本地txt词库
  8. bpmn-js汉化(将元素提示语进行汉化)
  9. python(3.10,Win10 64位)的wordcloud安装
  10. css 右上角 翻开动画_CSS3 transition动画、transform变换、animation动画