关于ListView的多布局,我们经常可以在QQ聊天、微信聊天等见到这种情况,这里简单介绍ListVIew的简单聊天布局(两个布局),如果需要更多布局,只需根据相同的原理添加新布局就可
效果图
如果需要例子源码,请点击链接:http://pan.baidu.com/s/1jIFIxQe 密码:6bhv
Acitvity中的代码
//Msg为一个Ben类,包含type(类型判断),msg(数据信息)
List<Msg> list=new ArrayList<>();
for (int i = 0; i < 20; i++) {
Msg msg=new Msg();
if(i%2==0)
{
msg.type=MyAdapter.TYPE1;
msg.msg="这是左边的消息"+i;
}else {
msg.type=MyAdapter.TYPE2;
msg.msg="这是右边的消息"+i;
}
list.add(msg);
}
MyAdapter adapter=new MyAdapter(this,list);
ListView listView= (ListView) findViewById(R.id.listView);
listView.setAdapter(adapter);
核心代码MyAdapter
public class MyAdapter extends BaseAdapter {
List<Msg> list;
LayoutInflater inflater;
//定义两个常量,分别对应布局种类数量
// 数字必须充0开始,且数字大小必须小于种类数量,否则会报ArrayIndexOutOfBoundsException异常
public static final int TYPE1 = 0;
public static final int TYPE2 = 1;
//构造方法
public MyAdapter(Context context, List<Msg> list) {
this.list = list;
inflater = LayoutInflater.from(context);
}
//返回集合数据源大小
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
//多布局时必须返回布局种类数量
@Override
public int getViewTypeCount() {
return 2;
}
//多布局时必须返回每个布局的类型
@Override
public int getItemViewType(int position) {
return list.get(position).type;
}
//这里的方法跟单布局一样,只是多了一个判断,重写了一些重复的代码而已
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHoler1 holer1 = null;
ViewHoler2 holer2 = null;
if (convertView == null) {
switch (list.get(position).type) {
case TYPE1: {
convertView = inflater.inflate(R.layout.list_item_left, parent,false);
holer1 = new ViewHoler1();
holer1.imageView1 = (ImageView) convertView.findViewById(R.id.iv_head_left);
holer1.textView1 = (TextView) convertView.findViewById(R.id.tv_msg_left);
convertView.setTag(holer1);
}
break;
case TYPE2: {
convertView = inflater.inflate(R.layout.listview_item_rigth, parent,false);
holer2 = new ViewHoler2();
holer2.imageView2 = (ImageView) convertView.findViewById(R.id.iv_head_right);
holer2.textView2 = (TextView) convertView.findViewById(R.id.tv_msg_right);
convertView.setTag(holer2);
}
break;
}
} else {
//当convertView不为空时
switch (list.get(position).type) {
case TYPE1: {
holer1 = (ViewHoler1) convertView.getTag();
}
break;
case TYPE2: {
holer2 = (ViewHoler2) convertView.getTag();
}
break;
}
}
//按照类型设置数据
switch (list.get(position).type) {
case TYPE1: {
holer1.textView1.setText(list.get(position).msg);
}
break;
case TYPE2: {
holer2.textView2.setText(list.get(position).msg);
}
break;
}
return convertView;
}
//==============================================================
//设置ViewHoler区域
class ViewHoler1 {
ImageView imageView1;
TextView textView1;
}
class ViewHoler2 {
ImageView imageView2;
TextView textView2;
}
}