ListView加载两种Item样式问题总结

<span style="font-family:Arial, Helvetica, sans-serif;"><span style="background-color: rgb(255, 255, 255);">原创文章 ,转载请说明出处</span></span>
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">ListVeiw的重要性不多说,总结今天一下使用LIstView加载两种Item样式的情况</span>

1)要加载两种item样式,两个item样式xml文件肯定需要准备好 个人觉得 id望文生义很重要,

2)绑定ListView控件,不多说, 接着initView()准备两个Item布局需要的数据

3)最关键的一步来了,重写BaseAdapter!!!!!!!!!         怎么重写呢???附上的例子实现ListView的第一个Item与之后的Item样式不同,直接上代码 ,附带详细注释

importandroid.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by CMS on 2016/8/10.
 */
public class TextAdapter extends BaseAdapter{

    private class ViewHolder1{      //ListView中大海报模块ViewHolder
        ImageView imageView1;
        TextView textView1-1;
        TextView textView1-2;
        TextView textView1-3;
        TextView textView1-4;
        TextView textView1-5;
    }
    private class ViewHolder2{    //ListView下面子模块ViewHolder
        ImageView imageView2;
        TextView textView2-1;
        TextView textView2-2;
        TextView textView2-3;
        TextView textView2-4;
    }
    private Context context;     //存储上下文
    private List<Map<String,Object>> listData;   //存储数据源
    private int[] resource;     //存储item布局文件
    private String[] keyForm;    //存储数据key值
    private int[] idForm;       //存储对应控件Id
    private LayoutInflater inflater;   //用来找res/layout/下的xml布局文件,并且实例化
    private ViewHolder1 viewHolder1=null;
    private ViewHolder2viewHolder2=null;
    public TextAdapter(Context context,List<Map<String,Object>>listData, int[]resource, String[] keyForm, int[] idForm){
        this.context=context;
        this.listData=listData;
        this.resource=new int[resource.length];
        this.keyForm=new String[keyForm.length];
        this.idForm=new int[idForm.length];
        //调用系统方法拷贝数组
        System.arraycopy(keyForm,0,this.keyForm,0,keyForm.length);
        System.arraycopy(idForm,0,this.idForm,0,idForm.length);
        System.arraycopy(resource,0,this.resource,0,resource.length);
        inflater=(LayoutInflater) this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }
    @Override
    public int getCount(){
        return listData.size();
    }

