【ListView】三行搞定你的Adapter,和几十行的getview Say goodBye

本文介绍了一种优化ListView的写法,通过将ListView的item封装为一个自定义类,简化了Adapter中的代码,提高了代码的可读性和维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

listview的写法有很多,在这里我不去一一列举。无非就是利用convertview和viewholder。

今天给大家提供一条新的思路,不用去建立viewholder,也不用在adapter里写大量的代码。
demo地址下载

三行搞定getview()。

@Override
        public View getView(int position, View convertView, ViewGroup parent) {
            // TODO Auto-generated method stub
            if(convertView == null){
                convertView = new MyListItem(mContext);//初始化listview的item
            }
            ((MyListItem)convertView).setData(itembeans.get(position));//绑定数据
            return convertView;//显示到界面
        }

聪明的人应该看出来的,我把listview的item封装成了一个类,在adapter里做的仅仅是复用convertview和绑定数据源的操作。
一些复杂的操作我们完全可以交由我们封装好的类去做。这样,不仅优化了性能,更利用安卓自绘的高性能,且分离的大部分代码和功能,让适配器真的只起到了桥接的作用。

下面是实现流程:
1.自定义item布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

    <ImageView
        android:id="@+id/imgPic"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/tvName"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

第二步,封装数据类型

public class MyListItemBean {

    public String name;
    public Drawable img;
    public MyListItemBean(String name,Drawable img){
        this.name = name;
        this.img = img;
    }
}

第三步,将所需展示的item封装成自定义的view

public class MyListItem extends LinearLayout{

    public TextView tvName;
    public ImageView imgPic;
    //构造方法 载入view,绑定控件 id
    public MyListItem(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
        View.inflate(context, R.layout.my_list_item, this);
        tvName = (TextView) findViewById(R.id.tvName);
        imgPic = (ImageView) findViewById(R.id.imgPic);
    }
    /**
     * 绑定数据源
     * @param item
     */
    public void setData(MyListItemBean item){
        tvName.setText(item.name);
        imgPic.setImageDrawable(item.img);
    }

}

第四步,在MainActivity中定义适配器

    /**
     * 内部adapter 类 适配器
     * @author Administrator
     *
     */
    class MyAdapter extends BaseAdapter{

        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return itembeans.size();
        }

        @Override
        public Object getItem(int position) {
            // TODO Auto-generated method stub
            return itembeans.get(position);
        }

        @Override
        public long getItemId(int position) {
            // TODO Auto-generated method stub
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            // TODO Auto-generated method stub
            if(convertView == null){
                convertView = new MyListItem(mContext);//当首次加载时初始化listview的item
            }
            ((MyListItem)convertView).setData(itembeans.get(position));//利用缓存的convertview绑定数据并显示
            return convertView;//显示到界面
        }

    }

好了 ,到这里所有的准备工作都已经完成,接下来的就是给你的listview绑定这个适配器了。

这样写的优点:
1.效率上和传统写法一致。
2.避免了在adapter中进行大量数据绑定操作
3.有效封装,使得业务逻辑和代码层次非常清晰,后期修改起来也非常方便。

当然,没有一种写法是十全十美的,这里只是一种思路,希望大家多指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值