Android 完美对BaseAdapter进行二次封装

在开发列表的界面的时候经常会重写BaseAdapter,利用网上的知识点技巧,自己对它进行了二次封装方便以后在项目中再次使用。使用起来方便得很。

当然如何你看了代码可以的话,也可以对ExpandableListAdapter同样的封装!

使用自定义BaseAdapter:

package com.cyy.myandroid;

import android.content.Context;
import android.provider.ContactsContract.Data;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.style.ForegroundColorSpan;
import android.view.View;
import android.widget.TextView;

public class RankingListAdapter extends BaseAdapter<Data> {

	public RankingListAdapter(Context context) {
		super(context);
	}

	@Override
	public int getContentView() {//item布局
		return R.layout.activity_main_item;
	}

	@Override
	public void onInitView(View view, int position) {
		TextView tvNumb = get(view, R.id.tv);  // 直接item布局里的控件

		Data data = getItem(position);
		tvNumb.setText(String.valueOf(position + 1));
	}
}

自定义BaseAdapter:

package com.cyy.myandroid;

import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public abstract class BaseAdapter<T> extends android.widget.BaseAdapter {
	private List<T> list;

	protected Context context;

	public BaseAdapter(Context context) {
		init(context, new ArrayList<T>());
	}

	public BaseAdapter(Context context, List<T> list) {
		init(context, list);
	}

	private void init(Context context, List<T> list) {
		this.list = list;
		this.context = context;
	}

	public List<T> getList() {
		return list;
	}

	public void setList(List<T> list) {
		this.list = list;
	}

	public void clear() {
		this.list.clear();
		notifyDataSetChanged();
	}

	public void addAll(List<T> list) {
		if (list != null) {
			this.list.addAll(list);
			notifyDataSetChanged();
		}
	}

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

	@Override
	public T getItem(int position) {
		return list.get(position);
	}

	@Override
	public long getItemId(int position) {
		return position;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		if (null == convertView) {
			convertView = inflate(getContentView());
		}
		onInitView(convertView, position);
		return convertView;
	}

	/** 加载布局 */
	private View inflate(int layoutResID) {
		LayoutInflater layoutInflater = (LayoutInflater) context
				.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		View view = layoutInflater.inflate(layoutResID, null);
		return view;
	}

	public abstract int getContentView();

	public abstract void onInitView(View view, int position);

	/**
	 *
	 * @param view
	 *            converView
	 * @param id
	 *            控件的id
	 * @return 返回<T extends View>
	 */
	@SuppressWarnings("unchecked")
	protected <E extends View> E get(View view, int id) {
		SparseArray<View> viewHolder = (SparseArray<View>) view.getTag();
		if (null == viewHolder) {
			viewHolder = new SparseArray<View>();
			view.setTag(viewHolder);
		}
		View childView = viewHolder.get(id);
		if (null == childView) {
			childView = view.findViewById(id);
			viewHolder.put(id, childView);

		}
		return (E) childView;
	}
}
时间: 2024-10-30 11:06:24

Android 完美对BaseAdapter进行二次封装的相关文章

毕加索的艺术——Picasso,一个强大的Android图片下载缓存库,OkHttpUtils的使用,二次封装PicassoUtils实现微信精选

毕加索的艺术--Picasso,一个强大的Android图片下载缓存库,OkHttpUtils的使用,二次封装PicassoUtils实现微信精选 官网: http://square.github.io/picasso/ 我们在上篇OkHttp的时候说过这个Picasso,学名毕加索,是Square公司开源的一个Android图形缓存库,而且使用起来也是非常的简单,只要一行代码就轻松搞定了,你会问,为什么不介绍一下Glide?其实Glide我有时间也是会介绍的,刚好上篇我们用到了Picasso,

代码二次封装-xUtils(android)

