2013-09-10 11:13 19396人阅读 评论(8) 收藏 举报
 分类:
Android(19) 

版权声明:本文为博主原创文章,未经博主允许不得转载。

Android自带的RadioButton单选框只支持添加文字,我们自己写Adapter实现自定义的RadioButton

首先item的XML源码

search_user_item.xml (现在只是文字+单选按钮+自定义背景,可以根据需要随意扩展)

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:id="@+id/search_user_list_item"
  4. android:layout_width="fill_parent"
  5. android:layout_height="30dp"
  6. android:layout_marginBottom="10dp"
  7. android:layout_marginTop="10dp"
  8. android:background="@drawable/more_item_press"
  9. android:gravity="center_vertical"
  10. android:orientation="horizontal" >
  11. <TextView
  12. android:id="@+id/search_user_name"
  13. android:layout_width="200dp"
  14. android:layout_height="wrap_content"
  15. android:layout_marginLeft="30dp"
  16. android:gravity="left"
  17. android:textColor="@android:color/black"
  18. android:textSize="16sp" />
  19. <RadioButton
  20. android:id="@+id/radio_btn"
  21. android:layout_width="wrap_content"
  22. android:layout_height="wrap_content"
  23. android:layout_marginLeft="10dp" />
  24. </LinearLayout>

Listview就是用系统自带的

  1. <ListView
  2. android:id="@+id/search_user_list"
  3. android:layout_width="fill_parent"
  4. android:layout_height="200dp"
  5. android:layout_marginLeft="5dp"
  6. android:layout_marginRight="5dp"
  7. android:paddingBottom="5dp"
  8. android:cacheColorHint="@android:color/transparent"
  9. android:divider="@null"
  10. android:listSelector="@android:color/transparent"
  11. android:visibility="gone" >
  12. </ListView>

再来是Adapter代码