    @Override
    public ObjectgetItem(int position) {
        return listData.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public int getViewTypeCount(){
        //重写getViewTypeCount()方法返回item样式的数量  这里实现ListView的第一个Item与之后的item的样式不同
        return 2;
    }

    @Override
    public int getItemViewType(int position) {
        //返回item的样式类型  用在getView()方法中判断
        if (position==0){  //如果是第一个item  放回类型0
            return 0;
        }else{            //如果是第二个item  放回类型1
            return 1;
        }
    }
    @Override
    public ViewgetView(int position, View convertView, ViewGroup parent){
        if (getItemViewType(position)==0){       //如果item需要使用的样式类型为第一种
              if (convertView!=null){           //判断是否缓存
                  viewHolder1= (ViewHolder1) convertView.getTag();  //converView不为空 通过tag找到缓存的布局
              }else{
                  convertView=inflater.inflate(resource[0],null); //同步第一个item的样式布局文件的实例化布局

                  viewHolder1=new ViewHolder1();   //实例化第一个Item对应的VIE我Holder
                  //获取idForm数组中的id数据  绑定控件
                  viewHolder1.imageView1= (ImageView) convertView.findViewById(idForm[0]);
                  viewHolder1.textView1-1= (TextView) convertView.findViewById(idForm[1]);
                  viewHolder1.textView1-2= (TextView) convertView.findViewById(idForm[2]);
                  viewHolder1.textView1-3= (TextView) convertView.findViewById(idForm[3]);
                  viewHolder1.textView1-4= (TextView) convertView.findViewById(idForm[4]);
                  viewHolder1.textView1-5= (TextView) convertView.findViewById(idForm[5]);

                  convertView.setTag(viewHolder1);
              }
        }else {                  //如果Item需要使用的样式为第二种   下面步骤同上
            if (convertView!=null){
                viewHolder2= (ViewHolder2) convertView.getTag();
            }else{
                convertView=inflater.inflate(resource[1],null);
                viewHolder2=new ViewHolder2();
                viewHolder2.imageView2= (ImageView) convertView.findViewById(idForm[6]);
                viewHolder2.textView2-1= (TextView) convertView.findViewById(idForm[7]);
                viewHolder2.textView2-2= (TextView) convertView.findViewById(idForm[8]);
                viewHolder2.textView2-3= (TextView) convertView.findViewById(idForm[9]);
                viewHolder2.textView2-4= (TextView) convertView.findViewById(idForm[10]);
                convertView.setTag(viewHolder2);
            }
        }
        //
        HashMap<String,Object> map= (HashMap<String,Object>) listData.get(position);    //通过位置获取listData中的map元素
        if(getItemViewType(position)==0&&map!=null){          //当item需要加载的布局类型为第一种时
            //通过keyFrorm获取各个数据相应的Key值 然后通过Key中在map中取出对应的数据
            int imageView1= (Integer) map.get(keyForm[0]);           
            String textView1-1= (String) map.get(keyForm[1]);
            String textView1-2= (String)map.get(keyForm[2]);
            String textView1-3= (String)map.get(keyForm[3]);
            //设置布局中控件要显示的视图
            viewHolder1.imageView1.setImageResource(imageView1);
            viewHolder1.textView1-1.setText(textView1-1);
            viewHolder1.textView1-2.setText(textView1-2);
            viewHolder1.textView1-3.setText(textView1-3);
            //为特定的控件设置点击事件
            viewHolder1.textView1-4.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(context, "报名参加", Toast.LENGTH_SHORT).show();
                }
            });
            viewHolder1.textView1-5.setOnClickListener(new View.OnClickListener(){
                @Override
                public void onClick(View v) {
                    Toast.makeText(context, "查看详情", Toast.LENGTH_SHORT).show();
                }
            });
        }else if (getItemViewType(position)!=0&&map!=null){   //当item需要加载的布局类型为第二种时   其他步骤同上
            int imageView2= (Integer) map.get(keyForm[4]);
            String textView2-1= (String) map.get(keyForm[5]);
            String textView2-2= (String)map.get(keyForm[6]);
            String textView2-3= (String)map.get(keyForm[7]);

            viewHolder2.imageView2.setImageResource(imageView2);
            viewHolder2.textView2-1.setText(textView2-1);
            viewHolder2.textView2-2.setText(textView2-2);
            viewHolder2.textView2-3.setText(textView2-3);

            viewHolder2.textView2-4.setOnClickListener(new View.OnClickListener(){
                @Override
                public void onClick(View v) {
                    Toast.makeText(context, "查看详情", Toast.LENGTH_SHORT).show();
                }
            });
        }
        return convertView;
    }
}

importandroid.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by CMS on 2016/8/10.
 */
public class TextAdapter extends BaseAdapter{

    private class ViewHolder1{      //ListView中大海报模块ViewHolder
        ImageView imageView1;
        TextView textView1-1;
        TextView textView1-2;
        TextView textView1-3;
        TextView textView1-4;
        TextView textView1-5;
    }
    private class ViewHolder2{    //ListView下面子模块ViewHolder
        ImageView imageView2;
        TextView textView2-1;
        TextView textView2-2;
        TextView textView2-3;
        TextView textView2-4;
    }
    private Context context;     //存储上下文
    private List<Map<String,Object>> listData;   //存储数据源
    private int[] resource;     //存储item布局文件
    private String[] keyForm;    //存储数据key值
    private int[] idForm;       //存储对应控件Id
    private LayoutInflater inflater;   //用来找res/layout/下的xml布局文件,并且实例化
    private ViewHolder1 viewHolder1=null;
    private ViewHolder2viewHolder2=null;
    public TextAdapter(Context context,List<Map<String,Object>>listData, int[]resource, String[] keyForm, int[] idForm){
        this.context=context;
        this.listData=listData;
        this.resource=new int[resource.length];
        this.keyForm=new String[keyForm.length];
        this.idForm=new int[idForm.length];
        //调用系统方法拷贝数组
        System.arraycopy(keyForm,0,this.keyForm,0,keyForm.length);
        System.arraycopy(idForm,0,this.idForm,0,idForm.length);
        System.arraycopy(resource,0,this.resource,0,resource.length);
        inflater=(LayoutInflater) this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }
    @Override
    public int getCount(){
        return listData.size();
    }