通常我们会引用很多lib 而且会出现lib 与我们的功能仅仅差一点点 这种情况我们最好不要去改动源代码 而是进行二次封装 举例我使用 xUtils的二次封装 此处说明我是搞ios的 这个是android 今天mac 机子没网 蛋疼 使用到pulltorefresh 和 xUtils 网络封装 因为此处是没有文件处理所以我把參数转换里面file给去掉了 假设须要自行加上就可以 public class ApiHttpUtil { final public static String base_ur

Android 应用程序集成FaceBook 登录及二次封装

1.首先在Facebook 开发者平台注册一个账号 https://developers.facebook.com/ 开发者后台  https://developers.facebook.com/apps 2.创建账号并且获得 APP ID 图一 图二 图三 图四 图五 3.获取app签名的Key Hashes 值(两种方式) 3.1方法1: 1 package com.pegasus.map.presentation.utils; 2 import android.content.Contex

android基于开源网络框架asychhttpclient,二次封装为通用网络请求组件

网络请求是全部App都不可缺少的功能,假设每次开发都重写一次网络请求或者将曾经的代码拷贝到新的App中,不是非常合理,出于此目的,我希望将整个网络请求框架独立出来,与业务逻辑分隔开,这样就能够避免每次都要又一次编写网络请求,于是基于我比較熟悉的asynchttpclient又一次二次封装了一个网络请求框架. 思路:网络请求层唯一的功能就是发送请求,接收响应数据,请求取消,cookie处理这几个功能,二次助封装后这些功能能够直接调用封装好的方法就可以. 二次助封装代码例如以下: 1.功能接口: /

[Android]Volley源码分析(二)Cache

Cache作为Volley最为核心的一部分,Volley花了重彩来实现它.本章我们顺着Volley的源码思路往下,来看下Volley对Cache的处理逻辑. 我们回想一下昨天的简单代码,我们的入口是从构造一个Request队列开始的,而我们并不直接调用new来构造,而是将控制权反转给Volley这个静态工厂来构造. com.android.volley.toolbox.Volley: public static RequestQueue newRequestQueue(Context conte

加密狗复制备份 克隆 破解 OEM信息 二次封装 行业软件破解 批发零售

加密狗复制备份 加密狗模拟   加密狗破解  定制写狗程序 算法注册机 OEM信息 二次封装 汉化  行业软件破解   酒店客房管理  餐饮娱乐 美容美发  会员管理  口腔诊所 口腔医院管理 商超POS 服装鞋帽 家具生产数控 家具设计拆单 排料优化 家居设计销售 药店管理 汽配汽修汽贸4S店管理 财务进销存 OA办公 企业积分制管理 电脑行业管理系统 客户管理...等各行业管理软件批发零售 合作联系QQ:309889372 部分产品列表展示 部分产品分类展示: 服装设计类行业: 主要针对服装

也谈Volley的二次封装

产品中使用Volley框架已有多时,本身已有良好封装的Volley确实给程序开发带来了很多便利与快捷.但随着产品功能的不断增加,服务器接口的不断复杂化,直接使用Volley原生的JSONObjectRequest已经导致Activity或Fragment层中耦合了大量的数据解析代码,同时当多处调用同一接口时,类似的数据解析代码还不可复用,导致大量重复代码的出现,已经让我越发地无法忍受.基于此,最近思考着对Volley原生的JSONObjectRequest(因为产品中目前和服务器交互所有的接口,

OkHttp框架从入门到放弃,解析图片使用Picasso裁剪,二次封装OkHttpUtils,Post提交表单数据

OkHttp框架从入门到放弃,解析图片使用Picasso裁剪,二次封装OkHttpUtils,Post提交表单数据 我们这片博文就来聊聊这个反响很不错的OkHttp了,标题是我恶搞的,本篇将着重详细的分析,探索OkHttp这个框架的使用和封装 一.追其原理 Android系统提供了两种HTTP通信类 HttpURLConnection HttpClient Google推荐使用HttpURLConnection,这个没必要多说,事实上,我这篇写的应该算是比较晚了,很多优秀的博文都已经提出了这些观

Android-Volley网络通信框架(二次封装数据请求和图片请求(包含处理请求队列和图片缓存))

1.回想 上篇 使用 Volley 的 JsonObjectRequest 和 ImageLoader 写了 电影列表的样例 2.重点 (1)封装Volley 内部 请求 类(请求队列,数据请求,图片请求,图片缓存) (2)封装 Response.Listener 和 Response.ErrorListener 回调函数 (3)用法 3.文件夹介绍 3.1 GsonRequset.java 自己定义Gson请求,直接将 Json字符串  实例化为 对象 3.2 VolleyApplicatio