作者givemepass (〆)
看板AndroidDev
标题Re: [分享] BaseAdapter 自定ListView
时间Thu Apr 21 19:56:52 2011
最近,我朋友问我怎麽用自订的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/cfbkdtpclgebrf3e/menu3.png
如果没有出现预期的结果,没关系,
http://uploadingit.com/file/d5cr1yp8l0i1ykay/MyListView.zip
下载这个档案就可以看到所有的程式码,
其实我觉得这样的写法有点粗糙,
我比较偏向SimpleAdapter那样写,
可能需要在研究一下怎麽写比较好
如果有错误或有更好的写法
请务必告诉小弟,避免误导大家,谢谢。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.64.102.249