巧妙使用Java反射處理對象到列表數據源 - For Android
背景
最近朋友遇到一個問題术徊,針對一個數據集合不知道該如何填充到ListView去?針對這種情況挪蹭,我們想到使用反射來處理問題亭饵!
數據源 [DataInfoEntity]:
{
"OneClassName": "一類名稱",
"OneClassCategory": "一類類型",
"TwoClassName": "二類名稱",
"TwoClassCategory": "二類類型",
"ThreeClassName": "三類名稱",
"ThreeClassCategory": "三類類型",
......
}
分析: 觀察規(guī)律,總結嚣潜!總結冬骚!總結!
由于列表數據是由單獨一個類的字段構成懂算,現在我們需要針對級別分組只冻,那么我們應該如何處理?
字段名 -> 字段 -> 字段反射 -> 取值或者賦值 计技,一鼓作氣喜德!大致思路如下:
字段表:
public static HashMap<Integer, String> getCodes(){
HashMap<Integer, String> codes = new HashMap<Integer, String>();
codes.put(0, "OneClass@一級");
codes.put(1, "TwoClass@二級");
codes.put(2, "ThreeClass@三級");
return codes;
}
反射:
Class clazz = obj.getClass();
Field field = clazz.getDeclaredField('fieldName');
if(field != NULL){
field.setAccessible(true);
Object fieldVal = field.get(obj);//求得字段的值
}
Core - 核心
如何構造成有效的Adapter類得到我們想要的列表展示?
首先垮媒,我們需要重構Adapter對象舍悯,并重寫getCount航棱、getView 、getItem萌衬、getItemId等方法饮醇。
class MyAdapter extends BaseAdapter {
private Context context;
private DataInfoEntity dataSource;
public MyAdapter(Context context, DataInfoEntity dataSource){
this.context = context;
this.dataSource = dataSource;
}
@Override
public int getCount(){
return getCodes().size();
}
@Override
public long getItemId(int position){
return position;
}
@Override
public Object getItem(int position){
return getCodes().get(position);
}
@Override
public View getView(int position, View view, long itemid){
... //此處省略部分視圖代碼
final DataInfoEntity itemData = getCodes().get(position);
final String[] itemCodeVals = itemData.get(position).split("@");
try{
Class clazz = dataSource.getClass();
//針對Name處理
Field nameField = clazz.getDeclearedField(itemCodeVals[0] + "Name"); //根據字段名獲取字段對象
if(nameField != null){
nameField.setAccessible(true); //如果是Private字段,不設置此屬性秕豫,nameField將在取值或者賦值時出現錯誤
Object nameFieldVal = nameField.get(dataSource); //從對象中獲取結果
//處理結果
}
//針對Category處理
Field categoryField = clazz.getDeclaredField(itemCodeVals[0] + "Category");
if(categoryField != null){
categoryField.setAccessible(true);
Object categoryFieldVal = categoryField.get(dataSource);
//處理結果
}
}catch(Exception e){
Log.e("MyAdapter", e.getMessage());
}
...//此處省略部分試圖代碼
}
}
歸納
針對數據的處理朴艰,有時候我們得到的不一定是我們想要的數據的時候,就需要我們對數據進行一些處理混移。處理中往往需要我們先去觀察里面的字段名祠墅,然后采用合適的方式來處理問題。