似曾相識,在viewholder 濫竽開花時,我很不想說,大多數人沒學到軟件工程的精髓。或者沒有行之有效的將其自覺利用。java
不少年前,我作了如下幾件事json
一. 省略了viewholder步驟ui
二. adapter系列用了配置的思想,配置的方式就是simpleadapter的發展this
三. 接納了Map,Object,Cursor至少三種有效的數據源。並在實現上容許自由切換spa
四. 將這個adapter 留下實現入口,作各類二次功能擴展,即使是一個匿名實現也能夠用簡單添加的方式完成特殊的自定義功能。code
基本的代碼以下:對象
if (item == null) { return; } if (item instanceof Cursor) { 處理//Cursor treatCursor(item, convertView, position); } else if (item instanceof Map) { //處理Map treatMap(item, convertView, position); } // else if (item instanceof Entity) { 自定義具體類對象,這裏是實現的是對象體裏包含Map的一種折衷,能夠視爲綜合Map和Object的快捷方式 // treatMap(((Entity) item).fieldContents, convertView, position); // } else if (item instanceof JSONObject) { //能夠處理json treatJSONArray(item, convertView, position); } else { //處理反射對象 treatObject(item, convertView, position); }
public void treatObject(Object item, View convertView, int position) throws SecurityException { Object value = null; String name; boolean isAccessible; clazz = item.getClass(); Field[] fields = clazz.getFields(); for (Field field : fields) { isAccessible = field.isAccessible(); field.setAccessible(true); if (this.fieldnames.contains(field.getName())) { //fieldnames 送進來的配置的字段的名稱 name = field.getName(); try { value = field.get(item); // value = value == null ? "" : value; } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } findAndBindView(convertView, position, item, name, value); } field.setAccessible(isAccessible); } }
public void treatCursor(Object item, View convertView, int position) { Object value = null; String name; Cursor cur = (Cursor) item; Class type; if (cur.getColumnCount() > 0) { while (cur.moveToNext()) { for (int i = 0; i < cur.getColumnCount(); i++) { name = cur.getColumnName(i); type = itemDataSrc.getNameTypePair().get(name); if (type == null) { continue; } try { if (type == Integer.class) { value = cur.getInt(i); } else if (type == Long.class) { value = cur.getLong(i); } else if (type == Double.class) { value = cur.getDouble(i); } else if (type == String.class) { value = cur.getString(i); } } catch (Exception e) { e.printStackTrace(); } findAndBindView(convertView, position, item, name, value); } } } }
public void treatMap(Object item, View convertView, int position) { String name; Object value; Map<String, Object> items = (Map<String, Object>) item; for (int i = 0; i < this.fieldnames.size(); i++) { name = this.fieldnames.get(i); if (items.containsKey(name)) { value = items.get(name); findAndBindView(convertView, position, item, name, value); } } }
protected boolean findAndBindView(View convertView, int pos, Object item, String name, Object value) { int viewidIdx = this.fieldnames.indexOf(name); //配置裏的字段名 View theView = convertView.findViewById(this.viewids.get(viewidIdx)); //配置裏的字段id return setView(pos, item, value, convertView, theView); //作具體的工做 }
protected List<String> fieldnames; protected List<Integer> viewids;
protected boolean setView(int pos, Object item, Object value, View convertView, View theView) { if (theView == null) { return false; } if (value == null) { return false; } theView.setVisibility(View.VISIBLE); StyleBox styleBox = null; if (theView instanceof ImageView) { if (value instanceof String&&value.toString().startsWith("http")) { //do imageloader ... etc }else if (value instanceof Integer) { ((ImageView) theView).setImageResource(Integer.parseInt(value .toString())); } else if (value.getClass() == BitmapDrawable.class) { ((ImageView) theView).setImageDrawable((BitmapDrawable) value); } else if (value instanceof Drawable) { ((ImageView) theView).setImageDrawable((Drawable) value); } } else if (theView instanceof CheckBox) { ((CheckBox) theView).setChecked(Boolean.parseBoolean(value .toString())); } else if (theView instanceof TextView) { ((TextView) theView) .setText(value instanceof SpannableStringBuilder ?(SpannableStringBuilder) value : value.toString()); }else{ extendView(theView,value); //自定義某些控件 } return true; }