您的位置:首页 > 其它

反射实现适配器的封装

2016-09-08 09:36 381 查看
1.通过封装我们可以减少代码的复用率,同时我们也可以减少代码量。

public abstract class CommonAdapter<T,VD extends CommonAdapter.ViewHolder> extends BaseAdapter {
private Context context;
private int layoutId;
private LayoutInflater inflater;
private List<T> list;

public CommonAdapter(Context context, int layoutId, List<T> list) {
this.context = context;
this.layoutId = layoutId;
this.list = list;
inflater =LayoutInflater.from(context);
}

@Override
public int getCount() {
return list.size();
}

@Override
public Object getItem(int position) {

return list.get(position);
}

@Override
public long getItemId(int position) {
T d = list.get(position);
Class<?> aClass = d.getClass();
Field id = null;
try {
id = aClass.getField("id");
} catch (NoSuchFieldException ignored) {
}
if (id == null) {
try {
id = aClass.getDeclaredField("id");
} catch (NoSuchFieldException ignored) {
}
}
if (id != null) {
try {
return (long) id.get(d);
} catch (IllegalAccessException ignored) {
}
}
Method getId = null;
try {
getId = aClass.getMethod("getId");
} catch (NoSuchMethodException ignored) {
}
if (getId == null) {
try {
getId = aClass.getDeclaredMethod("getId");
} catch (NoSuchMethodException ignored) {
}
}
if (getId != null) {
try {
return (long) getId.invoke(d);
} catch (Exception ignored) {
}
}
return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = inflater.inflate(layoutId,parent,false);
ParameterizedType superclass = (ParameterizedType) getClass().getGenericSuperclass();
Class type = (Class) superclass.getActualTypeArguments()[1];
try {
Constructor constructor = type.getConstructor(View.class);
Object o = constructor.newInstance(convertView);
convertView.setTag(o);
} catch (Exception e) {
e.printStackTrace();
}
}
onBindView(list.get(position), ((VD) convertView.getTag()));
return convertView;
}
public abstract void onBindView(T entry,VD viewHolder);
public static class ViewHolder{
private View viewHolder;
public ViewHolder(View viewHolder) {
this.viewHolder = viewHolder;
}
}
public void addAll(Collection<? extends T> collection){
list.addAll(collection);
notifyDataSetChanged();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: