listView的多布局的 应用

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


猜你喜欢

转载自blog.csdn.net/yang__k/article/details/80216631