自定义Adapter, 通过反射将对象数据成员的值绑定到相应的viewId。使用此方法时不要混淆对象类。
1.[文件] BeanAdapter.java ~ 2KB 下载(1)
package com.canary.app.ph;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import java.lang.reflect.Field;
import java.util.List;
import java.util.Map;
/**
* Created by pseudo on 15-7-21.
*/
public class BeanAdapter extends BaseAdapter {
private Context cxt;
private List mData;
private int layoutResId;
private Map viewIdPropPair;
private LayoutInflater inflater;
public BeanAdapter(Context cxt, int layoutResId, List beans, Map viewIdPropPair) {
this.cxt = cxt;
this.layoutResId = layoutResId;
this.mData = beans;
this.viewIdPropPair = viewIdPropPair;
inflater = (LayoutInflater) cxt.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return mData.size();
}
@Override
public Object getItem(int position) {
return mData.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View layout = inflater.inflate(this.layoutResId, null);
try {
T bean = mData.get(position);
for (Map.Entry entry : viewIdPropPair.entrySet())
((TextView) layout.findViewById(entry.getKey())).setText(String.valueOf(getBeanProperty(bean, entry.getValue())));
} catch (Exception e) {
throw new RuntimeException("Adapter绑定bean属性异常", e);
}
return layout;
}
/**
* dalvik没有内省机制,只能使用反射
*
* @param bean
* @param propertyName
* @return
*/
private Object getBeanProperty(T bean, String propertyName) throws NoSuchFieldException, IllegalAccessException {
Field field = bean.getClass().getDeclaredField(propertyName);
field.setAccessible(true);
return field.get(bean);
}
}
2.[文件] list_item.xml ~ 1KB 下载(0)
android:layout_marginLeft="5dip"
android:layout_width="match_parent"
android:layout_height="match_parent">
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="5dip"
android:layout_marginRight="5dip"
android:src="@drawable/key_item"
/>
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textStyle="bold"
android:layout_toRightOf="@id/item_img"
android:textSize="20sp"
/>
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/item_img"
android:layout_below="@id/item_title"
android:textSize="18sp"
/>
3.[代码]bean示例
public class Passport {
private String name;
private String passowrd;
private String mac;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassowrd() {
return passowrd;
}
public void setPassowrd(String passowrd) {
this.passowrd = passowrd;
}
public String getMac() {
return mac;
}
public void setMac(String mac) {
this.mac = mac;
}
}
4.[代码]调用示例
Map viewIdPropPair = new LinkedHashMap<>(2);
viewIdPropPair.put(R.id.item_title, "name");
viewIdPropPair.put(R.id.item_mac, "mac");
lvPassports.setAdapter(new BeanAdapter(this, R.layout.list_item, MApplication.passports, viewIdPropPair));