[分享] 利用自定的ListView動態新增/刪除列
最近,我朋友問我怎麼用自訂的ListView動態增減列,
剛好可以分享一下,
如果對如何自訂ListView不了解,
可以參考一下#1DbiQ5jJ,
將代碼貼到板上任何一個地方,就可以找到我上一篇文章:)
那麼如何利用自訂的ListView來動態增加或刪除呢?
我們首先利用Menu讓使用者能夠動態的增加或刪除,
因此先在Menu裡面加入兩個選項,分別是add item及remove item,
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// TODO Auto-generated method stub
menu.add(0, Menu.FIRST, 0, "add item");
menu.add(0, Menu.FIRST+1, 0, "remove item");
return super.onCreateOptionsMenu(menu);
}
就會看到這樣的一個畫面,
http://uploadingit.com/file/jrlg3a2bwwykwkyo/menu1.png
接著我們想要按下add item的時候,讓ListView多出一列,
在加入public boolean onOptionsItemSelected(MenuItem item) ,
當你按下menu選項的處理事件,
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
switch(item.getItemId()){
case Menu.FIRST:
myAdapter.addItem(myAdapter.getCount()+1);
break;
case Menu.FIRST+1:
break;
}
return super.onOptionsItemSelected(item);
}
這時候,切換到MyAdapter.java的頁面,新增兩個方法,分別是:
public void addItem(int position)
public void removeItem(int position)
當按下add item的時候,就會呼叫addItem(),
而按下remove item的時候,就會呼叫removeItem(),
這時候我們的MyAdapter需要作一下變動,
還記得自訂的ListView裡面的getView()嗎?
它是用來顯示ListView所有的列,但是我們要將每一列存成一個一個的物件,
所以需要改變一下寫法,
首先,宣告一個ArrayList來儲存每一個列的View,
private ArrayList<View> arrayList;
並且在建構子初始化它,
arrayList = new ArrayList<View>();
這時候就可以開始使用它了,
再來就是在getCount()的return變成arrayList的大小,
@Override
public int getCount() {
// TODO Auto-generated method stub
return arrayList.size();
}
接著將getView所有的內容搬到addItem()裡面,
public void addItem(int position){
TagView tag;
View view = adapterLayoutInflater.inflate(R.layout.adapter, null);
tag = new TagView(
(Button)view.findViewById(R.id.AdapterButton),
(ImageView)view.findViewById(R.id.AdapterImage),
(TextView)view.findViewById(R.id.AdapterText));
view.setTag(tag);
arrayList.add(view);
tag.image.setBackgroundResource(R.drawable.icon);
tag.button.setText("button"+arrayList.size());
tag.text.setText("text"+arrayList.size());
this.notifyDataSetChanged();
}
比較要注意的是arrayList.add(view);
我們每新增一列,就必須把那一列的view加入到arrayList裡面,
最後的this.notifyDataSetChanged()是通知baseAdapter我們已經將資料更新了,
它就會執行getCount()取得列數並且重跑一次getView(),
在getView()這邊我們只需要改變return值即可,
@Override
public View getView(int position, View view, ViewGroup parent) {
// TODO Auto-generated method stub
return arrayList.get(position);
}
現在你可以跑看看程式,一開始什麼都沒有,當按下Menu->add item,
就會跑出一列我們自訂的ListView了,
接著我們來寫remove item部份,
回到onOptionsItemSelected()這個函式,
在case Menu.FIRST+1:後面加入呼叫removeitem,
case Menu.FIRST+1:
myAdapter.removeItem(myAdapter.getCount()-1);
break;
再到MyAdapter.java裡面修改removeItem()
public void removeItem(int position){
if(!arrayList.isEmpty()){
arrayList.remove(position);
this.notifyDataSetChanged();
}
}
到這裡為止,我們就可以操作新增/刪除的功能了,
如果成功就會出現下面的畫面,
http://uploadingit.com/file/hkqtqu1qure25r4o/menu2.png
如果沒有出現預期的結果,沒關係,
http://uploadingit.com/file/d5cr1yp8l0i1ykay/MyListView.zip
下載這個檔案就可以看到所有的程式碼,
其實我覺得這樣的寫法有點粗糙,
我比較偏向SimpleAdapter那樣寫,
可能需要在研究一下怎麼寫比較好
如果有錯誤或有更好的寫法
請務必告訴小弟,避免誤導大家,謝謝。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.64.102.249
討論串 (同標題文章)
以下文章回應了本文:
完整討論串 (本文為第 1 之 2 篇):
AndroidDev 近期熱門文章
PTT數位生活區 即時熱門文章