废话少说,直接贴代码~
public abstract class MyAdapter<T> extends BaseAdapter{
private ArrayList<T> mData;
private int mLayoutRes;
public MyAdapter(ArrayList <T> mData, int layout){
this.mData=mData;
this.mLayoutRes=layout;
}
@Override
public int getCount() {
return mData!=null?mData.size ():0;
}
@Override
public T getItem(int i) {
return mData.get ( i );
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View converView, ViewGroup parent) {
ViewHolder holder=ViewHolder.bind ( parent.getContext (),converView,parent,mLayoutRes,position );
bindView ( holder, getItem ( position ) );
return holder.getItemView ();
}
public abstract void bindView(ViewHolder holder, T obj);
public static class ViewHolder {
private SparseArray <View> mViews; //存储listview中item的view
private View item; //存放converView
private int position; //游标
private Context mContext; //上下文
//构造方法
public ViewHolder(Context context, ViewGroup parent, int layoutRes) {
mViews = new SparseArray <> ( );
this.mContext = context;
View converView = LayoutInflater.from ( mContext ).inflate ( layoutRes, parent, false );
converView.setTag ( this );
item = converView;
}
/**
* 绑定ViewHolder与item方法
*/
public static ViewHolder bind(Context context, View converView, ViewGroup parent, int layoutRes, int position) {
ViewHolder holder;
if (converView == null) {
holder = new ViewHolder ( context, parent, layoutRes );
} else {
holder = (ViewHolder) converView.getTag ( );
holder.item = converView;
}
holder.position = position;
return holder;
}
/**
* 根据id获取集合中控件
*/
@SuppressWarnings("unchecked")
public <T extends View> T getView(int id) {
T t = (T) mViews.get ( id );
if (t == null) {
t = (T) item.findViewById ( id );
mViews.put ( id, t );
}
return t;
}
/**
* 获取当前条目
* */
public View getItemView(){
return item;
}
/**
* 获取条目的位置
* */
public int getPosition(){
return position;
}
/**
* 设置文字
* */
public ViewHolder setText(int id,CharSequence text){
View view =getView ( id );
if (view instanceof TextView){
((TextView) view).setText ( text );
}
return this;
}
/**
* 设置图片
*/
public ViewHolder setImageResource(int id, int drawableRes) {
View view = getView(id);
if(view instanceof ImageView) {
((ImageView) view).setImageResource(drawableRes);
} else {
view.setBackgroundResource(drawableRes);
}
return this;
}
/**
* 设置点击监听
*/
public ViewHolder setOnClickListener(int id, View.OnClickListener listener) {
getView(id).setOnClickListener(listener);
return this;
}
/**
* 设置可见
*/
public ViewHolder setVisibility(int id, int visible) {
getView(id).setVisibility(visible);
return this;
}
/**
* 设置标签
*/
public ViewHolder setTag(int id, Object obj) {
getView(id).setTag(obj);
return this;
}
}
/**
* 增加元素
* */
public void add(T data){
if (mData==null){
mData= new ArrayList <> ( );
}
mData.add ( data );
notifyDataSetChanged ();
}
/**
* 往指定位置添加元素
* */
public void add(int position,T data){
if (mData==null){
mData= new ArrayList <> ( );
}
mData.add ( position,data );
notifyDataSetChanged ();
}
/**
* 删除元素
* */
public void delete(T data){
if (mData!=null) {
mData.remove ( data );
}
notifyDataSetChanged ();
}
/**
* 删除指定位置的元素
* */
public void delete(int position){
if (mData!=null) {
mData.remove ( position );
}
notifyDataSetChanged ();
}
/**
* 删除所有元素
* */
public void clear(){
if (mData!=null) {
mData.clear ( );
}
notifyDataSetChanged ();
}
}
使用时,定义好需要传输的数据型,然后将数据传递到需要适配的数据list,定义listview之后,直接new 一个适配器,重写抽象方法bindView,new Adapter时,第一个参数为数据list,第二个参数为自定义的listview的item,然后在bindview中进行内容获取并设置。再将layout中的listview找到并进行内容适配即可。
ps:内容为空时,可在layout中设置内容为空时的显示textview,在数据为空时显示。代码如下~
//设置内容为空时的显示内容
TextView textempty = findViewById ( R.id.textempty );
textempty.setText ( "您浏览的内容为空~" );
listView.setEmptyView ( textempty );