AndroidDev 板


LINE

※ 引述《bengohard (我的歌声里)》之铭言: : 问题:我有一个ListView,我想做到按一个Button後,把此ListView里某item的属性改变, : 请问该怎麽做(不使用onItemClick)? 此ListView使用了一个SimpleAdapter. : 我试过以下的方法无效,虽然取的到属性值,但无法改变属性值,为何? : View view = Adapter.getView(0, ListView.getChildAt(0), ListView); : ImageView img = (ImageView)view.findViewById(R.id.ID_Image); : int vis = img.getVisibility(); //值正确 : img.setVisibility(View.INVISIBLE); //改变此值但无作用 : Adapter.notifyDataSetChanged(); : //再抓一次值结果还是原本的值 >"< : View view = Adapter.getView(0, ListView.getChildAt(0), ListView); : ImageView img = (ImageView)view.findViewById(R.id.ID_Image); : int v = img.getVisibility(); BaseAdapter的特性就是可以重用View来节省资源, ListView的重用结构会长这样, http://www.b2creativedesigns.com/Tutorials/CustomListView/recycle.png
这张图可以很清楚看到 item 9 一开始在recycle pool, 当使用者手滑动, item 1被滑出去item 9就进来listview可视范围 item 1进入recycle pool, 照这个逻辑, 如果使用者继续往上滑, 那麽item 2, 3...就会进入回收区, item 9, 1, 2 ...就会出现在画面上。 这代表什麽意思? 代表着就算你资料有一百笔, 一千笔, 画面呈现的也只有9个item, 这边代表着view也只生成9个, 就不会占用太多的资源。 那我怎麽知道他是第几笔资料? 这个不用担心 BaseAdapter帮你处理好这件事情了。 只要你资料顺序塞好, 不管你是丢在怎样的资料结构, 不管是ArrayList, Array, HashMap...等等。 只要你资料设定好, 就可以开始使用这个有趣的设计了。 程式怎麽做呢? 一开始宣告一个MyAdapter继承BaseAdapter public class MyAdapter extends BaseAdapter { @Override public int getCount() { // TODO Auto-generated method stub return 0; } @Override public Object getItem(int arg0) { // TODO Auto-generated method stub return null; } @Override public long getItemId(int arg0) { // TODO Auto-generated method stub return 0; } @Override public View getView(int arg0, View arg1, ViewGroup arg2) { // TODO Auto-generated method stub return null; } } 上面你会看到四个方法, 基本上只要处理两个方法 getCount跟getView即可, 剩下的两个方法暂时不会用到, 有兴趣的可以研究看看。 getCount就是跟adapter说你有几笔资料要呈现, 假设现在你有100笔资料, 塞在arraylist内, 那麽我们来模拟一下 private ArrayList<Integer> mList; public MyAdapter(){ mList = new ArrayList<Integer>(); for(int i = 0; i < 100; i++){ mList.add(i); } } 首先在建构子上建立一个arraylist并且塞值到这个阵列内, @Override public int getCount() { // TODO Auto-generated method stub return mList.size(); } 接着把资料结构的长度塞给getCount方法, 让listview知道你的资料有多长。 接着到重头戏getView 这个方法就是listView会不断的来存取, 是一个callback function, 而不是由你自己去存取, 在看一次这个方法 我把参数改成英文名称比较好认 @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub return null; } 第一个是我们的item到哪一个位置? 第二个是我们这个item所使用的view 第三个是我们item的parent 一开始会先把目前的view抓出来 判断他是不是被初始化过 如果有被初始化过 代表着他之前就被使用过了 @Override public View getView(int position, View convertView, ViewGroup parent) { View view = convertView; if(null == view){ } else{ } return view; } 这样一来我们就可以把这个实体化过的view传回去给listview了。 接着如果他是空的 则对他进行初始化 要初始化之前 先取得inflate 回到建构子补上 private LayoutInflater mLayoutInflater; public MyAdapter(Context mContext){ mLayoutInflater = LayoutInflater.from(mContext); ... } 再回到getView if(null == view){ view = mLayoutInflater.inflate(R.layout.listview_item, null); } else{ ... } 那个layout就是我们item view所装的xml布局 透过LayoutInflater可以实体化成为一个view的物件 这样一来就可以使用程式做很多灵活的操作了。 那layout里面长怎样呢? <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/item_text" /> </RelativeLayout> 因为是范例所以写得很简单 只放入一个textview 接着就要把这个textview存在holder里面 什麽是holder? 就是帮我们记住item内所有元件的内容 先宣告一个类别来存放 class Holder{ TextView itemText; } 因为我们item layout很简单 所以这样就完成一个宣告 接着回到getView Holder holder; if(null == view){ view = mLayoutInflater.inflate(R.layout.listview_item, null); holder = new Holder(); holder.itemText = (TextView) view.findViewById(R.id.item_text); view.setTag(holder); } 由上面可以看到 当view是空的时候 就把holder new出来 然後把itemText装进去 在透过view设定tag 装进holder 那麽下次view不是空的条件下 就可以直接把holder拿出来用 就完成了reuse了功效了 else{ holder = (Holder) view.getTag(); } 这个adapter基本型态已经完成, 然後把资料结构内的资料塞进每一个item holder.itemText.setText(mList.get(position) + ""); 就会出现这样的画面 http://ppt.cc/qgYw 现在要来说明怎麽透过改变资料 来更新view 假设我们要改变某一列 假设是第2笔资料出现的地方背景就显示红色 那麽只要在retun view;之前加入 if(position == 2){ view.setBackgroundColor(Color.RED); } 就会出现第二列是红色的 http://ppt.cc/9HSk 但是很奇怪 你往上滑动 居然第24列也是红色的 http://ppt.cc/WD2r 这个就是reuse要注意的地方 因为listview就是把滑出去的item拿过来重用 所以那个重用的item背景还是红色的 因此每一个item一开始都要先初始化 view.setBackgroundColor(Color.WHITE); if(position == 2){ view.setBackgroundColor(Color.RED); } 这样就正常了 http://ppt.cc/PBHX 至於你的问题 想要让一个Button按下去 某一个值进行变化 其实很简单 只要开一个方法 public void setRowColor(int pos, int value){ mList.set(pos, value); notifyDataSetChanged(); } notifyDataSetChanged是用来刷新listview的画面 也就是会再去读取一圈getview 假设刚刚变化背景的判断式改成 if(mList.get(position) == 200){ view.setBackgroundColor(Color.RED); } 外面设定一个button 按下的时候 将arraylist的值改变 那麽你就会看到listview有一列变红色的 这就是用值去改变view 而不是用view去修正值 程式码 http://uploadingit.com/file/ffokgjkq0kjer5tq/TestAndroid.zip -- posted from android bbs reader on my Nokia 3310 --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 36.231.138.193
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/AndroidDev/M.1413996267.A.CC8.html
1F:→ laiair: 想请问 simpleAdapter 和 baseAdapter 的差异是? 10/23 01:37
2F:→ givemepass: baseadapter比较弹性, 可操作的地方没有限制, 假设现 10/23 08:53
3F:→ givemepass: 在每列背景颜色不同, 或者复杂一点的view就挂了, 例如 10/23 08:53
4F:→ givemepass: line的聊天室, fb的涂鸦墙 10/23 08:53
5F:→ laiair: ^^ 谢谢解惑 10/23 09:36
6F:推 JULONE780701: 太用心!可是这程式在我的Nikia 3310跑不起来 10/23 09:41
7F:推 bengohard: 详细的讲解+程式码,马上修改看看,太感谢你罗!!:D 10/23 11:41
8F:推 zerofinal: 推一个 10/24 10:07
9F:→ xisland: 我想每个item放不同背景图耶,最好是由程式来画,不用png档 10/24 11:09
10F:→ xisland: 半夜12点起来试到现在还没成功 10/24 11:10
11F:→ givemepass: 设条件就可以完成了, 还是你可以把程式码贴上来看看 10/24 12:56
12F:推 xisland: OK了 10/24 14:20
13F:推 xisland: holder.bmp =Bitmap.createBitmap( //下略 10/24 14:23
14F:→ xisland: view.setImageBitmap(holder.bmp); 10/24 14:23
15F:→ xisland: 加这二行就可以了 10/24 14:24
16F:推 xisland: http://imgur.com/1Ajx1rd 10/25 11:50
17F:推 baobomb: 建议还是先弄懂oo 不然这类客制化的view你都会写的很痛苦 10/27 16:01
18F:→ baobomb: 尤其是很容易不知道自己在写什麽 10/27 16:01







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Soft_Job站内搜寻

TOP