【Android】通用系列 —— AbsListView适配器

【关键词】

Adapter 通用适配器

【问题】
  • 打造一个通用的Adapter,而不为是每一个ListView或GridView都重复写Adpater;
【效果图】
【分析】
【解决方案】
【使用方法】
 
 
private LouAdapter mLouAdapter;
private void initView() {
ListView lvMain = (ListView) findViewById(R.id.lv_main);
lvMain.setAdapter(mLouAdapter = new LouAdapter<String>(mContext, lvMain, android.R.layout.simple_list_item_1) {
@Override
protected void assign(LouHolder holder, String s) {
holder.putText(android.R.id.text1, s);
}
});
}

添加元素:
mLouAdapter.addItem("Hello")
删除元素:
mLouAdapter.deleteItem(position)
删除元素(高度逐渐变0):
mLouAdapter.deleteItemWithAnim(position)
局部更新:
mLouAdapter.updateView(position)


【代码】

[LouHolder.java]

 
 
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
 
/**
* Created by Lou on 2016/3/23.
*/
public class LouHolder {
private SparseArray<View> mViews;
private View mConvertView;
protected MARK mark;
 
protected enum MARK {
NORMAL, DELETE
}
 
private LouHolder(Context context, int layoutId) {
mViews = new SparseArray<View>();
mConvertView = LayoutInflater.from(context).inflate(layoutId, null);
mConvertView.setTag(this);
}
 
public static LouHolder getInstance(Context context, int layoutId, View convertView) {
boolean needInflate = convertView == null || ((LouHolder) convertView.getTag()).mark == MARK.DELETE;
if (needInflate) {
return new LouHolder(context, layoutId);
}
return (LouHolder) convertView.getTag();
}
 
public View getConvertView() {
return mConvertView;
}
 
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;
}
 
public LouHolder putText(int viewId, String text) {
View v = getView(viewId);
if (v instanceof TextView) {
((TextView) v).setText(text);
}
return this;
}
 
public LouHolder putText(int viewId, int resId) {
View v = getView(viewId);
if (v instanceof TextView) {
((TextView) v).setText(resId);
}
return this;
}
 
public LouHolder putImg(int viewId, int resId) {
View v = getView(viewId);
if (v instanceof ImageView) {
((ImageView) v).setImageResource(resId);
}
return this;
}
 
public LouHolder putImg(int viewId, Bitmap bitmap) {
View v = getView(viewId);
if (v instanceof ImageView) {
((ImageView) v).setImageBitmap(bitmap);
}
return this;
}
 
public LouHolder putImg(int viewId, Drawable drawable) {
View v = getView(viewId);
if (v instanceof ImageView) {
((ImageView) v).setImageDrawable(drawable);
}
return this;
}
 
 
}

[LouAdapter.java]

 
 
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.Transformation;
import android.widget.AbsListView;
import android.widget.BaseAdapter;
 
import java.util.ArrayList;
import java.util.List;
 
/**
* Created by Lou on 2016/3/23.
*/
 
public abstract class LouAdapter<T> extends BaseAdapter {
 
private ArrayList<T> mLists;
private Context mContext;
private AbsListView mListView;
private int mLayoutId;
 
public LouAdapter(Context context, AbsListView listView, int layoutId) {
mContext = context;
mListView = listView;
mLayoutId = layoutId;
mLists = new ArrayList<T>();
}
 
@Override
public int getCount() {
return mLists.size();
}
 
@Override
public T getItem(int position) {
return mLists.get(position);
}
 
@Override
public long getItemId(int position) {
return position;
}
 
@Override
public View getView(int position, View convertView, ViewGroup parent) {
return updateView(position, convertView);
}
 
public AbsListView getBindListView() {
return mListView;
}
 
/**
* contain 来表示是否已经包含元素;(可能需要重写,如果允许重复的话,就不必要重写了);
*
* @param o
* @return
*/
protected boolean contain(T o) {
if (mLists.contains(o)) {
return true;
}
return false;
}
 
/**
* 用数据来更新视图;
*
* @param position
* @param convertView
* @return
*/
private View updateView(int position, View convertView) {
LouHolder holder = LouHolder.getInstance(mContext, mLayoutId, convertView);
assign(holder, getItem(position));
return holder.getConvertView();
}
 
/**
* 当更改了某一个Item之后,可以通过updateView(position);的方式只更新这一个Item;
*
* @param position
*/
public void updateView(int position) {
View convertView = getIndexView(position);
updateView(position, convertView);
}
 
/**
* @param holder
* @param t
*/
protected abstract void assign(LouHolder holder, T t);
 
 
/**
* 获取可见元素的View;
*
* @param position
* @return
*/
public View getIndexView(int position) {
int currentIndex = position - mListView.getFirstVisiblePosition();
if (currentIndex < 0 || currentIndex >= mLists.size()) {
return null;
}
return mListView.getChildAt(currentIndex);
}
 
 
public void addItem(T o, boolean filter) {
if (filter && contain(o)) {
return;
}
mLists.add(o);
updateChange();
}
 
/**
* 默认过滤添加的元素;
*
* @param o
*/
public void addItem(T o) {
addItem(o, true);
}
 
public List<T> getList() {
return mLists;
}
 
/**
* 初始化元素
*
* @param list
*/
public void initList(List<T> list) {
mLists.clear();
mLists.addAll(list);
updateChange();
}
 
public void deleteItem(T o) {
mLists.remove(o);
updateChange();
}
 
public void deleteItem(int position) {
mLists.remove(position);
updateChange();
}
 
/**
* 高度变为0后删除元素;
*
* @param position
*/
public void deleteItemWithAnim(final int position) {
final View view = getIndexView(position);
final int initHeight = view.getMeasuredHeight();
Animation anim = new Animation() {
@Override
protected void applyTransformation(float interpolatedTime,
Transformation t) {
if (mLists.size() > 0 && interpolatedTime == 1) {
// 高度为0时删除元素,并更新 adapter
if (view.getTag() instanceof LouHolder) {
((LouHolder) view.getTag()).mark = LouHolder.MARK.DELETE;
deleteItem(position);
}
} else {
// 不断的改变高度,直到高度为0;
view.getLayoutParams().height = initHeight
- (int) (initHeight * interpolatedTime);
view.requestLayout();
}
}
};
anim.setDuration(300);
view.startAnimation(anim);
}
 
 
public void updateChange() {
notifyDataSetChanged();
}
 
public void clear() {
mLists.clear();
updateChange();
}
 
 
}
【参考资料】

Android 快速开发系列 打造万能的ListView GridView 适配器

JoanZapata/base-adapter-helper

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值