代码:
public class MyAdapter extends BaseAdapter {
//定义两个常量,分别对应布局种类
/**
* 接收的布局类型
*/
public static final int ITEM_TYPE_FROM = 0;
/**
* 发送的布局类型
*/
public static final int ITEM_TYPE_TO = 1;
List<MsgBean> data;
LayoutInflater inflater;
public MyAdapter(Context context, List<MsgBean> list) {
data = list;
inflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return data.size();
}
@Override
public Object getItem(int position) {
return data.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
/**
* 返回数据源position位置对应的布局类型
*
* @param position
* @return
*/
//有多种布局,重写getItemViewType
@Override
public int getItemViewType(int position) {
return data.get(position).msgType;
}
/**
* 返回布局所有种类数量
* <p/>
* 总共两种布局
*
* @return
*/
@Override
public int getViewTypeCount() {
return 2;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//先取出对应位置消息实例对象
MsgBean msgBean = data.get(position);
//1.声明ViewHoler
ViewHolderFrom vhf = null;
ViewHolderTo vht = null;
//2.根据convertView判断
if (convertView == null) {
switch (msgBean.msgType) {
case ITEM_TYPE_FROM: {
//接收布局
vhf = new ViewHolderFrom();
convertView = inflater.inflate(R.layout.list_item_left, parent, false);
//对ViewHoder的控件初始化
vhf.iv_head = (ImageView) convertView.findViewById(R.id.iv_head);
vhf.tv_value = (TextView) convertView.findViewById(R.id.tv_value);
//关联convertView与ViewHolder
convertView.setTag(vhf);
//设置值
vhf.tv_value.setText(msgBean.msgValue);
}
break;
case ITEM_TYPE_TO: {
//发送布局
vht = new ViewHolderTo();
convertView = inflater.inflate(R.layout.list_item_right, parent, false);
//对ViewHoder的控件初始化
vht.iv_head_right = (ImageView) convertView.findViewById(R.id.iv_head_right);
vht.tv_value_right = (TextView) convertView.findViewById(R.id.tv_value_right);
//关联convertView与ViewHolder
convertView.setTag(vht);
vht.tv_value_right.setText(msgBean.msgValue);
}
break;
}
} else {
//有利用的视图
//根据消息类型获取对应的ViewHolder
switch (msgBean.msgType) {
case ITEM_TYPE_FROM: {
//接收ViewHolder
vhf = (ViewHolderFrom) convertView.getTag();
vhf.tv_value.setText(msgBean.msgValue);
}
break;
case ITEM_TYPE_TO: {
//发送ViewHolder
vht = (ViewHolderTo) convertView.getTag();
vht.tv_value_right.setText(msgBean.msgValue);
}
break;
}
}
//3.如果convertView为null,加载布局
// 根据msgBean.type来加载布局
//4.从convertView中取出Tag,并转换成ViewHolder
//5.设置值,根据消息种类,设置对应的ViewHoder的值
return convertView;
}
/**
* 接收布局的ViewHolder
*/
class ViewHolderFrom {
ImageView iv_head;
TextView tv_value;
}
/**
* 发送布局的ViewHolder
*/
class ViewHolderTo {
TextView tv_value_right;
ImageView iv_head_right;
}
}
布局文件:
public class MainActivity extends AppCompatActivity {
ListView lv;
List<MsgBean>data;
MyAdapter adapter;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv= (ListView) findViewById(R.id.lv);
intoData();
adapter=new MyAdapter(this,data);
lv.setAdapter(adapter);
}
private void intoData() {
data=new ArrayList<>();
//循环添加数据
for (int i=0;i<100;i++){
//i为奇数,接收方
//
MsgBean bean=new MsgBean();
bean.msgType=i%2==0?MyAdapter.ITEM_TYPE_TO:MyAdapter.ITEM_TYPE_FROM;
bean.msgValue=(i%2==0?"这是接收的数据"+i:"这是发送的数据"+i);
data.add(bean);
}
}
运行结果: