Android 快速开发--万能的Adapter,总结2021年180道Android岗面试题

{View view = mViews.get(viewId);if (view == null){view = mConvertView.findViewById(viewId);mViews.put(viewId, view);}return (T) view;}public View getConvertView()..
摘要由CSDN通过智能技术生成
  1. {

  2. View view = mViews.get(viewId);

  3. if (view == null)

  4. {

  5. view = mConvertView.findViewById(viewId);

  6. mViews.put(viewId, view);

  7. }

  8. return (T) view;

  9. }

  10. public View getConvertView()

  11. {

  12. return mConvertView;

  13. }

  14. }

与传统的ViewHolder不同,我们使用了一个SparseArray用于存储与之对于的convertView的所有的控件,当需要拿这些控件时,通过getView(id)进行获取;

下面看使用该ViewHolder的MyAdapter;

[java]  view plain copy [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g7TOElp4-1637980737321)(https://code.csdn.net/assets/CODE_ico.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-21Wv6ZGY-1637980737366)(https://code.csdn.net/assets/ico_fork.svg)]

  1. @Override

  2. public View getView(int position, View convertView, ViewGroup parent)

  3. {

  4. //实例化一个viewHolder

  5. ViewHolder viewHolder = ViewHolder.get(mContext, convertView, parent,

  6. R.layout.item_single_str, position);

  7. //通过getView获取控件

  8. TextView tv = viewHolder.getView(R.id.id_tv_title);

  9. //使用

  10. tv.setText(mDatas.get(position));

  11. return viewHolder.getConvertView();

  12. }

只看getView,其他方法都一样;首先调用ViewHolder的get方法,如果convertView为null,new一个ViewHolder实例,通过使用mInflater.inflate加载布局,然后new一个SparseArray用于存储View,最后setTag(this);

如果存在那么直接getTag

最后通过getView(id)获取控件,如果存在则直接返回,否则调用findViewById,返回存储,返回。

好了,一个通用的ViewHolder写好了,以后一个项目几十个Adapter一个ViewHolder直接hold住全场大家可以省点时间斗个小地主了

4、打造通用的Adapter

============================================================================

有了通用的ViewHolder大家肯定不能满足,怎么也得省出dota的时间,人在塔在~~

下面看如何打造一个通过的Adapter,我们叫做CommonAdapter

继续分析,Adapter一般需要保持一个List对象,存储一个Bean的集合,不同的ListView,Bean肯定是不同的,这个CommonAdapter肯定需要支持泛型,内部维持一个List,就解决我们的问题了;

于是我们初步打造我们的CommonAdapter

[java]  view plain copy [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eF66Opv7-1637980737367)(https://code.csdn.net/assets/CODE_ico.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IQD6WNdZ-1637980737368)(https://code.csdn.net/assets/ico_fork.svg)]

  1. package com.example.zhy_baseadapterhelper;

  2. import java.util.List;

  3. import android.content.Context;

  4. import android.view.LayoutInflater;

  5. import android.view.View;

  6. import android.view.ViewGroup;

  7. import android.widget.BaseAdapter;

  8. import android.widget.TextView;

  9. public abstract class CommonAdapter extends BaseAdapter

  10. {

  11. protected LayoutInflater mInflater;

  12. protected Context mContext;

  13. protected List mDatas;

  14. public CommonAdapter(Context context, List mDatas)

  15. {

  16. mInflater = LayoutInflater.from(context);

  17. this.mContext = context;

  18. this.mDatas = mDatas;

  19. }

  20. @Override

  21. public int getCount()

  22. {

  23. return mDatas.size();

  24. }

  25. @Override

  26. public Object getItem(int position)

  27. {

  28. return mDatas.get(position);

  29. }

  30. @Override

  31. public long getItemId(int position)

  32. {

  33. return position;

  34. }

  35. }

我们的CommonAdapter依然是一个抽象类,除了getView以外我们把其他的代码都实现了,这样的话,在使用我们的Adapter只要实现一个getView,然后getView里面再使用我们打造的通过的ViewHolder是不是感觉还不错~

现在我们的MyAdapter是这样的:

[java]  view plain copy [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N1AiEUFI-1637980737369)(https://code.csdn.net/assets/CODE_ico.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Fi4nrj0b-1637980737370)(https://code.csdn.net/asset

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值