HardBirch

android平板上的GridView视图缓存优化

时间:11-06-13 栏目:安卓入门与提高 作者:张飞不张,文采横飞 评论:80 点击: 21,393 次


      最近在做android平板上的开发,其中涉及到高分辨率之下使用GridView的性能问题。在Android手机软件开发中,如果在ListView或者GridView上使用大数量Item,很多人都会想到ViewHolder......没错,ViewHolder非常适合用在ListView或者每行小于4个Item的GridView。但是如果是高分辨率的设备(android平板甚至android电视),每行包含4个以上Item的话,即使用了ViewHolder也依然卡。

      如下图,每行9个Item,而且每个Item的图片都是从网络动态下载的,这时就比较考验GridView视图的优化了。

      本文提出的优化方法是:在getView()构建一个View列表(List<View>),把最近构建的View存起来,回退时直接从View列表中读取,而不是动态构建。使用这种方法有2个好处:

1.快速读取过去的Item;

2.直接保存View而不是Bitmap,避免了ImageView.setImageBitmaps()带来的延时。

当然坏处就是浪费内存,所以要设定一个上限,超过了就删掉最老的Item。
先来看看这种方法与ViewHolder的性能对比:

100个Item往下滚到的三组数据对比,如上图:
“CacheAdapter 缓存50个Item”跟ViewHolderAdapter的速度很接近,由于CacheAdapter有缓存,所以会有1~2次快速读取Item(10~20个)的情况,而ViewHolder的每次读取Item速度比较平均。
“CacheAdapter 缓存75个Item”只在第一次往下滚动时消耗较长时间,第二次用了缓存的Item,所以速度快了很多。

 

 

100个Item往上滚到的三组数据对比,如上图:

“CacheAdapter 缓存50个Item”比ViewHolderAdapter的速度略快,“CacheAdapter 缓存75个Item”依然是最快的。
总结:“CacheAdapter 缓存50个Item”速度与HolderView略快,读取最近的Item速度最快,缓存的Item越多速度越快。“CacheAdapter 缓存75个Item”占用内存最少,这是由于一部分图片下载失败,保存的Item的图片为空,实际上是缓存越多Item占用的内存越多。

PS:这里用到异步读取网络图片,成功下载的就占用较多内存,下载失败就占用较少内存,所以内存占用情况并不是一个时刻的绝对值,占用内存只用于参考.....

本文程序源码可以到http://www.rayfile.com/zh-cn/files/5ebf5666-958a-11e0-99ec-0015c55db73d/这里下载。

CacheAdapter.java是实现缓存Item的自定义Adapter,源码如下:






public class Item {
public String itemImageURL;
public String itemTitle;
public Item(String itemImageURL, String itemTitle) {
this.itemImageURL = itemImageURL;
this.itemTitle = itemTitle;
}
}

private Context mContext;
private ArrayList<Item> mItems = new ArrayList<Item>();
LayoutInflater inflater;
public CacheAdapter(Context c) {
mContext = c;
inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

public void addItem(String itemImageURL, String itemTitle) {
mItems.add(new Item(itemImageURL, itemTitle));
}

public int getCount() {
return mItems.size();
}

public Item getItem(int position) {
return mItems.get(position);
}

public long getItemId(int position) {
return position;
}

List<Integer> lstPosition=new ArrayList<Integer>();
List<View> lstView=new ArrayList<View>();

List<Integer> lstTimes= new ArrayList<Integer>();
long startTime=0;
public View getView(int position, View convertView, ViewGroup parent) {
startTime=System.nanoTime();

if (lstPosition.contains(position) == false) {
if(lstPosition.size()>75)//这里设置缓存的Item数量
{
lstPosition.remove(0);//删除第一项
lstView.remove(0);//删除第一项
}
convertView = inflater.inflate(R.layout.item, null);
TextView text = (TextView) convertView.findViewById(R.id.itemText);
ImageView icon = (ImageView) convertView.findViewById(R.id.itemImage);
text.setText(mItems.get(position).itemTitle);
new AsyncLoadImage().execute(new Object[] { icon,mItems.get(position).itemImageURL });

lstPosition.add(position);//添加最新项
lstView.add(convertView);//添加最新项
} else
{
convertView = lstView.get(lstPosition.indexOf(position));
}

int endTime=(int) (System.nanoTime()-startTime);
lstTimes.add(endTime);
if(lstTimes.size()==10)
{
int total=0;
for(int i=0;i<lstTimes.size();i++)
total=total+lstTimes.get(i);

Log.e("10个所花的时间:" +total/1000 +" μs",
"所用内存:"+Runtime.getRuntime().totalMemory()/1024 +" KB");
lstTimes.clear();
}

return convertView;
}

/**
* 异步读取网络图片
* @author hellogv
*/
class AsyncLoadImage extends AsyncTask<Object, Object, Void> {
@Override
protected Void doInBackground(Object... params) {

try {
ImageView imageView=(ImageView) params[0];
String url=(String) params[1];
Bitmap bitmap = getBitmapByUrl(url);
publishProgress(new Object[] {imageView, bitmap});
} catch (MalformedURLException e) {
Log.e("error",e.getMessage());
e.printStackTrace();
} catch (IOException e) {
Log.e("error",e.getMessage());
e.printStackTrace();
}
return null;
}

protected void onProgressUpdate(Object... progress) {
ImageView imageView = (ImageView) progress[0];
imageView.setImageBitmap((Bitmap) progress[1]);
}
}

static public Bitmap getBitmapByUrl(String urlString)
throws MalformedURLException, IOException {
URL url = new URL(urlString);
URLConnection connection = url.openConnection();
connection.setConnectTimeout(25000);
connection.setReadTimeout(90000);
Bitmap bitmap = BitmapFactory.decodeStream(connection.getInputStream());
return bitmap;
}
}

