Android数据驱动视图更新
2011-03-20 12:28
274 查看
Android的开发过程中,会使用到一些可编辑视图,或者一些随着数据发生改变,需要自动更新视图的功能等等。此类视图大都需要数据同步,以此来更新视图的展现。再加上数据类型的繁杂,所以不太适合在每个类中添加对数据更新的方法去处理视图的展现。更简单而又方便的方式,就是使用数据监听器。这个有点像JavaBean中的property change的数据监听方式。当数据发生改变,外面对该数据注册了监听器的,就能够实时的更新视图。下面将此种用法的代码写出,稍微做了一些改动。
采用的数据结构为hashMap.
在Activity中实现该数据结构,使用内部私有类,并将其对SimpleAdapter进行通知。
注册监听器
这样的话,对不同的视图类,可以通过实现listener来处理自己的数据。
采用的数据结构为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来处理自己的数据。
相关文章推荐
- Android的ListView数据更新后,如何使最新的条目可以自动滚动到可视范围内
- vue中用数据驱动视图的思想去写代码——基础json可配置化 3ff8
- Android系统源码阅读(9):Content Provider数据更新通知
- Android数据库更新并保留原来数据的实现
- Android数据库更新并保留原来数据的实现
- Android上实现一个简单的天气预报APP(九) ListView展示城市列表、单击更新天气数据
- oracle中常用的数据字典表 与动态性能视图(不断更新)
- Android蓝牙4.0BLE通讯读写数据更新
- 解决vue中修改了数据但视图无法更新的情况
- 如何把批量数据导入到android 的 sqlite 数据库(更新中)
- Android数据库更新并保留原来数据的实现
- android 关于FragmentPagerAdagter页面切换更新及页面切换后重新加载数据,或不执行onResume
- RxAndroid、RxJava的fromCallable更新数据加载到ListView简例
- vue数组中数据变化但是视图没有更新解决方案
- android listview notifyDataSetChanged更新数据
- Android应用程序组件Content Provider的共享数据更新通知机制分析
- android使用notifyDataSetChanged()方法,adapter的数据更新了,但是ListView的内容没有更新;
- RxAndroid、RxJava的fromCallable更新数据加载到ListView简例
- Android Binder 驱动分析 - 数据结构
- Android零基础入门第44节:ListView数据动态更新