SearchUserAdapter.java (具体改动写在代码注释里面)

  1. package ouc.sei.suxin.android.ui.adapter;
  2. import java.util.HashMap;
  3. import java.util.List;
  4. import ouc.sei.suxin.R;
  5. import android.content.Context;
  6. import android.view.LayoutInflater;
  7. import android.view.View;
  8. import android.view.ViewGroup;
  9. import android.widget.BaseAdapter;
  10. import android.widget.LinearLayout;
  11. import android.widget.RadioButton;
  12. import android.widget.TextView;
  13. public class SearchUserAdapter extends BaseAdapter {
  14. private Context context;
  15. private List<String> userList;
  16. HashMap<String,Boolean> states=new HashMap<String,Boolean>();//用于记录每个RadioButton的状态,并保证只可选一个
  1. public SearchUserAdapter(Context context, List<String> userList)
  2. {
  3. this.context = context;
  4. this.userList= userList;
  5. }
  6. @Override
  7. public int getCount() {
  8. return userList.size();
  9. }
  10. @Override
  11. public Object getItem(int position) {
  12. return userList.get(position);
  13. }
  14. @Override
  15. public long getItemId(int position) {
  16. return position;
  17. }
  18. @Override
  19. public View getView(final int position, View convertView, ViewGroup parent) {
  20. ViewHolder holder;
  21. if (convertView == null) {
  22. convertView = LayoutInflater.from(context).inflate(R.layout.search_user_item, null);
  23. holder = new ViewHolder();
  24. holder.background = (LinearLayout) convertView.findViewById(R.id.search_user_list_item);
  25. holder.userName = (TextView) convertView.findViewById(R.id.search_user_name);
  26. convertView.setTag(holder);
  27. }else{
  28. holder=(ViewHolder) convertView.getTag();
  29. }
  30. final RadioButton radio=(RadioButton) convertView.findViewById(R.id.radio_btn);
  31. holder.rdBtn = radio;
  32. holder.userName.setText(userList.get(position));
  33. //根据Item位置分配不同背景
  34. if(userList.size() > 0)
  35. {
  36. if(userList.size() == 1)
  37. {
  38. holder.background.setBackgroundResource(R.drawable.more_item_press);
  39. }
  40. else{
  41. if(position == 0){
  42. holder.background.setBackgroundResource(R.drawable.more_itemtop_press);
  43. }
  44. else if(position == userList.size()-1){
  45. holder.background.setBackgroundResource(R.drawable.more_itembottom_press);
  46. }
  47. else{
  48. holder.background.setBackgroundResource(R.drawable.more_itemmiddle_press);
  49. }
  50. }
  51. }
  52. //当RadioButton被选中时,将其状态记录进States中,并更新其他RadioButton的状态使它们不被选中
  53. holder.rdBtn.setOnClickListener(new View.OnClickListener() {
  54. public void onClick(View v) {
  55. //重置,确保最多只有一项被选中
  56. for(String key:states.keySet()){
  57. states.put(key, false);
  58. }
  59. states.put(String.valueOf(position), radio.isChecked());
  60. SearchUserAdapter.this.notifyDataSetChanged();
  61. }
  62. });
  63. boolean res=false;
  64. if(states.get(String.valueOf(position)) == null || states.get(String.valueOf(position))== false){
  65. res=false;
  66. states.put(String.valueOf(position), false);
  67. }
  68. else
  69. res = true;
  70. holder.rdBtn.setChecked(res);
  71. return convertView;
  72. }
  73. static class ViewHolder {
  74. LinearLayout background;
  75. TextView userName;
  76. RadioButton rdBtn;
  77. }

List适配代码(与一般无异):

  1. adapter = new SearchUserAdapter(this, searchUserList);
  2. searchUserLV.setAdapter(adapter);
  3. searchUserLV.setVisibility(View.VISIBLE);
  4. setListViewHeightBasedOnChildren(searchUserLV);

这里还根据内容动态设置了一下,具体函数如下:

  1. public void setListViewHeightBasedOnChildren(ListView listView) {
  2. Adapter listAdapter = listView.getAdapter();
  3. if (listAdapter == null) {
  4. return;
  5. }
  6. int totalHeight = 0;
  7. int viewCount = listAdapter.getCount();
  8. for (int i = 0; i < viewCount; i++) {
  9. View listItem = listAdapter.getView(i, null, listView);
  10. listItem.measure(0, 0);
  11. totalHeight += listItem.getMeasuredHeight();
  12. }
  13. ViewGroup.LayoutParams params = listView.getLayoutParams();
  14. params.height = totalHeight
  15. + (listView.getDividerHeight() * (listAdapter.getCount()-1)) + 10;//加10是为了适配自定义背景
  16. listView.setLayoutParams(params);
  17. }

当需要获取ListView中RadioButton的选择状态时,可以直接看Adapter中的states,具体如下:

  1. // 根据RadioButton的选择情况确定用户名
  2. for (int i = 0, j = searchUserLV.getCount(); i < j; i++) {
  3. View child = searchUserLV.getChildAt(i);
  4. RadioButton rdoBtn = (RadioButton) child
  5. .findViewById(R.id.radio_btn);
  6. if (rdoBtn.isChecked())
  7. searchUser = searchUserList.get(i);
  8. }

这里的searchUserList是调用后台服务获取的用户名列表,通过states获取选中用户名进行后续操作

效果图:

 
0
0
 
猜你在找
查看评论
6楼 xuan237812939 2015-12-29 18:58发表 [回复]
楼主思路很好
5楼 superyuanzhe 2015-12-26 19:29发表 [回复]
4楼 chuanglio 2015-10-27 14:34发表 [回复]
当获取ListView中RadioButton的选择状态时循环到看不见的行数
RadioButton rdoBtn = (RadioButton) child .findViewById(R.id.radio_btn); 
会出现空指针
3楼 樱花_殇 2015-05-25 17:14发表 [回复]
终于解决了,找了这个多资料,楼主这个是我找的里面最简单改动最少的一个,不错,谢谢楼主...
2楼 淘_tao 2014-06-10 13:55发表 [回复]
可以看看。。。。。。。
1楼 duduzaidudumei 2014-03-26 15:35发表 [回复]
关于状态的判断,不需要保存全部位置的状态,可以只保存一个值,被选中的position,当重新刷新view的时候判断map是否包含当前的position即可。这样数据比较多的时候,节省遍历的消耗。
Re: KANGOD_KING 2015-09-16 11:47发表 [回复]
回复duduzaidudumei:确实。
不过也用不到map了,只用一个int就行。
holder.radioButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mCheckedPosition = position;
notifyDataSetChanged();
}
});
重新刷新view的时候holder.radioButton.setChecked(position == mCheckedPosition);
Re: hety163 2014-04-23 10:22发表 [回复]
回复duduzaidudumei:一楼正解,楼主的方法虽然也能实现,但是比较消耗性能。
 
您还没有登录,请[登录][注册]
http://blog.csdn.net/checkin001/article/details/11519131