其中if(lstPosition.size()>75)是设置缓存的Item数量的关键地方,这里缓存75个Item。

ViewHolderAdapter.java是实现ViewHolder加载Item的自定义Adapter,源码如下:






public class Item {
public String itemImageURL;
public String itemTitle;

public Item(String itemImageURL, String itemTitle) {
this.itemImageURL = itemImageURL;
this.itemTitle = itemTitle;
}
}

private Context mContext;
private ArrayList<Item> mItems = new ArrayList<Item>();
LayoutInflater inflater;
public ViewHolderAdapter(Context c) {
mContext = c;
inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

public void addItem(String itemImageURL, String itemTitle) {
mItems.add(new Item(itemImageURL, itemTitle));
}

public int getCount() {
return mItems.size();
}

public Item getItem(int position) {
return mItems.get(position);
}

public long getItemId(int position) {
return position;
}

static class ViewHolder {
TextView text;
ImageView icon;
}

List<Integer> lstTimes= new ArrayList<Integer>();
long startTime=0;
public View getView(int position, View convertView, ViewGroup parent) {
startTime=System.nanoTime();

ViewHolder holder;

if (convertView == null) {
convertView = inflater.inflate(R.layout.item, null);
holder = new ViewHolder();
holder.text = (TextView) convertView.findViewById(R.id.itemText);
holder.icon = (ImageView) convertView.findViewById(R.id.itemImage);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.text.setText(mItems.get(position).itemTitle);
new AsyncLoadImage().execute(new Object[]{holder.icon,mItems.get(position).itemImageURL });

int endTime=(int) (System.nanoTime()-startTime);
lstTimes.add(endTime);
if(lstTimes.size()==10)
{
int total=0;
for(int i=0;i<lstTimes.size();i++)
total=total+lstTimes.get(i);

Log.e("10个所花的时间:" +total/1000 +" μs",
"所用内存:"+Runtime.getRuntime().totalMemory()/1024 +" KB");
lstTimes.clear();
}

return convertView;
}

/**
* 异步读取网络图片
* @author hellogv
*/
class AsyncLoadImage extends AsyncTask<Object, Object, Void> {
@Override
protected Void doInBackground(Object... params) {

try {
ImageView imageView=(ImageView) params[0];
String url=(String) params[1];
Bitmap bitmap = CacheAdapter.getBitmapByUrl(url);
publishProgress(new Object[] {imageView, bitmap});
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}

protected void onProgressUpdate(Object... progress) {
ImageView imageView = (ImageView) progress[0];
imageView.setImageBitmap((Bitmap) progress[1]);
}
}

}

testPerformance.java是主程序,通过注释符就可以分别测试CacheAdapter与ViewHolderAdapter的性能,源码如下:










gridview.setAdapter(adapter);
String urlImage="";//请自己选择网络上的静态图片

for(int i=0;i<100;i++)
{
adapter.addItem(urlImage, "第"+i+"项");
}

}
}

