标签:radiobuttonlistviewandroidlayout 分类: Android(19)

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

首先item的XML源码

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

[html] view plain copy
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns: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就是用系统自带的

[html] view plain copy
  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 (具体改动写在代码注释里面)

[java] view plain copy
  1. packageouc.sei.suxin.android.ui.adapter;
  2. importjava.util.HashMap;
  3. importjava.util.List;
  4. importouc.sei.suxin.R;
  5. importandroid.content.Context;
  6. importandroid.view.LayoutInflater;
  7. importandroid.view.View;
  8. importandroid.view.ViewGroup;
  9. importandroid.widget.BaseAdapter;
  10. importandroid.widget.LinearLayout;
  11. importandroid.widget.RadioButton;
  12. importandroid.widget.TextView;
  13. publicclassSearchUserAdapterextendsBaseAdapter{
  14. privateContextcontext;
  15. privateList<String>userList;
  16. HashMap<String,Boolean>states=newHashMap<String,Boolean>();//用于记录每个RadioButton的状态,并保证只可选一个
[java] view plain copy
  1. publicSearchUserAdapter(Contextcontext,List<String>userList)
  2. {
  3. this.context=context;
  4. this.userList=userList;
  5. }
  6. @Override
  7. publicintgetCount(){
  8. returnuserList.size();
  9. }
  10. @Override
  11. publicObjectgetItem(intposition){
  12. returnuserList.get(position);
  13. }
  14. @Override
  15. publiclonggetItemId(intposition){
  16. returnposition;
  17. }
  18. @Override
  19. publicViewgetView(finalintposition,ViewconvertView,ViewGroupparent){
  20. ViewHolderholder;
  21. if(convertView==null){
  22. convertView=LayoutInflater.from(context).inflate(R.layout.search_user_item,null);
  23. holder=newViewHolder();
  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. finalRadioButtonradio=(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. elseif(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(newView.OnClickListener(){
  54. publicvoidonClick(Viewv){
  55. //重置,确保最多只有一项被选中
  56. for(Stringkey:states.keySet()){
  57. states.put(key,false);
  58. }
  59. states.put(String.valueOf(position),radio.isChecked());
  60. SearchUserAdapter.this.notifyDataSetChanged();
  61. }
  62. });
  63. booleanres=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. returnconvertView;
  72. }
  73. staticclassViewHolder{
  74. LinearLayoutbackground;
  75. TextViewuserName;
  76. RadioButtonrdBtn;
  77. }

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

[java] view plain copy
  1. adapter=newSearchUserAdapter(this,searchUserList);
  2. searchUserLV.setAdapter(adapter);
  3. searchUserLV.setVisibility(View.VISIBLE);
  4. setListViewHeightBasedOnChildren(searchUserLV);

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

[java] view plain copy
  1. publicvoidsetListViewHeightBasedOnChildren(ListViewlistView){
  2. AdapterlistAdapter=listView.getAdapter();
  3. if(listAdapter==null){
  4. return;
  5. }
  6. inttotalHeight=0;
  7. intviewCount=listAdapter.getCount();
  8. for(inti=0;i<viewCount;i++){
  9. ViewlistItem=listAdapter.getView(i,null,listView);
  10. listItem.measure(0,0);
  11. totalHeight+=listItem.getMeasuredHeight();
  12. }
  13. ViewGroup.LayoutParamsparams=listView.getLayoutParams();
  14. params.height=totalHeight
  15. +(listView.getDividerHeight()*(listAdapter.getCount()-1))+10;//加10是为了适配自定义背景
  16. listView.setLayoutParams(params);
  17. }

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

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

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

效果图:

0
0

我的同类文章

Android(19)
  • •RecyclerView与ListView对比浅析(三):绘制
  • •RecyclerView与ListView对比浅析(一):初始化篇
  • •Drawable加入动画机制(一)
  • •Ant实现Android代码编译混淆(“找不到程序包R”解决方法)
  • •GenyMotion使用遇到的问题杂记(更新中)
  • •RecyclerView与ListView对比浅析(二):View缓存篇
  • •Drawable加入动画机制(二)
  • •导入Android-Support-V7包“inconsistent”错误解决方法
  • •IntelliJ IDEA使用问题汇总(持续更新中)
  • 更多
主题推荐
android xml radio button listview 搜索 源码
猜你在找
Android底层技术:Java层系统服务(Android Service) 威哥全套Android开发课程【基础与UI技术】 Android必备的Java基础知识(三) Android开发精品课程【Java核心知识】 Android必备的Java基础知识 Android开发listview中嵌套checkBox复选框实现单选全选删除列表内容 Android 使用CheckBox实现ListView自定义单选 Android的MasterDetail风格界面中实现自定义ListView的单选 VC单选按钮控件Radio Button用法转 VC单选按钮控件Radio Button用法转 查看评论
6楼 xuan2378129392015-12-29 18:58发表[回复]
楼主思路很好
5楼 superyuanzhe2015-12-26 19:29发表[回复]
4楼 chuanglio2015-10-27 14:34发表[回复]
当获取ListView中RadioButton的选择状态时循环到看不见的行数
RadioButton rdoBtn = (RadioButton) child .findViewById(R.id.radio_btn);
会出现空指针
3楼 樱花_殇2015-05-25 17:14发表[回复]
终于解决了,找了这个多资料,楼主这个是我找的里面最简单改动最少的一个,不错,谢谢楼主...
2楼 淘_tao2014-06-10 13:55发表[回复]
可以看看。。。。。。。
1楼 duduzaidudumei2014-03-26 15:35发表[回复]
关于状态的判断,不需要保存全部位置的状态,可以只保存一个值,被选中的position,当重新刷新view的时候判断map是否包含当前的position即可。这样数据比较多的时候,节省遍历的消耗。
Re: KANGOD_KING2015-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: hety1632014-04-23 10:22发表[回复]
回复duduzaidudumei:一楼正解,楼主的方法虽然也能实现,但是比较消耗性能。
您还没有登录,请 [登录]或 [注册] http://blog.csdn.net/checkin001/article/details/11519131

更多相关文章

  1. git使用小结
  2. Android(安卓)WifiManager 中的常量
  3. 我的Android心得(5)--响铃、震动、状态栏提示
  4. Android(安卓)Lollipop 设置状态栏颜色
  5. Android(安卓)4.4+ 实现半透明状态栏(Translucent Bars)
  6. Android(安卓)View 下拉刷新之头部效果自定义 [水]
  7. Android(安卓)开发学习小结(五)
  8. Android中的享元模式
  9. (转载) Android(安卓)RecyclerView 使用完全解析 体验艺术般的控件

随机推荐

  1. Using Intent in an Android(安卓)applic
  2. android之实现各个组件点击事件监听
  3. androi 添加桌面快捷方式
  4. Android特色开发--情景模式
  5. Android(安卓)CTS Test
  6. Android再按一次退出软件
  7. Android(安卓)Dialog设置动画
  8. Android蓝牙通信代码
  9. Android下修改SeekBar样式
  10. Android(安卓)动态获取资源ID