全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Android RecyclerView的卡顿问题的解决方法

RecyclerView为什么会卡

RecyclerView作为v7包的新控件,自从推出就广受Android Developer们欢迎,实际上它已经取代了ListView和GridView两位老前辈的地位。然而不少亲们想必也已经发现了:没有优化过的Recycler性能很poor。上一篇博主使用的item也仅仅是一个图两串字而已,结果一滑动就卡的要命,不能忍!

那么why?回想在用ListView和GridView的adapter时,我们是用一种叫ViewHolder的自定义类(容器)来实现优化的,而RecyclerView的特性之一就是强制你使用它的RecyclerView.ViewHolder。可是,RecyclerView.ViewHolder要比我们写的那个单纯的容器复杂多了(源码里算上注释有大约500行),与RecyclerView.Adapter的联系也是千丝万缕。

按stackoverflow上面比较通俗的解释:RecyclerView.Adapter里面的onCreateViewHolder()方法和onBindViewHolder()方法对时间都非常敏感。类似I/O读写,Bitmap解码一类的耗时操作,最好不要在它们里面进行。

如何解决这个问题

首先当然得优化你的item,合理运用<include>,<merge>,<ViewStub>等标签,使布局层次尽量少——其实ListView和GridView里你也应该这么做,应该当成是一种写UI的习惯。

其次就是灵活使用各种第三方库,去完成各种耗时操作,比如通过Glide或者是Picasso加载图片。优秀的开源库在性能上往往都考虑得很仔细。

最后的问题来了,如果只想写一个小demo,不愿大张旗鼓怎么办?如果即便一般的第三方库也不好解决问题,比如上一篇那个该死的loadIcon()方法返回的是一个Drawable对象,Glide和Picasso都没法直接处理,转码又等于添了个耗时任务,那怎么办?
真正的app管理应用,应该引入UIL或者Picasso一类的加载库进行图标加载

答案就是,想法在你setAdapter之前就把任务给完成。

Demo

哟西,上代码!本文代码完全基于上一篇文,无须删减重构。

主要就是增添了一个实体bean对象,setAdapter()时要传递的数据,全部通过它预先加载到内存里!这样那俩敏感方法里只需要简单的get出来即可。

实体类AppBean.java

package com.example.jin.localapp;
import android.graphics.drawable.Drawable;

/**
 * Created by Jin on 2016/11/8.
 */
public class AppBean {
  private CharSequence name;
  private String packageName;
  private Drawable icon;
  //这类代码可别逞英雄手动写哦,IDE(Android Studio和Eclipse都有的)里可以直接生成
  public CharSequence getName() {
    return name;
  }
  public void setName(CharSequence name) {
    this.name = name;
  }
  public String getPackageName() {
    return packageName;
  }
  public void setPackageName(String packageName) {
    this.packageName = packageName;
  }
  public Drawable getIcon() {
    return icon;
  }
  public void setIcon(Drawable icon) {
    this.icon = icon;
  }
}

主界面MainActivity.java

  private List<AppBean> mList;//mList的泛型换成AppBean
  private void initData() {//然后只需要改这个方法
    mList = new ArrayList<>();
    manager = getPackageManager();
    List<PackageInfo> list = manager.getInstalledPackages(0);//获取已安装的全部应用
    for (PackageInfo info : list) {
      if ((info.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
        AppBean bean = new AppBean();
        bean.setName(info.applicationInfo.loadLabel(manager));
        bean.setPackageName(info.packageName);
        bean.setIcon(info.applicationInfo.loadIcon(manager));
        mList.add(bean);
      }
    }
    //拿到数据再setAdapter
    mainRcv.setLayoutManager(new LinearLayoutManager(this));
    mainRcv.setHasFixedSize(true);
    mainRcv.setAdapter(new AppAdapter(this, mList));
  }

适配器AppAdapter.java

  private List<AppBean> appList;
  //同样这边的类型换过来
  public AppAdapter(Context context, List<AppBean> appList) {
    this.context = context;
    this.appList = appList;
    inflater = LayoutInflater.from(context);
    manager = context.getPackageManager();
  }
  //然后也只需要改这个方法
  @Override
  public void onBindViewHolder(AppHolder holder, final int position) {
    final AppBean bean = appList.get(position);
    holder.itemIconIv.setImageDrawable(bean.getIcon());//图标
    holder.itemNameTv.setText(bean.getName());//名称
    holder.itemPackageTv.setText(bean.getPackageName());//包名

    holder.view.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        Intent intent = new Intent(manager.getLaunchIntentForPackage(bean.getPackageName()));//根据包名启动此应用
        context.startActivity(intent);
      }
    });
  }

搞定!因为博主是用手机直接录像再转gif,为了使点击看上去有效果,于是给item增添了一个背景层,这需求实战中也是很常见的哦~~

色彩资源文件colors.xml

