最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android RecyclerView的卡頓問(wèn)題的解決方法

 更新時(shí)間:2017年04月18日 10:22:26   作者:彼岸sakura  
本篇文章主要介紹了Android RecyclerView的卡頓問(wèn)題的解決方法,具有一定的參考價(jià)值,有興趣的可以了解一下。

RecyclerView為什么會(huì)卡

RecyclerView作為v7包的新控件,自從推出就廣受Android Developer們歡迎,實(shí)際上它已經(jīng)取代了ListView和GridView兩位老前輩的地位。然而不少親們想必也已經(jīng)發(fā)現(xiàn)了:沒(méi)有優(yōu)化過(guò)的Recycler性能很poor。上一篇博主使用的item也僅僅是一個(gè)圖兩串字而已,結(jié)果一滑動(dòng)就卡的要命,不能忍!

那么why?回想在用ListView和GridView的adapter時(shí),我們是用一種叫ViewHolder的自定義類(lèi)(容器)來(lái)實(shí)現(xiàn)優(yōu)化的,而RecyclerView的特性之一就是強(qiáng)制你使用它的RecyclerView.ViewHolder??墒牵琑ecyclerView.ViewHolder要比我們寫(xiě)的那個(gè)單純的容器復(fù)雜多了(源碼里算上注釋有大約500行),與RecyclerView.Adapter的聯(lián)系也是千絲萬(wàn)縷。

按stackoverflow上面比較通俗的解釋?zhuān)篟ecyclerView.Adapter里面的onCreateViewHolder()方法和onBindViewHolder()方法對(duì)時(shí)間都非常敏感。類(lèi)似I/O讀寫(xiě),Bitmap解碼一類(lèi)的耗時(shí)操作,最好不要在它們里面進(jìn)行。

如何解決這個(gè)問(wèn)題

首先當(dāng)然得優(yōu)化你的item,合理運(yùn)用<include>,<merge>,<ViewStub>等標(biāo)簽,使布局層次盡量少——其實(shí)ListView和GridView里你也應(yīng)該這么做,應(yīng)該當(dāng)成是一種寫(xiě)UI的習(xí)慣。

其次就是靈活使用各種第三方庫(kù),去完成各種耗時(shí)操作,比如通過(guò)Glide或者是Picasso加載圖片。優(yōu)秀的開(kāi)源庫(kù)在性能上往往都考慮得很仔細(xì)。

最后的問(wèn)題來(lái)了,如果只想寫(xiě)一個(gè)小demo,不愿大張旗鼓怎么辦?如果即便一般的第三方庫(kù)也不好解決問(wèn)題,比如上一篇那個(gè)該死的loadIcon()方法返回的是一個(gè)Drawable對(duì)象,Glide和Picasso都沒(méi)法直接處理,轉(zhuǎn)碼又等于添了個(gè)耗時(shí)任務(wù),那怎么辦?
真正的app管理應(yīng)用,應(yīng)該引入U(xiǎn)IL或者Picasso一類(lèi)的加載庫(kù)進(jìn)行圖標(biāo)加載

答案就是,想法在你setAdapter之前就把任務(wù)給完成。

Demo

喲西,上代碼!本文代碼完全基于上一篇文,無(wú)須刪減重構(gòu)。

主要就是增添了一個(gè)實(shí)體bean對(duì)象,setAdapter()時(shí)要傳遞的數(shù)據(jù),全部通過(guò)它預(yù)先加載到內(nèi)存里!這樣那倆敏感方法里只需要簡(jiǎn)單的get出來(lái)即可。

實(shí)體類(lèi)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;
  //這類(lèi)代碼可別逞英雄手動(dòng)寫(xiě)哦,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() {//然后只需要改這個(gè)方法
    mList = new ArrayList<>();
    manager = getPackageManager();
    List<PackageInfo> list = manager.getInstalledPackages(0);//獲取已安裝的全部應(yīng)用
    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);
      }
    }
    //拿到數(shù)據(jù)再setAdapter
    mainRcv.setLayoutManager(new LinearLayoutManager(this));
    mainRcv.setHasFixedSize(true);
    mainRcv.setAdapter(new AppAdapter(this, mList));
  }

適配器AppAdapter.java

  private List<AppBean> appList;
  //同樣這邊的類(lèi)型換過(guò)來(lái)
  public AppAdapter(Context context, List<AppBean> appList) {
    this.context = context;
    this.appList = appList;
    inflater = LayoutInflater.from(context);
    manager = context.getPackageManager();
  }
  //然后也只需要改這個(gè)方法
  @Override
  public void onBindViewHolder(AppHolder holder, final int position) {
    final AppBean bean = appList.get(position);
    holder.itemIconIv.setImageDrawable(bean.getIcon());//圖標(biāo)
    holder.itemNameTv.setText(bean.getName());//名稱(chēng)
    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()));//根據(jù)包名啟動(dòng)此應(yīng)用
        context.startActivity(intent);
      }
    });
  }

搞定!因?yàn)椴┲魇怯檬謾C(jī)直接錄像再轉(zhuǎn)gif,為了使點(diǎn)擊看上去有效果,于是給item增添了一個(gè)背景層,這需求實(shí)戰(zhàn)中也是很常見(jiàn)的哦~~

色彩資源文件colors.xml

