适配器是Android中的数据与View视图的桥梁,作用就是将数据通过适配器显示到对应的View视图上。

工作中,在用ListView做适配器数据时候,有些人肯定碰见过,如何优化效率,但是又出现重复数据的情况,如何避免重复数据而且又能提高ListView大数据量时候的效率呢?,解决方案就是2点:

1. 在getView方法中 进行View的判断,即做convertView ==null 这样的判断,这样是为了提高数据量大的时候的效率。

2.设置数据用setTag()/getTag()方法来进行对数据的存取,这样就可以防止数据的重复显示了

通过以上两点方法的处理,就可以达到较好的既提高显示效率,又防止重复显示数据的问题。下面给出一个实现的案例:

主要核心解决方案就是红色标注的部分代码。

package com.czm.adapter;

import java.util.ArrayList;

import android.R.integer;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView; import com.czm.entity.FileItem;
import com.czm.xcfilemanager.R; /**
* //设置sd卡的list适配器
* @author jczmdeveloper
*
*/ public class SdcardListAdapter extends BaseAdapter{ private LayoutInflater inflater;
private Context context;
private ArrayList listData;
private boolean[] checkFlagList;
static class ListItemView{ //自定义控件集合
public ImageView imageView;
public TextView tvFileName;
public TextView tvFileOther;
public ImageView ivCheck; } public SdcardListAdapter(Context ctx,ArrayList list){
this.context = ctx;
this.listData = list;
inflater = LayoutInflater.from(context); checkFlagList = new boolean[listData.size()];
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return listData.size();
} @Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
} @Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub //自定义视图
ListItemView listItemView = null;
if(convertView ==null){
//获取list_item布局文件的视图
convertView = inflater.inflate(R.layout.sdcard_list_item, null); listItemView = new ListItemView();
//获取控件对象
listItemView.imageView = (ImageView) convertView.findViewById(R.id.ivFileLogo);
listItemView.tvFileName = (TextView)convertView.findViewById(R.id.tvFileName);
listItemView.tvFileOther = (TextView)convertView.findViewById(R.id.tvFileOther);
listItemView.ivCheck = (ImageView)convertView.findViewById(R.id.ivCheck); //设置控件集到convertView
convertView.setTag(listItemView);
}else {
listItemView = (ListItemView)convertView.getTag();
}
//设置文字和图片
FileItem fileItem = (FileItem) listData.get(position); listItemView.imageView.setImageResource(fileItem.getImageID());
listItemView.tvFileName.setText(fileItem.getStrFileName().toString());
listItemView.tvFileOther.setText(fileItem.getnFileSize()+
fileItem.getStrDateTime().toString());
if(checkFlagList[position]){
listItemView.ivCheck.setImageResource(R.drawable.check);
}else{
listItemView.ivCheck.setImageResource(R.drawable.uncheck);
} return convertView;
}
public void setCheckFlag(int position,boolean bChecked){
checkFlagList[position] = bChecked;
}
public boolean getCheckFlag(int position){
return checkFlagList[position];
}
public boolean[] getCheckFlags(){
return checkFlagList;
} }

最新文章

  1. Qt5.5.1编译出来的程序出现libgcc_s_dw2-1.dll的解决方案
  2. Linux第三周——跟踪分析内核的启动过程
  3. MonoRail MVC应用(2)-构建多层结构的应用程序
  4. Android View绘制13问13答
  5. BNUOJ-26579 Bread Sorting YY
  6. 再看ADO对象模型
  7. MYSQL++之Connect类型
  8. 百度地图 api 功能封装类 (ZMap.js) 本地搜索,范围查找实例
  9. Changing a remote's URL
  10. 关于redis的使用
  11. Ceph神坑系列
  12. Postgres中postmaster代码解析(中)
  13. 详解MySQL表空间以及ibdata1文件过大问题
  14. Linux中errno的含义
  15. oracle 中 某个字段的长度不够的sql 语句
  16. [CF791D]Bear and Tree Jumps
  17. jqgrid 表格中筛选条件的多选下拉,树形下拉 ;文本框清除插件;高级查询多条件动态筛选插件[自主开发]
  18. 区块链区块的生成和链接,比特币btc的产生,UTXO的生成和消耗,比特币系统
  19. vue-cli 使用 font-awesome 字体插件
  20. ansible 一键部署

热门文章

  1. JQuery 去除字符串两边多余的空格
  2. 【HDU 1542】Atlantis 矩形面积并(线段树,扫描法)
  3. Process.StandardInput属性
  4. bzoj2893
  5. BZOJ3323: [Scoi2013]多项式的运算
  6. ♫【CSS】命名颜色
  7. Cocos2d-x 坑之一:Xcode文件真实目录与工程视图目录
  8. Android 全屏显示-隐藏Navigation Bar
  9. LoadRunner中的参数与变量
  10. HDOJ/HDU 2565 放大的X(分段思考~)