Android ListView 默认选中某一项实现代码
这里是使用 toc 生成的目录:
•layout文件定义
◦listview定义
◦item 模板定义
•代码
◦初始化列表
◦用户点击处理
•效果
--------------------------------------------------------------------------------
要使用 listview 实现一个充值方式选择,默认想选中第二项,搞了一下午,终于搞定了。原本就没怎么用 java 写过 android 应用,又隔了好久没写,一切都生疏了,半吊子变成大呆瓜了……
layout文件定义
分两部分,一部分是 listview 的定义,一部分 item 模板,即 row 的定义。
listview定义
说起来也很简单,下面是 layout 文件中的 listview 定义:
<listview android:id="@+id/recharge_method_list" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_margintop="6dp" android:dividerheight="2dp" android:divider="@color/ssq_bkgnd" android:background="@android:color/white" android:choicemode="singlechoice" android:listselector="@null" > </listview>
嘿,别说,csdn的markdown编辑器比原来的默认编辑器好用多了,插入代码更简单了。这是第一次使用csdn的markdown,赞一个。
item 模板定义
item模板如下定义:
<?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="60dp" android:gravity="center_vertical" android:background="@drawable/option_selector" > <imageview android:id="@+id/recharge_method_icon" android:layout_width="40dp" android:layout_height="40dp" android:layout_marginleft="20dp" android:layout_marginright="4dp" /> <linearlayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:orientation="vertical" > <textview android:id="@+id/recharge_method_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textsize="15sp" /> <textview android:id="@+id/recharge_method_clue" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textsize="12sp" /> </linearlayout> <imageview android:id="@+id/recharge_method_checked" android:layout_width="34dp" android:layout_height="28dp" android:layout_marginright="16dp" android:src="@drawable/option_checked" android:visibility="invisible" /> </linearlayout>
我为了给一个 listview 的 item 显示一个选择图标,在定义 item 模板文件时直接加了一个 imageview ,通过控制它的显示和隐藏来达到看起来选中的效果。偷了个懒,这是比较简单的实现,在 listview 中 item 数量不多时对内存、性能等影响不大。
代码
代码比较简单,分两部分来看吧,一部分是初始化列表,一部分是用户点击列表中的某项后切换选中标记。
初始化列表
initrechargelist()方法用来初始化充值方式列表,代码如下:
private void initrechargelist(){ actiontexts = new string[]{ getstring(r.string.recharge_unionpay), getstring(r.string.recharge_alipay), getstring(r.string.recharge_bestpay) }; actionclue = new string[]{ getstring(r.string.recharge_unionpay_clue), getstring(r.string.recharge_alipay_clue), getstring(r.string.recharge_bestpay_clue) }; actionimages = new int[]{ r.drawable.unionpay, r.drawable.recharge_icon_alipay, r.drawable.recharge_icon_bestpay }; actionlist = (listview)findviewbyid(r.id.recharge_method_list); actionitems = new arraylist<hashmap<string, object>>(); actionadapter = new simpleadapter(this, actionitems, r.layout.recharge_method_list_item, new string[]{"action_icon", "action_name", "action_clue"}, new int[]{r.id.recharge_method_icon, r.id.recharge_method_name, r.id.recharge_method_clue}); for(int i = 0; i < actionimages.length; ++i) { hashmap<string, object> item = new hashmap<string, object>(); item.put("action_icon", actionimages[i]); item.put("action_name", actiontexts[i]); item.put("action_clue", actionclue[i]); actionitems.add(item); } actionlist.setadapter(actionadapter); actionlist.setonitemclicklistener(itemlistener); actionlist.post(new runnable() { @override public void run() { lastcheckedoption = actionlist.getchildat(1).findviewbyid(r.id.recharge_method_checked); lastcheckedoption.setvisibility(view.visible); actionlist.setitemchecked(1, true); } }); }
上面的代码是初始化充值方式列表。 listview 的用法也比较简单,view–row template–data–adapter,四个要素。
我遇到的问题是:如何默认选中某一项。
实际上我的列表中只有三项,不用考虑哪一项会不可见,应该在安卓手机上都是可见的。
一开始我在调用了 listview 的 setadapter 方法后,直接使用 getchildat(1) 来获取第二项对应的 view ,你猜到了,没错,崩溃了: nullpointerexception 。空指针啊,用 c++ 时的老情人,改用 java 写 android 了,她又跑来和我约会了。
搞了半天,我才弄明白: setadapter() 其实是异步的 ,调用了这个方法, listview 的 item 并没有立马创建,而是在下一轮消息处理时才创建。弄明白了这个,就有了前面代码中的解决办法:使用 post() 提交一个 runnable() 对象,在 runnable() 内部来做默认选中这种初始化动作。
如你所见,我 new 了一个 runnable 给 post() 方法,在 run() 内找到了第 2 项,显示了选中图标;并且我把第 2 项对应的 view 保存到 lastcheckedoption 成员变量中。后面我们会通过 lastcheckedoption 这个变量,结合 onitemclicklistener 来实现 listview 中三个 item 的互斥选择效果。
markdown怎么给每个段落前加缩进呢……迷惑中……四个空格就给本段落打上背景色了,挺好……
用户点击处理
点击处理是通过 adapterview.onitemclickedlistener 接口完成的。代码如下:
private adapterview.onitemclicklistener itemlistener = new adapterview.onitemclicklistener() { @override public void onitemclick(adapterview<?> parent, view view, int position, long id) { if(lastcheckedoption != null){ lastcheckedoption.setvisibility(view.invisible); } lastcheckedoption = view.findviewbyid(r.id.recharge_method_checked); lastcheckedoption.setvisibility(view.visible); } };
如你所见,我通过 lastcheckedoption 变量保存了上次选中的 item 中的表示选中效果的图标,用户点击某一个时,先隐藏上一个 item 的选中图标,再显示当前的,就有了貌似互斥的效果了。
一切就这么简单,搞定了。
效果
最终的效果是酱紫的:
嗳,插入图片比原来的非 markdown 编辑器好用多了。
--------------------------------------------------------------------------------
好啦,想不到我又来写 android 应用了,感觉很 high 啊。
--------------------------------------------------------------------------------
还不知道 markdown 版本的编辑器写出来的博客,发表出来肿么样呢,生成了个目录,直接 toc 就 ok 了,还是很方便的。写完了,还是没搞明白段落的行首缩进如何搞呢。
据说还支持离线编辑,赞。
还有一点:左右分栏,可以看到效果,比 github 的 wiki 页面编辑要强一点。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: Android 简易手势密码开源库详解
下一篇: 代码分析Java中线程的等待与唤醒