适配器是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; } }