代码:
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); } }
运行结果: