您的位置:首页 > 移动开发 > Android开发

Android数据驱动视图更新

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

采用的数据结构为hashMap.

public class HearingMap<K,V> extends HashMap<K, V>{
private static final long serialVersionUID = 1L;

private Listener<K, V> listener;

//interface for the data element change listener
public static interface Listener<K,V> {
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<K, V> listener) {
this.listener = listener;
}
}


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

public class SampleActivity extends ManagedActivity{
private List<Map<String, String>> datas = new ArrayList<Map<String,String>>();
private SimpleAdapter dataAdapter;
private Spinner dataViewList;
...

private HearingMap.Listener<String,DataBean> dataListener = new HearingMap.Listener<String, DataBean>() {

//implementation
public void onAdd(String key,DataBean value) {
Map<String, String> dataMapping = new TreeMap<String, String>();
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<Map<String, String>> 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来处理自己的数据。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: