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

来源:互联网 发布:19级研究所升级数据 编辑:程序博客网 时间:2024/04/30 22:09
  • 效果图
    这里写图片描述

  • 首先分别定义三个不同的子项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来判断加载哪一个子项布局,在设置监听事件等思路就非常清晰了。
  • 基本思路就是这样的,大概代码还需要自行尝试。
0 0
原创粉丝点击