ListView与RadioButton组合——自定义单选列表的更多相关文章

  1. 【转】ListView与RadioButton组合——自定义单选列表

    原文网址:http://blog.csdn.net/checkin001/article/details/11519131 Android自带的RadioButton单选框只支持添加文字,我们自己写A ...

  2. ListView与CheckBox组合实现单选

    main.xml配置文件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns ...

  3. Android开发技巧——自定义单选或多选的ListView

    这篇其实应该是属于写自定义单选或多选的ListView的基础教程,无奈目前许多人对此的实现大多都绕了远路,反而使得这正规的写法倒显得有些技巧性了. 本文原创,转载请注明在CSDN上的出处: http: ...

  4. MVC应用程序与单选列表

    原文:MVC应用程序与单选列表 前几天,Insus.NET有在MVC应用程序中,练习了<MVC应用程序,动态创建单选列表(RadioButtonList)>http://www.cnblo ...

  5. ListView 自己定义BaseAdapter实现单选打勾(无漏洞)

    (假设须要完整demo,请评论留下邮箱) (眼下源代码已经不发送.假设须要源代码,加qq316701116.不喜勿扰) 近期由于一个项目的原因须要自己定义一个BaseAdapter实现ListVIew ...

  6. (转载)Android自定义标签列表控件LabelsView解析

    Android自定义标签列表控件LabelsView解析 作者 donkingliang 关注 2017.03.15 20:59* 字数 759 阅读 406评论 0喜欢 3 无论是在移动端的App, ...

  7. ylbtech-数据库设计与优化-对作为复选框/单选列表的集合表的设计

    ylbtech-DatabaseDesgin:ylbtech-数据库设计与优化-对作为复选框/单选列表的集合表的设计 -- DatabaseName:通用表结构-- -- 主要是针对将要设计的表对象, ...

  8. FastScroll(1)ListView打开FastScroll及自定义它的样式

    打开 FastScroll 方式 android:fastScrollEnabled="true" 它是AbsListView的属性. <?xml version=" ...

  9. 自定义SharePoint列表新增、编辑、查看页面(NewForm、EditForm、DispForm)

    转:http://blog.csdn.net/lance_lot1/article/details/7966571 在项目中,用户需求涉及在一个列表录入项目信息,选择一个项目后,与该项目相关的信息实现 ...

随机推荐

  1. input内文字点击消失 弹出层,可以写表单

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...

  2. C语言客户端服务器代码

    /* sockclnt.c*/ #include <stdio.h>#include <string.h>#include <stdlib.h>#include & ...

  3. ubuntu环境下安装Tomcat

    tomcat 是javaweb开发的本地服务器,tomcat是目前比较流行的一款. 1.下载Tomcat:http://tomcat.apache.org 2.进入下载文件夹解压Tomcat:sudo ...

  4. robot framework -记录关键字

    1.set value if (当条件满足时,进行变量赋值) 2.focus (将焦点定在制定的元素) 3.win close +title(关闭制定title) 4.get list items  ...

  5. CodeForces 682C Alyona and the Tree(广搜 + 技巧)

    方法:从根节点开始广搜,如果遇到了应该删除的点,就再广搜删掉它的子树并标记,然后统计一下被标记的个数就是答案,所谓技巧就是从根节点开始搜索的时候,如果遇到了某个节点的距离<0,就让它是0,0可以 ...

  6. 报错:“不是有效的Win32应用程序”的解决办法

    Win7.Win8下用VS2013编译完的程序,拿到32位WindowsXP虚拟机下运行有时候会报错:

  7. DedeCMS织梦文章内容图片绝对路径修改方法

    这几天在网站改版,想把网站做大,想做频道页二级域名,于是在做网站的过程中发现一个问题,dedecms开设二级域名后,在二级域名的文章页无法显示图片,查看源代码后发现问题,由于dedecms文章页中的图 ...

  8. JSP标准标签库(JSTL)--国际化标签库 fmt

    JSTL中使用fmt.tld作为格式化标签库的定义文件 No. 功能分类 标签名称 描述 1 国际化标签 <fmt:setLocale> 设置一个全局的地区代码 2 <fmt:req ...

  9. psy & vr

    技术指标及应用法则:PSY和VR 一.PSY(Psychologial Line)   1. PSY的参数 2. PSY的应用法则 二.VR(Volume Ratio) 1. VR的参数 2. VR的 ...

  10. rpm命令说明

    RPM命令常用参数 RPM的常规使用方法为rpm-?package.rpm,其中-?为操作参数(更多信息,请查阅帮助$manrpm): -q在系统中查询软件或查询指定rpm包的内容信息-i在系统中安装 ...