-
{
-
View view = mViews.get(viewId);
-
if (view == null)
-
{
-
view = mConvertView.findViewById(viewId);
-
mViews.put(viewId, view);
-
}
-
return (T) view;
-
}
-
public View getConvertView()
-
{
-
return mConvertView;
-
}
-
}
与传统的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)]
-
@Override
-
public View getView(int position, View convertView, ViewGroup parent)
-
{
-
//实例化一个viewHolder
-
ViewHolder viewHolder = ViewHolder.get(mContext, convertView, parent,
-
R.layout.item_single_str, position);
-
//通过getView获取控件
-
TextView tv = viewHolder.getView(R.id.id_tv_title);
-
//使用
-
tv.setText(mDatas.get(position));
-
return viewHolder.getConvertView();
-
}
只看getView,其他方法都一样;首先调用ViewHolder的get方法,如果convertView为null,new一个ViewHolder实例,通过使用mInflater.inflate加载布局,然后new一个SparseArray用于存储View,最后setTag(this);
如果存在那么直接getTag
最后通过getView(id)获取控件,如果存在则直接返回,否则调用findViewById,返回存储,返回。
好了,一个通用的ViewHolder写好了,以后一个项目几十个Adapter一个ViewHolder直接hold住全场大家可以省点时间斗个小地主了
============================================================================
有了通用的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)]
-
package com.example.zhy_baseadapterhelper;
-
import java.util.List;
-
import android.content.Context;
-
import android.view.LayoutInflater;
-
import android.view.View;
-
import android.view.ViewGroup;
-
import android.widget.BaseAdapter;
-
import android.widget.TextView;
-
public abstract class CommonAdapter extends BaseAdapter
-
{
-
protected LayoutInflater mInflater;
-
protected Context mContext;
-
protected List mDatas;
-
public CommonAdapter(Context context, List mDatas)
-
{
-
mInflater = LayoutInflater.from(context);
-
this.mContext = context;
-
this.mDatas = mDatas;
-
}
-
@Override
-
public int getCount()
-
{
-
return mDatas.size();
-
}
-
@Override
-
public Object getItem(int position)
-
{
-
return mDatas.get(position);
-
}
-
@Override
-
public long getItemId(int position)
-
{
-
return position;
-
}
-
}
我们的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