RecyclerView為什么會(huì)卡
為順慶等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及順慶網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、外貿(mào)網(wǎng)站建設(shè)、順慶網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!
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)實(shí)現(xiàn)優(yōu)化的,而RecyclerView的特性之一就是強(qiáng)制你使用它的RecyclerView.ViewHolder??墒牵琑ecyclerView.ViewHolder要比我們寫(xiě)的那個(gè)單純的容器復(fù)雜多了(源碼里算上注釋有大約500行),與RecyclerView.Adapter的聯(lián)系也是千絲萬(wàn)縷。
按stackoverflow上面比較通俗的解釋:RecyclerView.Adapter里面的onCreateViewHolder()方法和onBindViewHolder()方法對(duì)時(shí)間都非常敏感。類似I/O讀寫(xiě),Bitmap解碼一類的耗時(shí)操作,最好不要在它們里面進(jìn)行。
如何解決這個(gè)問(wèn)題
首先當(dāng)然得優(yōu)化你的item,合理運(yùn)用
其次就是靈活使用各種第三方庫(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一類的加載庫(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í)體類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; //這類代碼可別逞英雄手動(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 ListmList;//mList的泛型換成AppBean private void initData() {//然后只需要改這個(gè)方法 mList = new ArrayList<>(); manager = getPackageManager(); List 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 ListappList; //同樣這邊的類型換過(guò)來(lái) public AppAdapter(Context context, List 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());//名稱 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"?>#3F51B5 #303F9F #FF4081 #ffffff #f8bbd0
選擇器item_selector.xml
<?xml version="1.0" encoding="utf-8"?>
條目布局item_app.xml
<?xml version="1.0" encoding="utf-8"?>
最終運(yùn)行效果
截圖已經(jīng)不太能感受到卡了,真機(jī)運(yùn)行更加流暢!
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。