一般adapter的做法会重写getView方法

比如

 1 @Override 2     public View getView(int position, View convertView, ViewGroup parent) { 3         if (convertView == null) { 4             convertView = LayoutInflater.from(context).inflate(R.layout.contentitem, null); 5         } 6         TextView title = (TextView) convertView.findViewById(R.id.textViewTitle); 7         TextView author = (TextView) convertView.findViewById(R.id.textViewAuthor); 8         TextView content = (TextView) convertView.findViewById(R.id.textViewContent); 9         TextView otherInfo = (TextView) convertView.findViewById(R.id.textViewOtherInfo);10         ImageView contentImage = (ImageView)convertView.findViewById(R.id.imageView);11         ContentInfo info = data.get(position);12         title.setText(info.title);13         author.setText(info.author);14         content.setText(info.content);15         otherInfo.setText(info.otherInfo);16         new HttpImageLoader(contentImage).load(info.imageUri);17         convertView.setLayoutParams(new AbsListView.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT, AbsListView.LayoutParams.WRAP_CONTENT));18         return convertView;19     }

这样写有一个问题,就是如果我的图片比较大,contentImage 的加载时间就会比较长,那么当你很快的滚动listview的时候,就会刷新不过来。

为此我做了这样一个缓存

 1 public View getView(int position, View convertView, ViewGroup parent) { 2         if (convertView == null) { 3             convertView = LayoutInflater.from(context).inflate(R.layout.contentitem, null); 4         } 5  6         TextView title = (TextView) convertView.findViewById(R.id.textViewTitle); 7         TextView author = (TextView) convertView.findViewById(R.id.textViewAuthor); 8         TextView content = (TextView) convertView.findViewById(R.id.textViewContent); 9         TextView otherInfo = (TextView) convertView.findViewById(R.id.textViewOtherInfo);10         ImageView contentImage = (ImageView)convertView.findViewById(R.id.imageView);11         ContentInfo info = data.get(position);12         title.setText(info.title);13         author.setText(info.author);14         content.setText(info.content);15         otherInfo.setText(info.otherInfo);16         new HttpImageLoader(contentImage).load(info.imageUri);17         convertView.setLayoutParams(new AbsListView.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT, AbsListView.LayoutParams.WRAP_CONTENT));18 19         return convertView;20     }21 22     private class HttpImageLoader{23         private Bitmap bitmap;24         private ImageView image;25 26         final android.os.Handler handler = new android.os.Handler() {27             @Override28             public void handleMessage(Message msg) {29                 super.handleMessage(msg);30                 image.setImageBitmap(bitmap);31             }32         };33 34         public HttpImageLoader(ImageView view){35             image = view;36         }37         public void load(String url){38             final String u = url;39             if (map.containsKey(url)){40                 image.setImageBitmap(map.get(url));41                 return;42             }43             new Thread() {44                 @Override45                 public void run() {46                     bitmap = HttpUtil.getHttpBitmap(u);47                     map.put(u,bitmap);48                     handler.sendEmptyMessage(0);49                 }50             }.start();51 52         }53     }
HttpImageLoader类中,每次加载一个图片就会将这个图片缓存起来放入到map中,这样省去了重新从网络读取的时间。完全是从本地加载。
效果比之前好很多,但是还是会卡。
最后采用了最土的方法。
添加的时候,直接new一个view出来,然后将整个view放入到缓存中。
 1     public void add(final ContentInfo info) { 2         ContentItemView contentItemView  = new ContentItemView(context); 3         contentItemView.setContentInfo(info); 4         contentItemView.setLayoutParams(new AbsListView.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT, AbsListView.LayoutParams.WRAP_CONTENT)); 5  6         contentItemView.setOnClickListener(new View.OnClickListener() { 7             @Override 8             public void onClick(View v) { 9                 Intent intent = new Intent(context,ArticleActivity.class);10                 Bundle bundle = new Bundle();11                 intent.putExtra("info",info);12                 context.startActivity(intent);13             }14         });15         data.add(contentItemView);16     }

getView的时候直接从代码中将整个view取出来

1     @Override2     public View getView(int position, View convertView, ViewGroup parent) {3         return data.get(position);4     }

这样虽然比较耗内存,但是整个会变得很流畅。

不过如果这样做的话,还不如直接用Scrollview+linearLayout的组合比较合适。

当然了,前提是我能够保证在listview中的item不会太多,内存的消耗能够在我的容忍范围之内,才可以这样做。

更多相关文章

  1. [Android]加载外部.9图片
  2. android转页面
  3. Android一行代码 搞定图片太多,太大OOM(内存溢出)
  4. Android加载网络图片
  5. Android:用ViewPager实现广告栏
  6. 带图片的按钮-Android源代码
  7. Android(安卓)长按识别图中二维码 zxing

随机推荐

  1. android核心知识点学习资料
  2. android:属性 layout_alignParentRight an
  3. Android开发中修改程序字体
  4. Android用户界面 UI组件--自动提示输入框
  5. Android设备的唯一标识
  6. Android(安卓)图书总汇
  7. Android(安卓)Studio下载及离线升级方法
  8. Android中的5大布局和网格布局
  9. Android的控件属性
  10. Android中TextView内容过长加省略号