一般adapter的做法会重写getView方法
比如
1 @Override 2 public View getView(intposition, 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 newHttpImageLoader(contentImage).load(info.imageUri); 17 convertView.setLayoutParams(newAbsListView.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT, AbsListView.LayoutParams.WRAP_CONTENT)); 18 returnconvertView; 19 }
这样写有一个问题,就是如果我的图片比较大,contentImage 的加载时间就会比较长,那么当你很快的滚动listview的时候,就会刷新不过来。
为此我做了这样一个缓存
1 public View getView(intposition, 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 newHttpImageLoader(contentImage).load(info.imageUri); 17 convertView.setLayoutParams(newAbsListView.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT, AbsListView.LayoutParams.WRAP_CONTENT)); 18 19 returnconvertView; 20 } 21 22 private classHttpImageLoader{ 23 privateBitmap bitmap; 24 privateImageView image; 25 26 final android.os.Handler handler = newandroid.os.Handler() { 27 @Override 28 public voidhandleMessage(Message msg) { 29 super.handleMessage(msg); 30 image.setImageBitmap(bitmap); 31 } 32 }; 33 34 publicHttpImageLoader(ImageView view){ 35 image =view; 36 } 37 public voidload(String url){ 38 final String u =url; 39 if(map.containsKey(url)){ 40 image.setImageBitmap(map.get(url)); 41 return; 42 } 43 newThread() { 44 @Override 45 public voidrun() { 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(finalContentInfo info) { 2 ContentItemView contentItemView = newContentItemView(context); 3 contentItemView.setContentInfo(info); 4 contentItemView.setLayoutParams(newAbsListView.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT, AbsListView.LayoutParams.WRAP_CONTENT)); 5 6 contentItemView.setOnClickListener(newView.OnClickListener() { 7 @Override 8 public voidonClick(View v) { 9 Intent intent = new Intent(context,ArticleActivity.class); 10 Bundle bundle = newBundle(); 11 intent.putExtra("info",info); 12 context.startActivity(intent); 13 } 14 }); 15 data.add(contentItemView); 16 }
getView的时候直接从代码中将整个view取出来
1 @Override 2 public View getView(intposition, View convertView, ViewGroup parent) { 3 returndata.get(position); 4 }
这样虽然比较耗内存,但是整个会变得很流畅。
不过如果这样做的话,还不如直接用Scrollview+linearLayout的组合比较合适。
当然了,前提是我能够保证在listview中的item不会太多,内存的消耗能够在我的容忍范围之内,才可以这样做。