Android万能适配器 简化繁琐的开发

本文介绍了一种简化Android开发中ListView和GridView适配器的方法。通过创建一个通用的BaseAdapter,大大减少了每次编写适配器时的重复工作。同时,通过使用ViewHolder模式,进一步提升了列表视图的性能。

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

Android万能适配器 简化繁琐的开发
原文链接:http://mp.weixin.qq.com/s?__biz=MzA3MzE2MjgyMQ==&mid=401228643&idx=1&sn=e57d8e448411b40b46b25ea0e1446b42&scene=0#wechat_redirect

2016-01-12 威哥干Java

威哥干Java(weige-java)——不一样的技术分享,不一样的学习体验,跟威哥一起学Java,你一定可以!登录 http://www.codingke.com,更有C、C++、iOS、Android、Cocos2d-x、Swift课程免费看,我在扣丁学堂,你——在哪里?

项目中Listview GridView几乎是必用的组件,Android也提供一套机制,为这些控件绑定数据,那就是Adapter。用起来虽然还不错,但每次都需要去继承一个BaseAdapter,然后实现里面的一大堆方法,而我们每次最关心的无非就是getView方法,其余的方法几乎都是相同代码。这里是不是就可以优化起来呢?在其次,我们在使用Adapter的时候,为了优化性能,常常会创建一个Holder。而Holder里面每次存放的都是View,对Holer的操作无非也就是初始化,绑定数据,复用。这里是不是也可以抽取抽取? 好了,废话不多说,直接上代码。
首先第一步操作BaseAdapter公共部分抽取:

/**
 * 万能适配器
 * @param <T> 数据源的数据类型
 */
public abstract class CommonAdapter<T> extends BaseAdapter {
    protected Context mContext; //上下文;
    protected List<T> listDatas;//数据源;
    protected int layoutId;     //Item布局ID;

    {
        this.mContext = context;
        this.listDatas = listDatas;
        this.layoutId = layoutId;
    }

    @Override
    public int getCount() 
    {
        return listDatas == null ? 0 : listDatas.size();
    }

    @Override
    /**
     * 获取当前点击的Item的数据时用
     * 在onItemClick中 parent.getAdapter().getItem(),获取当前点击的Item的数据
     */
    public Object getItem(int position) 
    {
        return listDatas.get(position);
    }

    @Override
    {
        return position;
    }

    @Override
    /**
     * 只关心这一个方法
     */
    public View getView(int position, View convertView, ViewGroup parent) 
    {
        ViewHolder holder = ViewHolder.getViewHolder(mContext, convertView,parent, layoutId, position);
        fillData(holder, position);
        return holder.getMConvertView();
    }

    /**
     * 抽象方法,用于子类实现,填充数据
     */
    protected abstract void fillData(ViewHolder holder,       int position);

}
第二步Holer的通用化

/**
 * @author Mr.Himan Holer的通用化处理
 */
public class ViewHolder 
{

    /**
     * View容器,用于存放Holer中的View
     * SparseArray 是Android推荐使用的一个优化容器,相当于一个Map<integer,View>  
     */
    private SparseArray<View> mViews;

    private View mConvertView; //Item布局View convertView;

    public ViewHolder(Context context, ViewGroup parent, int layoutId) 
    {
        mViews = new SparseArray<View>();
        mConvertView = LayoutInflater.from(context).inflate(layoutId, null);
        mConvertView.setTag(this);
    }

    /**
     * 获取ViewHolder
     * @param context 上下文
     * @param convertView
     * @param parent
     * @param layoutId 布局layout Id
     * @param position
     * @return
     */
    public static ViewHolder getViewHolder(Context context, View convertView,ViewGroup parent, int layoutId) 
    {
        if (convertView == null)
            return new ViewHolder(context, parent, layoutId);
        return (ViewHolder) convertView.getTag();
    }

    /**
     * 获取Holder中的ItemView
     */
    @SuppressWarnings("unchecked")
    public <T extends View> T getView(int viewId) 
    {
        View item = mViews.get(viewId);
        if (item == null) 
        {
            item = mConvertView.findViewById(viewId);
            mViews.put(viewId, item);
        }
        return (T) item;
    }

    /**
     * 获取convertView
     */
    public View getMConvertView() 
    {
        return mConvertView;
    }
}
第三步使用

public class VolTeamAdapter extends CommonAdapter<Bean> 
{
    public VolTeamAdapter(Context context, List<Bean> listDatas,int layoutId) 
    {
        super(context, listDatas, layoutId);
    }

    @Override
{
        TextView actNum = holder.getView(R.id.team_item_active_num);
        TextView time = holder.getView(R.id.team_item_time);
        TextView title = holder.getView(R.id.team_item_title);
        CustomImageView icon = holder.getView(R.id.team_item_icon);
        Beanitem = listDatas.get(position);

        actNum.setText(String.valueOf(item.getActiveSum()) + "个");
        time.setText(String.valueOf(item.getTimeSum()) + "h");
        title.setText(item.getName());
        BitmapHelper.getInstance(context).display(icon, item.getPhoto());
    }
}

到这里 万事大吉,以后每次写Adaper的时候,无论你的Item布局怎么样,只需要重写一个方法绑定你的数据就OK,能节约不少开发时间。

威哥说:
每次重复写大概一样的适配器代码和ViewHolder,是时候要改造一下了,以上的代码你学会了吗,其实也不难理解,如果你看过扣丁Java面向对象中讲解模板方法设计模式的视频,你会很快明白,这里就是用的这个设计模式,把fillData方法延迟到子类中实现。至于这个通用的ViewHolder,大家可以改成自己的,或直接拿来用就可以了。

内容概要:本文档提供了关于“微型车间生产线的设计与生产数据采集试验研究”的毕业设计复现代码,涵盖从论文结构生成、机械结构设计、PLC控制系统设计、生产数据采集与分析系统、有限元分析、进度管理、文献管理和论文排版系统的完整实现。通过Python代码和API调用,详细展示了各个模块的功能实现和相互协作。例如,利用SolidWorks API设计机械结构,通过PLC控制系统模拟生产流程,使用数据分析工具进行生产数据的采集和异常检测,以及利用进度管理系统规划项目时间表。 适合人群:具有机械工程、自动化控制或计算机编程基础的学生或研究人员,尤其是从事智能制造领域相关工作的人员。 使用场景及目标:①帮助学生或研究人员快速搭建和理解微型车间生产线的设计与实现;②提供完整的代码框架,便于修改和扩展以适应不同的应用场景;③作为教学或科研项目的参考资料,用于学习和研究智能制造技术。 阅读建议:此资源不仅包含详细的代码实现,还涉及多个学科领域的知识,如机械设计、电气控制、数据分析等。因此,在学习过程中,建议读者结合实际操作,逐步理解每个模块的功能和原理,并尝试调整参数以观察不同设置下的系统表现。同时,可以参考提供的文献资料,深入研究相关理论和技术背景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值