UI控件--ListView补充:包含多个子项布局的列表

  • 效果图
    这里写图片描述

  • 首先分别定义三个不同的子项item布局

  • 布局一
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="右边的消息"
        android:textColor="#000000"
        android:layout_toLeftOf="@+id/imageView_right"
        android:id="@+id/textView_right" />

    <ImageView
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:id="@+id/imageView_right"
        android:layout_alignParentRight="true" />
</RelativeLayout>
  • 对应的bean文件
public class MessageRight implements Type{
    private String msg;
    private int picId;

    public MessageRight(String msg, int picId) {
        this.msg = msg;
        this.picId = picId;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public int getPicId() {
        return picId;
    }

    public void setPicId(int picId) {
        this.picId = picId;
    }

    @Override
    public int getType() {
        return MyManyAdapter.TYPE_RIGHT;
    }
}
  • 布局二、三于此基本一致,就不再赘述。

-请注意一点,这里每一个bean类,都实现了一个接口,接口的代码如下

public interface Type {
    public int getType();
}
  • 可以看到接口中只有一个方法getType()
  • 这个接口的方法实现在自定义Adapter中用处很大

  • 对应的自定义Adapter

public class MyManyAdapter extends BaseAdapter {
    public static final int TYPE_TIME = 0;
    public static final int TYPE_LEFT = 1;
    public static final int TYPE_RIGHT =2;

    private Context context;
    //注意这里接收的是Type类型的数据
    private List<Type> dataList;

    public MyManyAdapter(Context context, List<Type> dataList) {
        this.context = context;
        this.dataList = dataList;
    }

    @Override
    public int getViewTypeCount() {
        return 3;
    }

    @Override
    public int getItemViewType(int position) {
        return dataList.get(position).getType();
    }

    @Override
    public int getCount() {
        return dataList.size();
    }

    @Override
    public Object getItem(int position) {
        return dataList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolderLeft viewHolderLeft=null;
        ViewHolderRight viewHolderRight=null;
        ViewHolderTime viewHolderTime=null;
        int type = dataList.get(position).getType();
        if (convertView==null){
            switch (type){
                case TYPE_TIME:
                    viewHolderTime=new ViewHolderTime();
                    convertView= LayoutInflater.from(context).inflate(R.layout.layout_time,null);
                    viewHolderTime.textView= (TextView) convertView.findViewById(R.id.textView_time);
                    convertView.setTag(viewHolderTime);
                    break;
                case TYPE_LEFT:
                    viewHolderLeft=new ViewHolderLeft();
                    convertView=LayoutInflater.from(context).inflate(R.layout.layout_left,null);
                    viewHolderLeft.imageView= (ImageView) convertView.findViewById(R.id.imageView_left);
                    viewHolderLeft.textView= (TextView) convertView.findViewById(R.id.textView_left);
                    viewHolderLeft.button_left= (Button) convertView.findViewById(R.id.button_left);
                    convertView.setTag(viewHolderLeft);
                    break;
                case TYPE_RIGHT:
                    viewHolderRight=new ViewHolderRight();
                    convertView=LayoutInflater.from(context).inflate(R.layout.layout_right,null);
                    viewHolderRight.imageView= (ImageView) convertView.findViewById(R.id.imageView_right);
                    viewHolderRight.textView= (TextView) convertView.findViewById(R.id.textView_right);
                    convertView.setTag(viewHolderRight);
                    break;
            }
        }else{
            switch (type){
                case TYPE_TIME:
                    viewHolderTime= (ViewHolderTime) convertView.getTag();
                    break;
                case TYPE_LEFT:
                    viewHolderLeft= (ViewHolderLeft) convertView.getTag();
                    break;
                case TYPE_RIGHT:
                    viewHolderRight= (ViewHolderRight) convertView.getTag();
                    break;
            }
        }
        switch (type){
            case TYPE_TIME:
                MessageTime time= (MessageTime) dataList.get(position);
                viewHolderTime.textView.setText(time.getTime());
                viewHolderTime.textView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Toast.makeText(context, "时间被点击了", Toast.LENGTH_SHORT).show();
                    }
                });
                break;
            case TYPE_LEFT:
                MessageLeft messageLeft= (MessageLeft) dataList.get(position);
                viewHolderLeft.imageView.setImageResource(messageLeft.getPicId());
                viewHolderLeft.textView.setText(messageLeft.getMsg());
                viewHolderLeft.button_left.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Toast.makeText(context, "左边的按钮被点击了", Toast.LENGTH_SHORT).show();
                    }
                });
                viewHolderLeft.imageView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Toast.makeText(context, "左边的图片被点击", Toast.LENGTH_SHORT).show();
                    }
                });
                break;
            case TYPE_RIGHT:
                MessageRight messageRight= (MessageRight) dataList.get(position);
                viewHolderRight.imageView.setImageResource(messageRight.getPicId());
                viewHolderRight.textView.setText(messageRight.getMsg());
                viewHolderRight.imageView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Toast.makeText(context, "右边的图片被点击", Toast.LENGTH_SHORT).show();
                    }
                });
                break;
        }


        return convertView;
    }

    class ViewHolderLeft {
        ImageView imageView;
        TextView textView;
        Button button_left;
    }

    class ViewHolderRight {
        ImageView imageView;
        TextView textView;
    }

    class ViewHolderTime {
        TextView textView;
    }
}
  • 注意这里新增加的两个复写的方法
@Override
    public int getViewTypeCount() {
        return 3;
    }

    @Override
    public int getItemViewType(int position) {
        return dataList.get(position).getType();
    }
  • getViewTypeCount() ,用于返回自定义子项不同布局的数目,有几种不同的子项布局,就返回几
  • getItemViewType(),用于效率优化的时候,判断内存中是否有你正要加载的子项的布局缓存,因为当前划出屏幕的item布局不一定与正在生成的子项是同一个布局,这里就需要这个方法来判断一下,内存中是否有可以复用的布局。

  • 还有一个小细节
    @Override

  • 在getView()方法中,获取type的设置很巧妙
  • private List dataList;
  • 首先我们定义的存储数据的list泛型是Type,这样就可以讲三种实现Type接口的bean类实例都放进去
  • int type = dataList.get(position).getType();
  • 然后再getView()方法应用了向下转型,来获取Type
  • 最后,格局获取到的type来判断加载哪一个子项布局,在设置监听事件等思路就非常清晰了。
  • 基本思路就是这样的,大概代码还需要自行尝试。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值