声明: 本文由( 张飞不张,文采横飞 )原创编译,转载请保留链接: android平板上的GridView视图缓存优化

android平板上的GridView视图缓存优化:目前有80 条留言

  1. 0楼
    xiao030304:

    [e01] [e03]

    2011-06-13 15:13 [回复]
  2. 0楼
    ww2000e:

    [e01]

    2011-06-13 15:13 [回复]
  3. 0楼
    kf156:

    来顶个[e01]

    2011-06-13 15:14 [回复]
  4. 0楼
    longhumeng:

    顶一下 [e01]

    2011-06-13 15:14 [回复]
  5. 0楼
    lostlw:

    [e01]第一时间学习,先顶再看.

    2011-06-13 15:15 [回复]
  6. 0楼
    hope1013:

    灌水[e01]

    2011-06-13 15:16 [回复]
  7. 都[e01]的好迅速呀

    2011-06-13 15:18 [回复]
  8. 0楼
    hmc1985:

    [e01]不顶不行呀!

    2011-06-13 15:19 [回复]
  9. 0楼
    colinivy:

    专业,细致,顶星哥

    by 413X74NG

    2011-06-13 15:25 [回复]
  10. 0楼
    luoyuhhy:

    既然v哥出话了,那就来顶一下[e01]

    2011-06-13 15:26 [回复]
  11. 0楼
    shichuyao:

    菜鸟学习了!![e01]

    2011-06-13 20:49 [回复]
  12. [e01][e01]学习

    2011-06-13 22:00 [回复]
  13. 0楼
    apkapkapk:

    android的gridview本身就有一个缓存,用于缓存view。

    你这个缓存较android内部的缓存有什么好处呢?》

    2011-06-13 23:00 [回复]
  14. 0楼
    hellogv:

    回复 apkapkapk:
    加多缓存的数量,加多缓存数量+适当使用分页,可以达到非常流畅的效果。

    2011-06-13 23:06 [回复]
  15. 0楼
    sdtsfhh:

    [e01]

    2011-06-14 08:29 [回复]
  16. 0楼
    ies3022:

    [e01]

    2011-06-14 14:40 [回复]
  17. 0楼
    Lsxily:

    [e01][e01]

    2011-06-16 09:35 [回复]
  18. [e01]

    2011-06-17 09:05 [回复]
  19. 0楼
    jordenwu:

    [e04]gv哥 我来顶你!你懂的 哈哈

    2011-06-17 14:04 [回复]
  20. 还是内存问题

    2011-06-18 13:13 [回复]
  21. 我想请教一下:如果我想主界面分为左右两个视图,左视图中有button和其他的,点击后更新右视图,请问可以怎么实现呢?

    2011-06-19 05:10 [回复]
  22. 0楼
    reeve520:

    感觉好复杂啊[e08]

    2011-06-23 15:37 [回复]
  23. 0楼
    wangpp2009:

    如果我是向上滚动的话,你的缓存列表里面还是去除第一项,不会报错吗,按理说 向上滚动时,应该去除缓存列表的最后一项,而非第一项,不知道我理解的对不对

    2011-06-23 16:16 [回复]
  24. 0楼
    wangpp2009:

    好像最新加的永远在后面。。sorry

    2011-06-23 16:18 [回复]
  25. 0楼
    wangpp2009:

    再三想了还是觉得有问题,我写了一个跟你相似的列子,去除网络加载那一块,简单点,但是向上拖动的时候出现异常,不知你的这个向上拖动有问题吗?

    2011-06-23 16:23 [回复]
  26. 0楼
    wangpp2009:

    找到问题所在了 我缓存view用的是hashMap(因为需求),位置缓存用的是arrayList 去除缓存元素的时候 两个容器存储顺序不一样(我是认为这个导致出错的) 出问题了 对我上面的错误的地方表示抱歉

    2011-06-23 16:38 [回复]
  27. 0楼
    Ryan_1989:

    师兄,我想请教个问题,如果有29个远程图片的地址,怎么去实现第一张下载完开始下载第二张,依次下载,我现在做错了,成了29个任务同时开始下载图片,这样机子就卡住。能不能讲讲下思路或者写个实现预加载怎么实现 。谢谢了!

    2011-06-24 16:48 [回复]
  28. 0楼
    hellogv:

    回复 Ryan_1989:
    多线程+Handler

    2011-06-25 11:13 [回复]
  29. 0楼
    hzd2712:

    太占内存了!!!图片几百张的话效果如何?

    2011-06-27 20:45 [回复]
  30. 0楼
    hellogv:

    回复 hzd2712:
    本文就是不提倡保存几百张图片,本文的最多缓存75张图片而已

    2011-06-27 23:14 [回复]
  31. 0楼
    xyp5299:

    好样的。

    2011-07-11 17:46 [回复]
  32. 0楼
    z475382220:

    你好。请问一下 ,我想做一个弹出式的菜单,菜单中有几个拖动条,拖动其中的一个拖动条,可以调节菜单下图片的灰度,依次类推,可以调节暗度,亮度。请问这个要怎么做,比如要用到什么控件或什么类,换句话说就是菜单中滑块的移动,图片的效果就显示出来,就像photoshop中图片参数的调整 十万火急啊 谢谢了

    2011-07-19 02:44 [回复]
  33. 0楼
    wyyother:

    请问如何响应它们呀

    2011-08-19 15:28 [回复]
  34. 0楼
    hellogv:

    [reply]wyyother[/reply]
    响应什么?

    2011-08-24 18:43 [回复]
  35. 0楼
    MoreeVan:

    我看到了鼠标, 不要说是用模拟器作的截图 。。那能不卡吗。3.x的模拟器当卡的是相当有力啊。。~~

    2011-09-01 20:32 [回复]
  36. 0楼
    hellogv:

    [reply]MoreeVan[/reply]
    哥,你用过3.X的android么?3.X的android的任务栏是这样子的么?这是高分辨率的2.2模拟器

    2011-09-04 14:01 [回复]
  37. 0楼
    fishmen26:

    你的代码中将 getView中已经缓存过的convertView再缓存一次,这不是画蛇添足吗?
    缓存的数量越多越节约性能,表示完全不能同意这种说法。 getView中的convertView 只会缓存屏幕能够显示的view的个数,其实在滑动的过程中这个数量已经完全足够了,可以在
    if (convertView == null) {
    convertView = inflater.inflate(R.layout.item, null);
    holder = new ViewHolder();
    holder.text = (TextView) convertView.findViewById(R.id.itemText);
    holder.icon = (ImageView) convertView.findViewById(R.id.itemImage);
    convertView.setTag(holder);
    }
    中加入一个log ,比如 Log.v("123", "create new convetrView"); 可以观察到,实际create的view 只会比看的到的view数量多两个,以后无论如何滑动都不会再new出新的view。
    你的做法是直接先缓存75个,而且根据position的位置不通来更新这个catch ,就是说如果滑动到75个以后,每一个新的view都会被create出来,这样的话,假设你有10000条记录,那效率会是相当差的。反观android的做法,无论是多少条记录都只会产生固定数量的view。
    你觉得你这样的做法到底比android好在哪里呢?

    2011-09-14 17:34 [回复]
  38. 0楼
    hellogv:

    [reply]fishmen26[/reply]
    你漏了本文思路的根本—-大屏幕的android设备(平板/TV),如果是手机,我完全没必要去写这篇文字。很多平板和tv还是用2.2系统,girdview的缓存跟手机一样,一滚动就是几十个item,而不是手机的十几个item的出现。这就是本文意义所在。

    2011-09-15 18:56 [回复]
  39. 0楼
    fishmen26:

    [reply]hellogv[/reply]
    这个跟大屏幕的android设备(平板/TV)有关系吗?
    android已经实现了一个相当好的缓存机制,但是你的缓存机制只是根据position来判断是否要生成view,这样完全是背道而驰啊。还是那个问题如果有1000条记录,你怎么缓存?
    android 只会缓存比屏幕上可见view多一点的view,以后无论怎么滑动都不会产生新的view。
    请问你的缓存会是什么效果?

    2011-09-15 19:25 [回复]
  40. 0楼
    hellogv:

    [reply]fishmen26[/reply]
    你可以到http://v.qq.com/download_mobile.html 下载 “腾讯视频For Android Pad版”,这个是我开发的。

    2011-09-17 15:40 [回复]
  41. 0楼
    hellogv:

    [reply]fishmen26[/reply]
    我不知道你用的是什么adapter,反正我自己继承BaseAdapter的自定义Adapter每次上下滚动时都会调用到getView()。
    1.无论是1K个还是1W个都只是缓存最近的n个,本文的n是75;
    2.“android 只会缓存比屏幕上可见view多一点的view,以后无论怎么滑动都不会产生新的view”,多一点具体是多多少?产不产生新的view是由getView()说了算,你用的是什么adapter?

    2011-09-17 15:48 [回复]
  42. 0楼
    fishmen26:

    [reply]hellogv[/reply]
    最近75个,就是说如果有1000条记录从顶部滑动到底部 需要在你的缓存中new 出 1000 – 75个view

    你觉得这是缓存吗?

    我也用的是baseadapter ,而且是最基本的baseadapter ,请你自己打log出来看看,android的缓存,一个new了多少个view?
    发文前请深入了解。谢谢。

    2011-09-23 08:10 [回复]
  43. 0楼
    fishmen26:

    [reply]hellogv[/reply]
    如果这个项目运用到了这个缓存机制,我表示很遗憾。

    2011-09-23 08:14 [回复]
  44. 0楼
    hellogv:

    [reply]fishmen26[/reply]
    谢谢你的关注

    2011-09-25 17:13 [回复]
  45. 兄台,有联系方式么?找你有事情哦。谢谢,我QQ674839782

    2011-09-27 15:03 [回复]
  46. 0楼
    hellogv:

    [reply]yuboxin5566[/reply]
    有什么事?

    2011-09-27 22:52 [回复]
  47. 0楼
    ralphcai:

    代码条理清晰,赞一个~
    有个问题,代码中MS没处理bitmap对象的释放。
    bitmap对象必须手动recycle或者通过softreference机制recycle,在VM中它不像其它对象自然回收。加上一个APP的绘图内存上限是8M,一旦图片足够多的时候,会爆内存。
    bitmap内存管理的问题一直困扰着我,如果你也考虑过类似的问题,能否share一下?

    2011-09-28 16:59 [回复]
  48. 0楼
    lostlw:

    [quote=ralphcai]代码条理清晰,赞一个~
    有个问题,代码中MS没处理bitmap对象的释放。
    bitmap对象必须手动…[/quote]
    这个问题,同样关注中…困扰已久!

    2011-09-29 14:06 [回复]
  49. 0楼
    sodino:

    [reply]hellogv[/reply]
    "多一点具体是多多少?产不产生新的view是由getView()说了算,你用的是什么adapter?"

    如果是GridView,屏幕一个横向方向展示的View是N个,则“多一点具体是多多少”这个数量即为N。如果为Gallery或ListViwe,则值为1。

    “产不产生新的view是由getView()说了算”:
    只能说new一个View的操作是在getView()方法里,但不是由getView决定的,所有的Adapter都是如此。

    2011-10-22 21:31 [回复]
  50. 0楼
    bearray123:

    getView 里面开启异步线程去获取图片? 你这也太坑人了。。。每执行一次getView就要启一个线程。。VM承受得起吗?求解释

    2011-11-30 12:59 [回复]
  51. 0楼
    hellogv:

    [reply]bearray123[/reply]
    试过了,没事

    2011-11-30 15:33 [回复]
  52. 0楼
    comeonsbt:

    看看

    2011-12-06 16:00 [回复]
  53. 楼主您好: 我最近也在做android pad应用,碰到一个问题 就是gridView 当我滑动两屏幕后 利用再次上拉实现翻页 去读取下一页数据,请问有什么好的解决方案吗? 我现在做的延迟好大 体验不好。希望能恢复

    2011-12-12 20:26 [回复]
  54. 刚刚看了你的腾讯那个HD 你就那样一直加载 而不去除浏览过的图片就这样不停的加载? 那岂不是很。。。。

    2011-12-12 20:31 [回复]
  55. 0楼
    hellogv:

    [reply]zhangliang0824[/reply]
    延迟大。。。时间消耗在什么环节上?

    2011-12-15 22:29 [回复]
  56. 0楼
    hellogv:

    [reply]zhangliang0824[/reply]
    最新版用了很安全的内存释放机制,我们时刻都会观察VM的所用内存的

    2011-12-15 22:29 [回复]
  57. [reply]hellogv[/reply]
    主要是我的adapter 可能设计的不是很合理 因为项目要求 不能堆积图片 要很明显的翻页效果 怎么处理都不理想,时间主要消耗在了网络取图片上 有的时候还会取回图片数量不够,要重新补取

    2011-12-20 15:54 [回复]
  58. [reply]hellogv[/reply]
    有什么好的内存释放解决方案吗? 比如说Bitmap, 我今天的程序就在不停的溢出。R 不管用了。呵呵

    2011-12-20 15:55 [回复]
  59. 0楼
    hellogv:

    [reply]zhangliang0824[/reply]
    SoftReference<Bitmap>

    2011-12-21 17:56 [回复]
  60. [reply]hellogv[/reply]
    这个我用了,在去图片的时候有的时候会出问题,还有个问题 我看了您的程序 您是怎么监听最后两个position 然后自动加载的? 可以加下QQ吧 511250000

    2011-12-30 17:08 [回复]
  61. 0楼
    hellogv:

    [reply]zhangliang0824[/reply]
    http://blog.csdn.net/hellogv/article/details/6615487

    2011-12-30 18:38 [回复]
  62. [reply]hellogv[/reply]
    谢谢了 问题基本都解决了 美化下等待测试上线了。呵呵

    2011-12-31 18:46 [回复]
  63. 还有个问题请教你一下, 我发现android3.0的板子 虽然是1280*800的分辨率 但是会默认去drawable-mdpi 这个下面取资源文件,而放在drawable-hdpi下面的图片却会被无故缩小,您知道这个是什么原因吗?

    2012-01-10 10:10 [回复]
  64. 能加下好友吗?有问题请教啊 要不在这上面 效率太低了。

    2012-01-10 10:15 [回复]
  65. 0楼
    hellogv:

    [reply]zhangliang0824[/reply]
    效率太低指的是哪个方面,我改进一下

    2012-01-11 11:39 [回复]
  66. 我手机上也是这个思路做的。就是比android自带的顺畅。

    2012-02-01 18:11 [回复]
  67. 国威兄,最近很少看到你发帖子了啊,是不是项目太忙了呀!

    2012-02-04 14:40 [回复]
  68. 0楼
    futurebp:

    为什么gridview 的adapter里面getview的方法 第0个item会多次执行呢?请问这个是什么问题啊?

    2012-04-05 15:24 [回复]
  69. 0楼
    hellogv:

    [reply]futurebp[/reply]
    被初始化之后就开始显示组件了

    2012-04-06 15:45 [回复]
  70. 0楼
    dhongmo:

    顶一个吧。分享万岁

    2012-04-28 23:42 [回复]
  71. 0楼
    dhongmo:

    大哥,请问怎么样logcat出getView方法的时间和内存消耗情况的?

    2012-04-28 23:56 [回复]
  72. 0楼
    jackyxxxxx:

    本文写的很好,思路很新颖。 如果异步加载图片失败。 再次getview时,图片就不会重新再次下载了吧

    2012-06-07 15:44 [回复]
  73. 0楼
    hellogv:

    [reply]jackyxxxxx[/reply]
    看你自己有没有实现容错了,一般Bitmap为null,ImageView也会显示一个黑图而已

    2012-06-11 13:00 [回复]
  74. 0楼
    tclx1989:

    仰慕楼主啊!!!非常NB的案例,很值得小弟借鉴,谢谢

    2012-06-15 14:33 [回复]
  75. 0楼
    tclx1989:

    LZ问下你,用CacheAdapter的话,重新载入Activity而不退出程序,它会重复载入图片。用ViewHolderAdapter就不会,这是什么原因造成的

    2012-06-19 10:03 [回复]
  76. 完全看不懂啊,你要是一步一步的说明那就好了

    2012-06-29 16:15 [回复]
  77. 0楼
    donversion:

    楼主阿,异步加载,线程阿?

    2012-07-02 16:54 [回复]
  78. 0楼
    donversion:

    楼主阿,按照你的这个方法,我这里显示的很慢,有点卡,,,,

    2012-07-10 10:05 [回复]
  79. 0楼
    donversion:

    [reply]donversion[/reply]
    滚动得很慢

    2012-07-10 10:06 [回复]
  80. 0楼
    see2851:

    如果数据改变了如何更新UI?如果用你这方法notifyDataSetChanged()失效了

    2012-08-22 21:33 [回复]

发表评论


QQ群互动

Linux系统与内核学习群:194051772

WP建站技术学习交流群:194062106

魔豆之路QR

魔豆的Linux内核之路

魔豆的Linux内核之路

优秀工程师当看优秀书籍

优秀程序员,要看优秀书!

赞助商广告

友荐云推荐