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

来源:互联网 发布:ubuntu下好用的输入法 编辑:程序博客网 时间:2024/06/07 08:18

<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

0 0