Listview加载不同布局
发布日期:2025-04-10 23:30:30 浏览次数:9 分类:精选文章

本文共 4161 字,大约阅读时间需要 13 分钟。

基于BaseAdapter的多布局adapter优化方案

在Android开发中,BaseAdapter作为一个通用的adapter框架,常用于实现多种item布局的需求。以下将详细阐述如何通过BaseAdapter实现多种item布局,并对两种常见布局进行详细分析。

方法分析

在设计adapter时,常见的实现方法有以下两种:

方法1.1.1:通过BaseAdapter的getViewTypeCount()获取Item种类数量,随后在getView()方法中根据不同的type设置不同的item布局

这种方法的优点在于维护相对简单,特别适用于布局较少的场景。其实现过程大致如下:

  • 获取各个item的type类型数量
  • 在getView()方法中根据type决定使用哪种布局
  • 根据type创建相应的view
  • 这种方法的缺点在于实现过程较为繁琐,特别是当需要频繁添加新的布局类型时,代码维护成本会显著增加。

    方法1.1.2:根据需求设置布局的显示隐藏效果

    这种方法的优势在于灵活性高,适用于需要动态控制布局显示隐藏效果的场景。实现步骤如下:

  • 根据需求设置各个布局的Visibility属性
  • 在adapter中根据需求判断是否显示该布局
  • 这种方法的缺点是维护相对麻烦,特别是当需要对多个布局进行设置时,代码复杂度会显著增加。

    主页面布局方案

    以下展示了主页面的布局设计,采用了RelativeLayout作为主要布局框架。

    item布局方案

    根据需求,可以设置两种不同的item布局:

    布局1:仅包含文字

    布局2:图片加文字

    具体实现

    以下将详细介绍adapter的实现过程,包括holder优化和view recycling的应用。

    Holder优化

    在Android中,使用Holder模式可以有效提升adapter的性能表现。以下展示了两种不同的Holder类:

    public class Holder1 {    TextView play_title;}public class Holder2 {    TextView play_info;    ImageView play_img;}

    adapter实现

    public class MyAdapter extends BaseAdapter {    private LayoutInflater inflater;    private static final int ITEM_TITLE = 0;    private static final int ITEM_INTRODUCE = 1;    public MyAdapter() {        inflater = LayoutInflater.from(getApplicationContext());    }    @Override    public int getCount() {        return bs.size();    }    @Override    public Object getItem(int position) {        return bs.get(position);    }    @Override    public int getItemViewType(int position) {        return bs.get(position).getType();    }    @Override    public int getViewTypeCount() {        return 2;    }    @Override    public long getItemId(int position) {        return position;    }    @Override    public View getView(int position, View convertView, ViewGroup parent) {        int type = getItemViewType(position);        Holder1 holder1 = null;        Holder2 holder2 = null;        if (convertView == null) {            switch (type) {                case ITEM_TITLE:                    convertView = inflater.inflate(R.layout.item_title, null);                    holder1 = new Holder1();                    holder1.play_title = (TextView) convertView.findViewById(R.id.title);                    holder1.play_title.setText(bs.get(position).getName());                    convertView.setTag(holder1);                    break;                case ITEM_INTRODUCE:                    convertView = inflater.inflate(R.layout.item_children, null);                    holder2 = new Holder2();                    holder2.play_info = (TextView) convertView.findViewById(R.id.info);                    holder2.play_img = (ImageView) convertView.findViewById(R.id.img);                    holder2.play_img.setBackgroundResource(bs.get(position).getImg());                    holder2.play_info.setText(bs.get(position).getName());                    convertView.setTag(holder2);                    break;            }        } else {            switch (type) {                case ITEM_TITLE:                    holder1 = (Holder1) convertView.getTag();                    holder1.play_title.setText(bs.get(position).getName());                    break;                case ITEM_INTRODUCE:                    holder2 = (Holder2) convertView.getTag();                    holder2.play_info.setText(bs.get(position).getName());                    holder2.play_img.setBackgroundResource(bs.get(position).getImg());                    break;            }        }        return convertView;    }}

    数据类

    以下展示了数据类的结构:

    public class ItemB {    private int img;    private String name;    private int type;    public ItemB(int img, String name, int type) {        this.img = img;        this.name = name;        this.type = type;    }    public int getImg() {        return img;    }    public void setImg(int img) {        this.img = img;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getType() {        return type;    }    public void setType(int type) {        this.type = type;    }}

    总结

    通过以上方法,可以实现基于BaseAdapter的多布局adapter,有效满足不同需求。通过合理设置布局和Holder优化,可以显著提升adapter的性能表现。在实际开发中,建议根据具体需求选择合适的布局方案,并通过测试优化adapter的性能表现。

    上一篇:listview数据刷新后自动滑到底部
    下一篇:ListView为什么只是第一列的数据可以选择,其它列不可以

    发表评论

    最新留言

    路过,博主的博客真漂亮。。
    [***.116.15.85]2025年04月29日 23时47分49秒