    @Override
    public ObjectgetItem(int position) {
        return listData.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public int getViewTypeCount(){
        //重写getViewTypeCount()方法返回item样式的数量  这里实现ListView的第一个Item与之后的item的样式不同
        return 2;
    }

    @Override
    public int getItemViewType(int position) {
        //返回item的样式类型  用在getView()方法中判断
        if (position==0){  //如果是第一个item  放回类型0
            return 0;
        }else{            //如果是第二个item  放回类型1
            return 1;
        }
    }
    @Override
    public ViewgetView(int position, View convertView, ViewGroup parent){
        if (getItemViewType(position)==0){       //如果item需要使用的样式类型为第一种
              if (convertView!=null){           //判断是否缓存
                  viewHolder1= (ViewHolder1) convertView.getTag();  //converView不为空 通过tag找到缓存的布局
              }else{
                  convertView=inflater.inflate(resource[0],null); //同步第一个item的样式布局文件的实例化布局

                  viewHolder1=new ViewHolder1();   //实例化第一个Item对应的VIE我Holder
                  //获取idForm数组中的id数据  绑定控件
                  viewHolder1.imageView1= (ImageView) convertView.findViewById(idForm[0]);
                  viewHolder1.textView1-1= (TextView) convertView.findViewById(idForm[1]);
                  viewHolder1.textView1-2= (TextView) convertView.findViewById(idForm[2]);
                  viewHolder1.textView1-3= (TextView) convertView.findViewById(idForm[3]);
                  viewHolder1.textView1-4= (TextView) convertView.findViewById(idForm[4]);
                  viewHolder1.textView1-5= (TextView) convertView.findViewById(idForm[5]);

                  convertView.setTag(viewHolder1);
              }
        }else {                  //如果Item需要使用的样式为第二种   下面步骤同上
            if (convertView!=null){
                viewHolder2= (ViewHolder2) convertView.getTag();
            }else{
                convertView=inflater.inflate(resource[1],null);
                viewHolder2=new ViewHolder2();
                viewHolder2.imageView2= (ImageView) convertView.findViewById(idForm[6]);
                viewHolder2.textView2-1= (TextView) convertView.findViewById(idForm[7]);
                viewHolder2.textView2-2= (TextView) convertView.findViewById(idForm[8]);
                viewHolder2.textView2-3= (TextView) convertView.findViewById(idForm[9]);
                viewHolder2.textView2-4= (TextView) convertView.findViewById(idForm[10]);
                convertView.setTag(viewHolder2);
            }
        }
        //
        HashMap<String,Object> map= (HashMap<String,Object>) listData.get(position);    //通过位置获取listData中的map元素
        if(getItemViewType(position)==0&&map!=null){          //当item需要加载的布局类型为第一种时
            //通过keyFrorm获取各个数据相应的Key值 然后通过Key中在map中取出对应的数据
            int imageView1= (Integer) map.get(keyForm[0]);           
            String textView1-1= (String) map.get(keyForm[1]);
            String textView1-2= (String)map.get(keyForm[2]);
            String textView1-3= (String)map.get(keyForm[3]);
            //设置布局中控件要显示的视图
            viewHolder1.imageView1.setImageResource(imageView1);
            viewHolder1.textView1-1.setText(textView1-1);
            viewHolder1.textView1-2.setText(textView1-2);
            viewHolder1.textView1-3.setText(textView1-3);
            //为特定的控件设置点击事件
            viewHolder1.textView1-4.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(context, "报名参加", Toast.LENGTH_SHORT).show();
                }
            });
            viewHolder1.textView1-5.setOnClickListener(new View.OnClickListener(){
                @Override
                public void onClick(View v) {
                    Toast.makeText(context, "查看详情", Toast.LENGTH_SHORT).show();
                }
            });
        }else if (getItemViewType(position)!=0&&map!=null){   //当item需要加载的布局类型为第二种时   其他步骤同上
            int imageView2= (Integer) map.get(keyForm[4]);
            String textView2-1= (String) map.get(keyForm[5]);
            String textView2-2= (String)map.get(keyForm[6]);
            String textView2-3= (String)map.get(keyForm[7]);

            viewHolder2.imageView2.setImageResource(imageView2);
            viewHolder2.textView2-1.setText(textView2-1);
            viewHolder2.textView2-2.setText(textView2-2);
            viewHolder2.textView2-3.setText(textView2-3);

            viewHolder2.textView2-4.setOnClickListener(new View.OnClickListener(){
                @Override
                public void onClick(View v) {
                    Toast.makeText(context, "查看详情", Toast.LENGTH_SHORT).show();
                }
            });
        }
        return convertView;
    }
}

4)回到Activity 实例化TextAdapter 将准备好的数据传入  然后setAdapter

猜你喜欢

转载自blog.csdn.net/sinat_31841263/article/details/52177799