首页 文章 精选 留言 我的

精选列表

搜索[对象列表],共10011篇文章
优秀的个人博客,低调大师

顶部粘性的列表

先看效果 源码 Paste_Image.png 002.gif 为什么写这个控件? 之前有朋友问我,会不会手写这种效果,不是借助于第三方,卧槽,懵逼了。。。 网上搜罗了几个这种实现效果,感觉代码写的比较复杂 或者 实现效果不佳,还是自己动手实现一下吧。 首先需要一个 自定义接口 OnStickyViewChangeListener <pre> package org.alex.sectionrecyclerlayout; import android.view.View; /** * 作者:Alex * 时间:2016/11/14 14:31 * 简述:只要你的adapter实现了这接口,基本上就能做到这种效果了,自觉思路挺好的 */ public interface OnStickyViewChangeListener { int none = -99; int title = 1; int item = 2; int getStickyViewType(int position); int getHeadViewCount(); /\*\* \* @param position \* 在 RecyclerView 中 的下标 \*/ void onStickyViewTypeChange(View view, int position); } </pre> 组合一个控件,将 stickView 和 RecyclerView 包裹起来 <pre> package org.alex.sectionrecyclerlayout; import android.content.Context; import android.content.res.TypedArray; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.OrientationHelper; import android.support.v7.widget.RecyclerView; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; import android.widget.RelativeLayout; /** * 作者:Alex * 时间:2016/11/14 11:22 * 简述: * * @link */ public class StickyRecyclerLayout extends RelativeLayout { private RecyclerView recyclerView; private View stickyView; private LinearLayoutManager linearLayoutManager; private int stickyViewHeight; private OnStickyViewChangeListener onStickyViewChangeListener; private int currItemViewType; public StickyRecyclerLayout(Context context, AttributeSet attrs) { super(context, attrs); initView(context, attrs); } private void initView(Context context, AttributeSet attrs) { currItemViewType = OnStickyViewChangeListener.none; recyclerView = new RecyclerView(context); RelativeLayout.LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); recyclerView.setLayoutParams(params); linearLayoutManager = new LinearLayoutManager(context); linearLayoutManager.setOrientation(OrientationHelper.VERTICAL); recyclerView.setLayoutManager(linearLayoutManager); recyclerView.addOnScrollListener(new MyOnScrollListener()); addView(recyclerView); TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.StickyRecyclerLayout); int layoutId = typedArray.getResourceId(R.styleable.StickyRecyclerLayout_srl_sticky_view_layoutRes, -1); if (layoutId != -1) { stickyView = LayoutInflater.from(context).inflate(layoutId, null); addView(stickyView); } typedArray.recycle(); } public RecyclerView getRecyclerView() { return recyclerView; } private final class MyOnScrollListener extends RecyclerView.OnScrollListener { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); if (stickyView == null) { return; } stickyViewHeight = stickyView.getMeasuredHeight(); onStickyViewChangeListener = (onStickyViewChangeListener == null) ? (OnStickyViewChangeListener) recyclerView.getAdapter() : onStickyViewChangeListener; int headViewCount = onStickyViewChangeListener.getHeadViewCount(); int firstVisibleItemPosition = linearLayoutManager.findFirstVisibleItemPosition(); //LogUtil.e("firstVisibleItemPosition == " + firstVisibleItemPosition); /\*参照物的 视图 \*/ View referenceView = linearLayoutManager.findViewByPosition(firstVisibleItemPosition + 1); /\*TODO:参照物的 视图 类型 \* \* 如果 你用到了 https://github.com/CymChad/BaseRecyclerViewAdapterHelper \* 同时使用了 adapter.addHeaderView(headView); \* int referenceItemViewType = onStickyViewChangeListener.getStickyViewType(firstVisibleItemPosition); \* \* 否则 \* int referenceItemViewType = onStickyViewChangeListener.getStickyViewType(firstVisibleItemPosition + 1 ); \* \*/ int referenceItemViewType = onStickyViewChangeListener.getStickyViewType(firstVisibleItemPosition + 1); if (firstVisibleItemPosition < headViewCount) { stickyView.setVisibility(View.GONE); } else { stickyView.setVisibility(View.VISIBLE); } //LogUtil.e(firstVisibleItemPosition + " referenceViewHeight = " + referenceView.getMeasuredHeight() + " nextViewTop = " + referenceView.getTop() + " viewType = " + ((referenceItemViewType == OnStickyViewChangeListener.title) ? "title" : "item")); if (referenceItemViewType == OnStickyViewChangeListener.title) { int nextViewTop = referenceView.getTop(); if (nextViewTop - stickyViewHeight < 0) { //LogUtil.e(firstVisibleItemPosition + " ######### nextViewTop - stickyViewHeight = " + (nextViewTop - stickyViewHeight)); stickyView.setTranslationY(nextViewTop - stickyViewHeight); } else { stickyView.setTranslationY(0); } } else { stickyView.setTranslationY(0); } /\* TODO: 响应 回调 \* 如果 你用到了 https://github.com/CymChad/BaseRecyclerViewAdapterHelper \* 同时使用了 adapter.addHeaderView(headView); \* int tmpPosition = (firstVisibleItemPosition >= 1) ? firstVisibleItemPosition - 1 : firstVisibleItemPosition; \* \* 否则 \* int tmpPosition = firstVisibleItemPosition; \* \*/ int tmpPosition = firstVisibleItemPosition; int tmpCurrentItemViewType = onStickyViewChangeListener.getStickyViewType(tmpPosition); if (currItemViewType != tmpCurrentItemViewType) { currItemViewType = tmpCurrentItemViewType; onStickyViewChangeListener.onStickyViewTypeChange(stickyView, tmpPosition); } } } } </pre> 如果 你用多种布局写的 headView 下面的不用看了 你用到了 BaseRecyclerViewAdapterHelper .addHeadView 需要单独处理一下,别问我为啥 <pre> /*TODO:参照物的 视图 类型 * * 如果 你用到了 https://github.com/CymChad/BaseRecyclerViewAdapterHelper * 同时使用了 adapter.addHeaderView(headView); * int referenceItemViewType = onStickyViewChangeListener.getStickyViewType(firstVisibleItemPosition); * * 否则 * int referenceItemViewType = onStickyViewChangeListener.getStickyViewType(firstVisibleItemPosition + 1 ); * */ /* TODO: 响应 回调 * 如果 你用到了 https://github.com/CymChad/BaseRecyclerViewAdapterHelper * 同时使用了 adapter.addHeaderView(headView); * int tmpPosition = (firstVisibleItemPosition >= 1) ? firstVisibleItemPosition - 1 : firstVisibleItemPosition; * * 否则 * int tmpPosition = firstVisibleItemPosition; * */ /*TODO: 设置 headview 个数 * 如果 你用到了 https://github.com/CymChad/BaseRecyclerViewAdapterHelper * 同时使用了 adapter.addHeaderView(headView); * adapter.setHeadViewCount(1); * */ </pre>

优秀的个人博客,低调大师

我的IDEA插件列表

我算是个IDEA资深用户了,应该有10年了吧. IDEA默认提供的插件功能已经相当丰富,对流行的开源框架支持非常好. 下面说一下我安装的非默认插件: IdeaVim 在IDEA的编辑器使用vim编辑模式,如果你想尝试脱离鼠标做全键盘操作,这个就是神器. IdeaVim - Plugins | JetBrains IdeaVimExtension 作为上面插件的扩展,只提供一个功能,就是在normal模式的时候保持输入法是英文状态.你知道中文用户总是有各种场景需要切换输入法的. IdeaVimExtension - Plugins | JetBrains Google Java Format 按照Google的Java代码规范格式化代码,有了这个插件就不用在IDE里面这种配置了,这个插件帮助搞定一切,这个插件格式化的效果我非常喜欢,代码紧凑,易读.如果

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册