Android数据驱动视图更新

Android的开发过程中,会使用到一些可编辑视图,或者一些随着数据发生改变,需要自动更新视图的功能等等。此类视图大都需要数据同步,以此来更新视图的展现。再加上数据类型的繁杂,所以不太适合在每个类中添加对数据更新的方法去处理视图的展现。更简单而又方便的方式,就是使用数据监听器。这个有点像JavaBean中的property change的数据监听方式。当数据发生改变,外面对该数据注册了监听器的,就能够实时的更新视图。下面将此种用法的代码写出,稍微做了一些改动。

 

采用的数据结构为hashMap.

 

public class HearingMap extends HashMap{ private static final long serialVersionUID = 1L; private Listener listener; //interface for the data element change listener public static interface Listener { void onAdd(K key, V value); void onRemove(K key); } //should be override for subclass @Override public V put(K key, V value) { V ret = super.put(key, value); if(listener != null){ if(ret != null){ listener.onRemove(key); } listener.onAdd(key, value); } return ret; } //should be override for subclass @SuppressWarnings("unchecked") @Override public V remove(Object key) { V ret = super.remove(key); if(listener != null){ if(ret != null){ listener.onRemove((K)key); } } return ret; } //setter for the listener public void setListener(Listener listener) { this.listener = listener; } }

 

 

在Activity中实现该数据结构,使用内部私有类,并将其对SimpleAdapter进行通知。

 

public class SampleActivity extends ManagedActivity{ private List> datas = new ArrayList>(); private SimpleAdapter dataAdapter; private Spinner dataViewList; ... private HearingMap.Listener dataListener = new HearingMap.Listener() { //implementation public void onAdd(String key,DataBean value) { Map dataMapping = new TreeMap(); dataMapping.put("name", value.getName()); dataMapping.put("id", value.getId()); SampleActivity.this.datas.add(dataMapping); SampleActivity.this.dataAdapter.notifyDataSetChanged(); } //implementation public void onRemove(String key) { Iterator> itr = datas.iterator(); while (itr.hasNext()) { if (itr.next().get("id").equals(key)) { itr.remove(); //notify SampleActivity.this.dataAdapter.notifyDataSetChanged(); return; } } } }; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ... setContentView(R.layout.spinner_layout); dataViewList = (Spinner) findViewById(R.id.splist); dataAdapter = new SimpleAdapter(this, datas, R.layout.spinner_item, new String[] { "name","id" }, new int[] { R.id.Name, R.id.ID }); dataViewList.setAdapter(dataAdapter); ... } }

 

注册监听器

 

private void attachDataListener() { DataFactory.getInstance().setListener(dataListener); }

 

这样的话,对不同的视图类,可以通过实现listener来处理自己的数据。

 

你可能感兴趣的:(Android)