這個(gè)粉紅色其實(shí)很難看,單純當(dāng)區(qū)別用。。。。。。

實(shí)戰(zhàn)開(kāi)發(fā)如果沒(méi)有美工,一定要仔細(xì)斟酌選取,盡量讓自己審美好點(diǎn)!

<?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">

<!-- 中間內(nèi)容無(wú)須修改,略-->

</RelativeLayout>

最終運(yùn)行效果

截圖已經(jīng)不太能感受到卡了,真機(jī)運(yùn)行更加流暢!

 

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android Glide的簡(jiǎn)單使用

    Android Glide的簡(jiǎn)單使用

    本文主要介紹了Glide簡(jiǎn)單使用。具有一定的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-01-01
  • Android 開(kāi)發(fā)使用PopupWindow實(shí)現(xiàn)彈出警告框的復(fù)用類(lèi)示例

    Android 開(kāi)發(fā)使用PopupWindow實(shí)現(xiàn)彈出警告框的復(fù)用類(lèi)示例

    這篇文章主要介紹了Android 開(kāi)發(fā)使用PopupWindow實(shí)現(xiàn)彈出警告框的復(fù)用類(lèi),結(jié)合實(shí)例形式分析了Android基于PopupWindow彈出警告框的復(fù)用類(lèi)具體布局與功能實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2020-05-05
  • 不可不知的Android strings.xml那些事

    不可不知的Android strings.xml那些事

    相信 strings.xml 已經(jīng)是大家在 Android 開(kāi)發(fā)中最熟悉的文件之一了,但其實(shí)它也有很多需要注意的地方和一些小技巧,知道了這些可以讓你的 Android 應(yīng)用更加規(guī)范易用,大家來(lái)看看吧
    2016-08-08
  • Android應(yīng)用開(kāi)發(fā)中Fragment與Activity間通信示例講解

    Android應(yīng)用開(kāi)發(fā)中Fragment與Activity間通信示例講解

    這篇文章主要介紹了Android應(yīng)用開(kāi)發(fā)中Fragment與Activity間通信實(shí)例講解,需要的朋友可以參考下
    2016-02-02
  • RecyclerView消除底部分割線(xiàn)的方法

    RecyclerView消除底部分割線(xiàn)的方法

    這篇文章主要為大家詳細(xì)介紹了RecyclerView消除底部分割線(xiàn)的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • Android使用Xutils3進(jìn)行斷點(diǎn)下載的實(shí)例

    Android使用Xutils3進(jìn)行斷點(diǎn)下載的實(shí)例

    在本篇內(nèi)容中小編給各位整理了關(guān)于Android使用Xutils3進(jìn)行斷點(diǎn)下載的實(shí)例以及相關(guān)代碼,需要的朋友們參考下。
    2019-07-07
  • Android實(shí)現(xiàn)儀表盤(pán)控件開(kāi)發(fā)

    Android實(shí)現(xiàn)儀表盤(pán)控件開(kāi)發(fā)

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)儀表盤(pán)控件開(kāi)發(fā),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • Android實(shí)現(xiàn)花瓣飄落效果的步驟

    Android實(shí)現(xiàn)花瓣飄落效果的步驟

    這篇文章主要介紹了Android實(shí)現(xiàn)花瓣飄落效果的步驟,幫助大家更好的理解和學(xué)習(xí)使用Android開(kāi)發(fā),感興趣的朋友可以了解下
    2021-04-04
  • Android如何在一個(gè)TextView中設(shè)置不同字體大小、不同字體顏色封裝

    Android如何在一個(gè)TextView中設(shè)置不同字體大小、不同字體顏色封裝

    在開(kāi)發(fā)過(guò)程中遇到過(guò)這樣一種業(yè)務(wù),有很多單行文本字體,字符串中每一部分的字體樣式、大小、顏色都不相同,傳統(tǒng)的做法是放多個(gè)TextView以達(dá)到效果,這篇文章主要介紹了android在一個(gè)TextView中設(shè)置不同字體大小、不同字體顏色封裝,需要的朋友可以參考下
    2024-07-07
  • Android啟動(dòng)頁(yè)解決方案(推薦)

    Android啟動(dòng)頁(yè)解決方案(推薦)

    啟動(dòng)頁(yè)幾乎成為了每個(gè)app的標(biāo)配,有些商家在啟動(dòng)頁(yè)中增加了開(kāi)屏廣告以此帶來(lái)更多的收入。目前啟動(dòng)頁(yè)的廣告都有倒計(jì)時(shí)的功能,那么我們?cè)诘褂?jì)時(shí)的過(guò)程中能做些什么呢?下面通過(guò)本文給大家詳細(xì)介紹供大家參考
    2017-03-03

最新評(píng)論

五指山市| 西乌| 塘沽区| 共和县| 西安市| 财经| 莱西市| 海淀区| 昂仁县| 静海县| 沙坪坝区| 井陉县| 玉山县| 遂溪县| 华阴市| 洛阳市| 冕宁县| 五家渠市| 安溪县| 肇东市| 磐安县| 安图县| 海宁市| 拜泉县| 多伦县| 南部县| 永兴县| 峨边| 佛山市| 兴国县| 杂多县| 民县| 门源| 梓潼县| 新乐市| 福州市| 报价| 武夷山市| 上虞市| 苏州市| 泰州市|