recyclerview

RecyclerView 局部(item)重绘技术总结

匿名 (未验证) 提交于 2019-12-02 23:37:01
RecyclerView item重绘技术总结 一.Android View重绘和更新: invalidate和requestLayout invalidate:invalidate方法会执行draw过程,重绘View树 requestLayout:当View的边界,也可以理解为View的宽高,发生了变化,不再适合现在的区域,可以调用requestLayout方法重新对View布局。 规律: View绘制分三个步骤,顺序是:onMeasure,onLayout,onDraw。经代码亲测,log输出显示: (1)调用invalidate方法只会执行onDraw方法; (2)调用requestLayout方法只会执行onMeasure方法和onLayout方法,并不会执行onDraw方法。 二.刷新temView 通过ViewHolder 的源码可以看到itemView成员,该成员就是item我们注入的View,通过直接处理这个view可以实现具备刷新。 public abstract static class ViewHolder { public final View itemView; WeakReference mNestedRecyclerView; int mPosition = NO_POSITION; 三.使用OnItemClickListener监听 具体步骤 1

RecyclerView与ListView

匿名 (未验证) 提交于 2019-12-02 23:34:01
为何google推出了RecyclerView,它与ListView相比有什么优势呢?RecyclerView是否可以完全替代ListView呢? 在缓存机制原理方面 ListView与RecyclerView缓存机制原理大致相似。都是离屏的ItemView即被回收至缓存,入屏的ItemView则会优先从缓存中获取。当然他们是的实现细节还是有差异的 。 ListView ListView有两级缓存;第一层:ActiveViews(用于屏幕内item的快速重用),第二层:ScrapViews(不可见item的缓存) RecyclerView RecyclerView有四级缓存。 屏幕内缓存: 在屏幕中显示的ViewHolder。缓存到mChangedScrap(缓存数据已经改变的ViewHolder)和mAttachedScrap中。 屏幕外缓存:列表滑动出屏幕时,ViewHolder会被缓存。缓存到mCachedViews中。(默认大小为2。大小由 mViewCacheMax 决定。Recyclerview.setItemViewCacheSize(), 可以设置屏幕外缓存的大小) 缓存池:屏幕外缓存的mCachedViews已满时,会将ViewHolder缓存到RecycledViewPool中。 RecyclerView具有的优势: 1

RecyclerView的简单使用

匿名 (未验证) 提交于 2019-12-02 23:32:01
简单讲讲RecyclerView的使用:(这里用的是androidX,而不是之前的supprot-v7,用法基本一样) 1、引入recyclerView的依赖库: implementation 'androidx.recyclerview:recyclerview:1.0.0' 2、主布局内添加RecyclerView的布局控件 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <androidx.recyclerview.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent"/> <

recyclerView的用法

匿名 (未验证) 提交于 2019-12-02 23:05:13
1》用recyclerView实现上次ListView实现的效果 导入包 dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) compile 'com.android.support:appcompat-v7:26.+' compile 'com.android.support:recyclerview-v7:26.0.0-alpha1'//导入相关的support包 testCompile 'junit:junit:4.12'} 导入recyclerView布局 <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match

自定义RecyclerView实现下拉刷新,加载更多

