前言:从此我们告别了一个listView 一个adapter的年代
- 第一步:定义抽象的CommonAdapter类
/**
- 下面看如何打造一个通过的Adapter,我们叫做CommonAdapter
- 继续分析,Adapter一般需要保持一个List对象,存储一个Bean的集合,
- 不同的ListView,Bean肯定是不同的,这个CommonAdapter肯定需要支持泛型,
- 内部维持一个List,就解决我们的问题了;
- @author Administrator 易皇星 2016.03.10
- @param list数据泛型
*/
public abstract class CommonAdapter<T> extends BaseAdapter {
protected LayoutInflater mInflater;
protected Context mContext;
protected List<T> mDatas;
protected final int mItemLayoutId;
/**
* //构造方法一次搞定传参
* @param context 上下文
* @param mDatas list数据集合
* @param mItemLayoutId Adapter需要的布局文件
*/
public CommonAdapter(Context context, List<T> mDatas,int mItemLayoutId) {
mInflater = LayoutInflater.from(context);
this.mContext = context;
this.mDatas = mDatas;
this.mItemLayoutId = mItemLayoutId;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return mDatas.size();
}
@Override
public T getItem(int position) {
// TODO Auto-generated method stub
return mDatas.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){
final ViewHolder viewHolder = getViewHolder(position, convertView, parent);
//最好的回调
convert(viewHolder, getItem(position));
return viewHolder.getConvertView();
}
private ViewHolder getViewHolder(int position, View convertView, ViewGroup parent) {
return ViewHolder.get(mContext, convertView, parent, mItemLayoutId,position);
}
/**
* 对外公布了一个convert方法,并且还把viewHolder和本Item对于的Bean对象给传出去,
* 现在convert方法里面需要干嘛呢?
* 通过ViewHolder把View找到,通过Item设置值;
* 现在我觉得代码简化到这样,我已经不需要单独写一个Adapter了,直接MainActivity匿名内部类走起
*
* @param helper
* @param item
*/
public abstract void convert(ViewHolder viewHolder, T object);
}
- 第二步:抽离出ViewHolder
public class ViewHolder {
private final SparseArray<View> mViews;
private Context mContext;
private View mConvertView;
// 构造方法
private ViewHolder(Context context, ViewGroup parent, int layoutId,
int position) {
this.mContext=context;
this.mViews = new SparseArray<View>();
mConvertView = LayoutInflater.from(context).inflate(layoutId, parent,
false);
// setTag
mConvertView.setTag(this);
// //配置ImageLoader两种发方法 1 可以在自己的MyApplication的oncrate()方法中配置
// 2.在此构造方法中配置
// //创建默认的ImageLoader配置参数
// ImageLoaderConfiguration configuration = ImageLoaderConfiguration.createDefault(context);
// ImageLoader.getInstance().init(configuration);
}
/**
* 拿到一个ViewHolder对象 对CommonAdapter提供一个暴漏的方法
*
* @param context
* @param convertView
* @param parent
* @param layoutId
* @param position
* @return
*/
public static ViewHolder get(Context context, View convertView,
ViewGroup parent, int layoutId, int position) {
if (convertView == null) {
return new ViewHolder(context, parent, layoutId, position);
}
return (ViewHolder) convertView.getTag();
}
public View getConvertView() {
return mConvertView;
}
/**
* 通过控件的Id获取对于的控件,如果没有则加入views
*
* @param viewId
* @return
*/
public <T extends View> T getView(int viewId) {
View view = mViews.get(viewId);
if (view == null) {
view = mConvertView.findViewById(viewId);
mViews.put(viewId, view);
}
return (T) view;
}
/**
* 为TextView设置字符串
*
* @param viewId
* @param text
* @return
*/
public ViewHolder setText(int viewId, String text) {
TextView view = getView(viewId);
view.setText(text);
return this;
}
/**
* 为TextView 设置字体颜色
* @param viewId
* @param textColor
* @return
*/
public ViewHolder setTextColor(int viewId, int textColor)
{
TextView view = getView(viewId);
view.setTextColor(textColor);
return this;
}
/**
* 同上
* @param viewId
* @param textColorRes
* @return
*/
public ViewHolder setTextColorRes(int viewId, int textColorRes)
{
TextView view = getView(viewId);
view.setTextColor(mContext.getResources().getColor(textColorRes));
return this;
}
/**
* 为ImageView设置图片
* 获取本地资源图片
* @param viewId
* @param drawableId
* @return
*/
public ViewHolder setImageResource(int viewId, int drawableId) {
ImageView view = getView(viewId);
view.setImageResource(drawableId);
return this;
}
/**
* 为ImageView设置图片
* Bitmp格式
* @param viewId
* @param drawableId
* @return
*/
public ViewHolder setImageBitmap(int viewId, Bitmap bm) {
ImageView view = getView(viewId);
view.setImageBitmap(bm);
return this;
}
/**
* 为ImageView设置图片
* 网络加载图片调用
* @param viewId
* @param drawableId
* @return
*/
public ViewHolder setImageByUrl(String url,int viewId) {
ImageLoader.getInstance().displayImage(url, (ImageView)getView(viewId),ImageOptions.Options());
return this;
}
/**
* Drawable 类型图片
*
* @param viewId
* @param drawable
* @return
*/
public ViewHolder setImageDrawable(int viewId, Drawable drawable)
{
ImageView view = getView(viewId);
view.setImageDrawable(drawable);
return this;
}
/**
* 设置背景颜色
* @param viewId
* @param color
* @return
*/
public ViewHolder setBackgroundColor(int viewId, int color)
{
View view = getView(viewId);
view.setBackgroundColor(color);
return this;
}
/**
* 本地资源
* @param viewId
* @param backgroundRes
* @return
*/
public ViewHolder setBackgroundRes(int viewId, int backgroundRes)
{
View view = getView(viewId);
view.setBackgroundResource(backgroundRes);
return this;
}
/**
* 为控件设置是否可点击
* @param viewId
* @param checked
* @return
*/
public ViewHolder setChecked(int viewId, boolean checked)
{
Checkable view = (Checkable) getView(viewId);
view.setChecked(checked);
return this;
}
/**
* 关于事件的
*/
public ViewHolder setOnClickListener(int viewId,
View.OnClickListener listener)
{
View view = getView(viewId);
view.setOnClickListener(listener);
return this;
}
}
- 调用:
public class MainActivity extends Activity {
private ListView lv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv=(ListView) findViewById(R.id.lv_main);
List<PersionInfo> mDatas=new ArrayList<PersionInfo>();
PersionInfo info=new PersionInfo("https://img-my.csdn.net/uploads/201309/01/1378037235_3453.jpg", "易皇星1");
PersionInfo info2=new PersionInfo("https://img-my.csdn.net/uploads/201309/01/1378037235_3453.jpg", "易皇星2");
PersionInfo info3=new PersionInfo("https://img-my.csdn.net/uploads/201309/01/1378037235_3453.jpg", "易皇星3");
PersionInfo info4=new PersionInfo("https://img-my.csdn.net/uploads/201309/01/1378037235_3453.jpg", "易皇星4");
mDatas.add(info);
mDatas.add(info2);
mDatas.add(info3);
mDatas.add(info4);
CommonAdapter<PersionInfo> myAdapter=new CommonAdapter<PersionInfo>(MainActivity.this, mDatas, R.layout.item_adapter) {
@Override
public void convert(ViewHolder helper, final PersionInfo item) {
helper.setText(R.id.tv_show, item.getName());
helper.setImageByUrl(item.getHead(), R.id.iv_head);
helper.setOnClickListener(R.id.tv_show, new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(mContext, item.getName(), 1).show();
}
});
}
};
lv.setAdapter(myAdapter);
}
}
- 勿忘添加权限:切记切记 ,,,坑啊。。。。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/12884.html