这个粉红色其实很难看,单纯当区别用。。。。。。

实战开发如果没有美工,一定要仔细斟酌选取,尽量让自己审美好点!

<?xml version="1.0" encoding="utf-8"?>
<resources>

  <color name="colorPrimary">#3F51B5</color>
  <color name="colorPrimaryDark">#303F9F</color>
  <color name="colorAccent">#FF4081</color>
  <color name="colorWhite">#ffffff</color>
  <color name="colorPink">#f8bbd0</color>

</resources>

选择器item_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

  <item android:state_selected="true" android:drawable="@color/colorWhite" />  
  <item android:state_focused="true" android:drawable="@color/colorPink" />  
  <item android:state_pressed="true" android:drawable="@color/colorPink" />
  <item android:drawable="@color/colorWhite"/>

</selector>

条目布局item_app.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:background="@drawable/item_selector"
  android:layout_width="match_parent"
  android:layout_height="60dp">

<!-- 中间内容无须修改,略-->

</RelativeLayout>

最终运行效果

截图已经不太能感受到卡了,真机运行更加流畅!

 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# recyclerview卡顿  # recyclerview滑动卡顿  # recyclerview卡顿问题  # Android中使用RecyclerView实现下拉刷新和上拉加载  # Android中RecyclerView布局代替GridView实现类似支付宝的界面  # Android中RecyclerView实现多级折叠列表效果(二)  # Android中RecyclerView实现横向滑动代码  # Android RecyclerView网格布局(支持多种分割线)详解(2)  # Android Recyclerview实现多选  # 单选  # 全选  # 反选  # 批量删除的功能  # Android RecyclerView 复用错乱通用解法详解  # Android RecyclerView实现下拉刷新和上拉加载  # Android项目实战之仿网易新闻的页面(RecyclerView )  # Android如何利用RecyclerView实现列表倒计时效果实例代码  # 只需要  # 上一篇  # 加载  # 机运  # 第三方  # 的是  # 是一个  # 逞英雄  # 来了  # 是一种  # 不太  # 你也  # 增添了  # 不愿  # 两位  # 这类  # 就把  # 得很  # 用手  # 千丝万缕 


相关文章: 如何选择可靠的免备案建站服务器?  黑客如何利用漏洞与弱口令入侵网站服务器?  制作网站的过程怎么写,用凡科建站如何制作自己的网站?  香港服务器租用每月最低只需15元?  建站之星微信建站一键生成小程序+多端营销系统  如何快速生成ASP一键建站模板并优化安全性?  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  成都网站制作公司哪家好,四川省职工服务网是做什么用?  高防服务器如何保障网站安全无虞?  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  PHP正则匹配日期和时间(时间戳转换)的实例代码  Swift中swift中的switch 语句  广州美橙建站如何快速搭建多端合一网站?  如何制作一个表白网站视频,关于勇敢表白的小标题?  c# 服务器GC和工作站GC的区别和设置  IOS倒计时设置UIButton标题title的抖动问题  百度网页制作网站有哪些,谁能告诉我百度网站是怎么联系?  如何在Golang中使用encoding/gob序列化对象_存储和传输数据  如何在阿里云高效完成企业建站全流程?  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  如何在企业微信快速生成手机电脑官网?  如何快速搭建高效WAP手机网站?  如何登录建站主机?访问步骤全解析  建站之星2.7模板快速切换与批量管理功能操作指南  如何快速建站并高效导出源代码?  如何在自有机房高效搭建专业网站?  如何通过虚拟主机空间快速建站?  网站建设制作、微信公众号,公明人民医院怎么在网上预约?  如何在阿里云虚拟主机上快速搭建个人网站?  济南企业网站制作公司,济南社保单位网上缴费步骤?  如何用VPS主机快速搭建个人网站?  简单实现Android验证码  Swift中循环语句中的转移语句 break 和 continue  专业制作网站的公司哪家好,建立一个公司网站的费用.有哪些部分,分别要多少钱?  如何快速查询域名建站关键信息?  武汉网站制作费用多少,在武汉武昌,建面100平方左右的房子,想装暖气片,费用大概是多少啊?  内部网站制作流程,如何建立公司内部网站?  宝塔建站助手安装配置与建站模板使用全流程解析  C++中引用和指针有什么区别?(代码说明)  开源网站制作软件,开源网站什么意思?  官网网站制作腾讯审核要多久,联想路由器newifi官网  高性价比服务器租赁——企业级配置与24小时运维服务  怎么用手机制作网站链接,dw怎么把手机适应页面变成网页?  php json中文编码为null的解决办法  外贸公司网站制作,外贸网站建设一般有哪些步骤?  如何在云虚拟主机上快速搭建个人网站?  C#如何使用XPathNavigator高效查询XML  阿里云网站制作公司,阿里云快速搭建网站好用吗?  宝塔新建站点为何无法访问?如何排查? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。