Android开发之适配器-ListView适配器的重复数据

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

    }



}

 

 

你可能感兴趣的:(Android开发)