Android資料驅動視圖更新

來源:互聯網
上載者:User

Android的開發過程中,會使用到一些可編輯檢視,或者一些隨著資料發生改變,需要自動更新視圖的功能等等。此類別檢視大都需要資料同步,以此來更新視圖的展現。再加上資料類型的繁雜,所以不太適合在每個類中添加對資料更新的方法去處理視圖的展現。更簡單而又方便的方式,就是使用資料監聽器。這個有點像JavaBean中的property change的資料監聽方式。當資料發生改變,外面對該資料註冊了監聽器的,就能夠即時的更新視圖。下面將此種用法的代碼寫出,稍微做了一些改動。

 

採用的資料結構為hashMap.

 

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

 

 

在Activity中實現該資料結構,使用內部私人類,並將其對SimpleAdapter進行通知。

 

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

 

註冊監聽器

 

private void attachDataListener() {<br />DataFactory.getInstance().setListener(dataListener);<br />}

 

這樣的話,對不同的視圖類,可以通過實現listener來處理自己的資料。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.