日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

android gridview滑动卡,Android RecyclerView的卡顿问题

發(fā)布時間:2025/4/5 Android 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android gridview滑动卡,Android RecyclerView的卡顿问题 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本文其實是上一篇Android本地app操作相關基礎的延伸,然而內(nèi)容基本沒什么聯(lián)系了(初學者身份瞬間暴露,打一槍換一個地方←_←),就不好意思再添個“續(xù)”或者“(2)”了~~

照舊先碼字!

RecyclerView為什么會卡

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

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

按stackoverflow上面比較通俗的解釋:RecyclerView.Adapter里面的onCreateViewHolder()方法和onBindViewHolder()方法對時間都非常敏感。類似I/O讀寫,Bitmap解碼一類的耗時操作,最好不要在它們里面進行。

如何解決這個問題

首先當然得優(yōu)化你的item,合理運用,,等標簽,使布局層次盡量少——其實ListView和GridView里你也應該這么做,應該當成是一種寫UI的習慣。

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

最后的問題來了,如果只想寫一個小demo,不愿大張旗鼓怎么辦?如果即便一般的第三方庫也不好解決問題,比如上一篇那個該死的loadIcon()方法返回的是一個Drawable對象,Glide和Picasso都沒法直接處理,轉(zhuǎn)碼又等于添了個耗時任務,那怎么辦?

真正的app管理應用,應該引入UIL或者Picasso一類的加載庫進行圖標加載

(在此原諒博主沒仔細敲代碼,就信口開河了)

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

Demo

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

主要就是增添了一個實體bean對象,setAdapter()時要傳遞的數(shù)據(jù),全部通過它預先加載到內(nèi)存里!這樣那倆敏感方法里只需要簡單的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 mList;//mList的泛型換成AppBean

private void initData() {//然后只需要改這個方法

mList = new ArrayList<>();

manager = getPackageManager();

List 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);

}

}

//拿到數(shù)據(jù)再setAdapter

mainRcv.setLayoutManager(new LinearLayoutManager(this));

mainRcv.setHasFixedSize(true);

mainRcv.setAdapter(new AppAdapter(this, mList));

}

適配器AppAdapter.java

private List appList;

//同樣這邊的類型換過來

public AppAdapter(Context context, List 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()));//根據(jù)包名啟動此應用

context.startActivity(intent);

}

});

}

搞定!因為博主是用手機直接錄像再轉(zhuǎn)gif,為了使點擊看上去有效果,于是給item增添了一個背景層,這需求實戰(zhàn)中也是很常見的哦~~

色彩資源文件colors.xml

這個粉紅色其實很難看,單純當區(qū)別用。。。。。。

實戰(zhàn)開發(fā)如果沒有美工,一定要仔細斟酌選取,盡量讓自己審美好點!

推薦一個不錯的配色方案網(wǎng)站Material Design調(diào)色板

#3F51B5

#303F9F

#FF4081

#ffffff

#f8bbd0

選擇器item_selector.xml

條目布局item_app.xml

android:background="@drawable/item_selector"

android:layout_width="match_parent"

android:layout_height="60dp">

最終運行效果

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

1.gif

總結(jié)

以上是生活随笔為你收集整理的android gridview滑动卡,Android RecyclerView的卡顿问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。