匿名 (未验证) 提交于 2019-12-02 22:56:40
RecyclerView出来的时间已经不短了,现在估计大部分的列表类的需求实现首选肯定是RecyclerView,基本上可以跟ListView说再见了。那么问题来了,一般情况下一个列表页面都会有下拉刷新和加载更多功能,RecyclerView本身并没有下拉刷新和加载更多功能,当然现在已经有很多优秀的开源的支持下拉刷新,加载更多功能的三方RecyclerView,可以直接拿过来用。但是。。。有时候光会用是不够的,还需要知道它们是这么实现的,实现的原理是什么。下面就来介绍一下RecyclerView下拉刷新,加载更多功能的实现套路。 要达到上面的效果首先要考虑的是这个顶部下拉的刷新的view和底部加载更多的view放在什么地方合适,答案就是自定义一个WrapAdapter适配器,通过包装Adapter来提供header和footer。因为RecyclerView的Adapter是支持显示多种不同类型的view的,只需要重写RecyclerView.Adapter的 getItemViewType(int position)方法,根据不同位置返回不同类型即可。可以利用这个特性把第0个位置和最后一个位置预留出来,固定把第0个item存放下拉刷新的view,把最后一个位置存放加载更多的view。 具体代码如下: /** * 实现显示头部和尾部item的adapter

RecyclerView的应用及RecyclerView的点击事件

时间秒杀一切 提交于 2019-12-02 21:33:57
第一步:导入依赖包 implementation 'com.android.support:recyclerview-v7:25.3.1' 第二步:用 JSONArray 解析后台数据并setadapter JSONArray jsonArray = jsonObject.getJSONArray("obj"); if (jsonArray.size() > 0) { for (int i = 0; i < jsonArray.size(); i++) { JSONObject jb = jsonArray.getJSONObject(i); patientID = jb.getInteger("id"); patientName = jb.getString("name"); patientPhone = jb.getString("phone"); patientSFZNum = jb.getString("identityno"); PatientPhoneBean patientPhoneBean = new PatientPhoneBean(); patientPhoneBean.setPatientID(patientID); patientPhoneBean.setPatientName(patientName); patientPhoneBean

Android SwipeRefreshLayout RecyclerView

戏子无情 提交于 2019-12-02 13:58:49
SwiperRefreshLayout 介绍 1、在坚直滑动时想要刷新页面可以用SwipeRefreshLayout来实现。它通过设置OnRefreshListener来监听界面的滑动从而实现刷新。也可以通过一些方法来设置SwipeRefreshLayout是否可以刷新。如setRefreshing(true),展开刷新动画。setRefreshing(false)取消刷新动画。setEnable(true)下拉刷新将不可用。 2、使用这个布局要想达到刷新的目的,需要在这个布局里包裹可以滑动的子控件,如ListView等,并且只能有一个控件。 主要方法 1、isRefreshing() 判断当前的状态是否是刷新状态。 2、setColorSchemeResources(int... colorResIds) 设置下拉进度条的颜色主题,参数为可变参数,并且是资源id,可以设置多种不同的颜色,每转一圈就显示一种颜色。 3、setOnRefreshListener(SwiperRefreshLayout.OnRefreshListener listener) 设置监听,需要重写onRefresh()方法,顶部下拉时会调用这个方法,在里面实现请求数据的逻辑,设置下拉进度条消失等。 4、setProgressBackgroundColorSchemeResource(int colorRes

完美解决SwipeRefreshLayout与RecyclerView滑动冲突问题

佐手、 提交于 2019-12-02 13:58:20
直接上代码 //解决swipelayout与Recyclerview的冲突 recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { int topRowVerticalPosition = (recyclerView == null || recyclerView.getChildCount() == 0) ? 0 : recyclerView.getChildAt(0).getTop(); swipeRefreshLayout.setEnabled(topRowVerticalPosition >= 0); } @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); } }); 另外网上还有重写Recyclerview的方法,亲测不管用,直接监听Recyclerview的滑动即可。 来源: CSDN 作者:

SwipeRefreshLayout和RecyclerView实现下拉刷新和加载更多(当总数据不够一页,也进行了处理)

ε祈祈猫儿з 提交于 2019-12-02 13:57:59
前言:利用SwipeRefreshLayout和RecyclerView来实现下拉刷新和加载更多,有很多的例子,但普遍都存在一个问题,当总的数据不够一屏时,FooterView也显示了,如果直接隐藏FooterView,加载更多时FooterView又不显示了,捣鼓了一阵子后,总算完美的解决了,所以记录一下,同时为了方便使用,进行了一些简单的封装。 直接进入主题,关于SwipeRefreshLayout和RecyclerView的一些基本介绍,就不在这里累述,不了解的童鞋,上网查一下吧! 一、封装自己的RefreshLayout控件 为什么要封装?为了使用方便;更为了Activity简单(MVP模式);因为Adapter的数据源类型不确定,所以采用泛型来实现。 java类和xml布局如下图 仔细的童鞋,已经发现了java类继承的是LinearLayout(xml根节点),为什么不用直接继承SwipeRefreshLayout(xml根节点)呢?其实一开始也是直接已SwipeRefreshLayout为根节点的,直接以SwipeRefreshLayout为根节点,运行后发现下拉刷新的颜色无法修改(swipeRefreshLayout.setColorSchemeColors(int color)无效),而且SwipeRefreshLayout.setRefreshing(false

SwipeRefreshLayout嵌套RecyclerView实现上下拉刷新

霸气de小男生 提交于 2019-12-02 13:57:15
在这里特别感谢大神,这里附上大神帖子: https://github.com/1030310877/LoadMoreRecyclerView SwipeRefreshLayout嵌套RecyclerView实现上下拉刷新。SwipeRedreshLayout是Android自带的一个下拉刷新控件。 它有自带的下拉刷新方法setOnRefreshListener(); //下拉刷新 swipeRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { //最后清空数据,否则可能造成下标越界,但是业务要求先清空数据,所以,我在刷新数据的同时,将RecyclerView的滑动事件给拦截掉 msgList.clear(); //设置RecyclerView的滑动状态,在下拉刷新时,将RecyclerView的滑动事件给消费,连拦截 recyclerView.setRecycleScrollBug(true); //加载数据 getData("0", "20"); //判断是否下拉刷新 refreshFlag = 1; //得到刷新数据的状态 firstFlag = 0; } }); 比较简单不在赘述。只是有一点需要注意