ListView与RadioButton组合——自定义单选列表

版权声明:本文为博主原创文章,未经博主允许不得转载。
Android自带的RadioButton单选框只支持添加文字,我们自己写Adapter实现自定义的RadioButton
首先item的XML源码
search_user_item.xml (现在只是文字+单选按钮+自定义背景,可以根据需要随意扩展)
- <?xml version="1.0" encoding="utf-8"?>
 - <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 - android:id="@+id/search_user_list_item"
 - android:layout_width="fill_parent"
 - android:layout_height="30dp"
 - android:layout_marginBottom="10dp"
 - android:layout_marginTop="10dp"
 - android:background="@drawable/more_item_press"
 - android:gravity="center_vertical"
 - android:orientation="horizontal" >
 - <TextView
 - android:id="@+id/search_user_name"
 - android:layout_width="200dp"
 - android:layout_height="wrap_content"
 - android:layout_marginLeft="30dp"
 - android:gravity="left"
 - android:textColor="@android:color/black"
 - android:textSize="16sp" />
 - <RadioButton
 - android:id="@+id/radio_btn"
 - android:layout_width="wrap_content"
 - android:layout_height="wrap_content"
 - android:layout_marginLeft="10dp" />
 - </LinearLayout>
 
Listview就是用系统自带的
- <ListView
 - android:id="@+id/search_user_list"
 - android:layout_width="fill_parent"
 - android:layout_height="200dp"
 - android:layout_marginLeft="5dp"
 - android:layout_marginRight="5dp"
 - android:paddingBottom="5dp"
 - android:cacheColorHint="@android:color/transparent"
 - android:divider="@null"
 - android:listSelector="@android:color/transparent"
 - android:visibility="gone" >
 - </ListView>
 
再来是Adapter代码
SearchUserAdapter.java (具体改动写在代码注释里面)
- package ouc.sei.suxin.android.ui.adapter;
 - import java.util.HashMap;
 - import java.util.List;
 - import ouc.sei.suxin.R;
 - import android.content.Context;
 - import android.view.LayoutInflater;
 - import android.view.View;
 - import android.view.ViewGroup;
 - import android.widget.BaseAdapter;
 - import android.widget.LinearLayout;
 - import android.widget.RadioButton;
 - import android.widget.TextView;
 - public class SearchUserAdapter extends BaseAdapter {
 - private Context context;
 - private List<String> userList;
 - HashMap<String,Boolean> states=new HashMap<String,Boolean>();//用于记录每个RadioButton的状态,并保证只可选一个
 
- public SearchUserAdapter(Context context, List<String> userList)
 - {
 - this.context = context;
 - this.userList= userList;
 - }
 - @Override
 - public int getCount() {
 - return userList.size();
 - }
 - @Override
 - public Object getItem(int position) {
 - return userList.get(position);
 - }
 - @Override
 - public long getItemId(int position) {
 - return position;
 - }
 - @Override
 - public View getView(final int position, View convertView, ViewGroup parent) {
 - ViewHolder holder;
 - if (convertView == null) {
 - convertView = LayoutInflater.from(context).inflate(R.layout.search_user_item, null);
 - holder = new ViewHolder();
 - holder.background = (LinearLayout) convertView.findViewById(R.id.search_user_list_item);
 - holder.userName = (TextView) convertView.findViewById(R.id.search_user_name);
 - convertView.setTag(holder);
 - }else{
 - holder=(ViewHolder) convertView.getTag();
 - }
 - final RadioButton radio=(RadioButton) convertView.findViewById(R.id.radio_btn);
 - holder.rdBtn = radio;
 - holder.userName.setText(userList.get(position));
 - //根据Item位置分配不同背景
 - if(userList.size() > 0)
 - {
 - if(userList.size() == 1)
 - {
 - holder.background.setBackgroundResource(R.drawable.more_item_press);
 - }
 - else{
 - if(position == 0){
 - holder.background.setBackgroundResource(R.drawable.more_itemtop_press);
 - }
 - else if(position == userList.size()-1){
 - holder.background.setBackgroundResource(R.drawable.more_itembottom_press);
 - }
 - else{
 - holder.background.setBackgroundResource(R.drawable.more_itemmiddle_press);
 - }
 - }
 - }
 - //当RadioButton被选中时,将其状态记录进States中,并更新其他RadioButton的状态使它们不被选中
 - holder.rdBtn.setOnClickListener(new View.OnClickListener() {
 - public void onClick(View v) {
 - //重置,确保最多只有一项被选中
 - for(String key:states.keySet()){
 - states.put(key, false);
 - }
 - states.put(String.valueOf(position), radio.isChecked());
 - SearchUserAdapter.this.notifyDataSetChanged();
 - }
 - });
 - boolean res=false;
 - if(states.get(String.valueOf(position)) == null || states.get(String.valueOf(position))== false){
 - res=false;
 - states.put(String.valueOf(position), false);
 - }
 - else
 - res = true;
 - holder.rdBtn.setChecked(res);
 - return convertView;
 - }
 - static class ViewHolder {
 - LinearLayout background;
 - TextView userName;
 - RadioButton rdBtn;
 - }
 
List适配代码(与一般无异):
- adapter = new SearchUserAdapter(this, searchUserList);
 - searchUserLV.setAdapter(adapter);
 - searchUserLV.setVisibility(View.VISIBLE);
 - setListViewHeightBasedOnChildren(searchUserLV);
 
这里还根据内容动态设置了一下,具体函数如下:
- public void setListViewHeightBasedOnChildren(ListView listView) {
 - Adapter listAdapter = listView.getAdapter();
 - if (listAdapter == null) {
 - return;
 - }
 - int totalHeight = 0;
 - int viewCount = listAdapter.getCount();
 - for (int i = 0; i < viewCount; i++) {
 - View listItem = listAdapter.getView(i, null, listView);
 - listItem.measure(0, 0);
 - totalHeight += listItem.getMeasuredHeight();
 - }
 - ViewGroup.LayoutParams params = listView.getLayoutParams();
 - params.height = totalHeight
 - + (listView.getDividerHeight() * (listAdapter.getCount()-1)) + 10;//加10是为了适配自定义背景
 - listView.setLayoutParams(params);
 - }
 
当需要获取ListView中RadioButton的选择状态时,可以直接看Adapter中的states,具体如下:
- // 根据RadioButton的选择情况确定用户名
 - for (int i = 0, j = searchUserLV.getCount(); i < j; i++) {
 - View child = searchUserLV.getChildAt(i);
 - RadioButton rdoBtn = (RadioButton) child
 - .findViewById(R.id.radio_btn);
 - if (rdoBtn.isChecked())
 - searchUser = searchUserList.get(i);
 - }
 
这里的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);
会出现空指针 
- 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); 
ListView与RadioButton组合——自定义单选列表的更多相关文章
- 【转】ListView与RadioButton组合——自定义单选列表
		
原文网址:http://blog.csdn.net/checkin001/article/details/11519131 Android自带的RadioButton单选框只支持添加文字,我们自己写A ...
 - ListView与CheckBox组合实现单选
		
main.xml配置文件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns ...
 - Android开发技巧——自定义单选或多选的ListView
		
这篇其实应该是属于写自定义单选或多选的ListView的基础教程,无奈目前许多人对此的实现大多都绕了远路,反而使得这正规的写法倒显得有些技巧性了. 本文原创,转载请注明在CSDN上的出处: http: ...
 - MVC应用程序与单选列表
		
原文:MVC应用程序与单选列表 前几天,Insus.NET有在MVC应用程序中,练习了<MVC应用程序,动态创建单选列表(RadioButtonList)>http://www.cnblo ...
 - ListView 自己定义BaseAdapter实现单选打勾(无漏洞)
		
(假设须要完整demo,请评论留下邮箱) (眼下源代码已经不发送.假设须要源代码,加qq316701116.不喜勿扰) 近期由于一个项目的原因须要自己定义一个BaseAdapter实现ListVIew ...
 - (转载)Android自定义标签列表控件LabelsView解析
		
Android自定义标签列表控件LabelsView解析 作者 donkingliang 关注 2017.03.15 20:59* 字数 759 阅读 406评论 0喜欢 3 无论是在移动端的App, ...
 - ylbtech-数据库设计与优化-对作为复选框/单选列表的集合表的设计
		
ylbtech-DatabaseDesgin:ylbtech-数据库设计与优化-对作为复选框/单选列表的集合表的设计 -- DatabaseName:通用表结构-- -- 主要是针对将要设计的表对象, ...
 - FastScroll(1)ListView打开FastScroll及自定义它的样式
		
打开 FastScroll 方式 android:fastScrollEnabled="true" 它是AbsListView的属性. <?xml version=" ...
 - 自定义SharePoint列表新增、编辑、查看页面(NewForm、EditForm、DispForm)
		
转:http://blog.csdn.net/lance_lot1/article/details/7966571 在项目中,用户需求涉及在一个列表录入项目信息,选择一个项目后,与该项目相关的信息实现 ...
 
随机推荐
- Android OpenGL ES(一)OpenGL ES介绍
			
在学习Android OpenGL ES开发之前,你必须具备Java 语言开发经验和一些Android开发的基本知识,但并不需要有图形开发的经验,本教程也会涉及到一些基本的线性几何知识,如矢量,矩阵运 ...
 - Hibernate 系列教程5-双向多对一
			
主要讲解inverse和cascade的用法 cascade定义的是关系两端对象到对象的级联关系: 而inverse定义的是关系和对象的级联关系(管理外键的值). inverse 属性默认是false ...
 - POJ 1067 取石子游戏 威佐夫博弈
			
威佐夫博弈(Wythoff Game):有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜. 我们用(ak,bk)(ak ≤ bk ,k= ...
 - Office2003/2010等集成SP的简单方法
			
Office2003集成SP的简单方法 需要准备的工具:Office 2003 光盘镜像.SP3更新包.Office 2003 序列号.UltraISO,7-zip或winrar,虚拟光驱 步骤一:提 ...
 - 基础-session,cookie,jsp,EL,JSTL
			
会话可以简单理解为:用户打开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话. kookie是在服务器端创建的,返回给浏览器,在浏览器的目录中保存了,下一次 ...
 - linux下环境变量PS1设置
			
PS1变量中提示符各项含义: \d :代表日期,格式为weekday month date,例如:Wed Dec 12 \H :完整的主机名称.例如:hostname是debian.linux \ ...
 - Python文件打包成EXE文件
			
工具:pyinstaller 安装:pip install pyinstaller 使用: 1 将依赖文件集中到一个文件夹: pyinstaller -D -w xxx.py ...
 - 在线的代码托管平台 coding.net ===中国扩展版github
			
coding.net 是国内新兴的一个项目管理平台,功能主要包括:代码托管.在线运行环境.监控代码质量,兼有一定的社交功能. 在线运行环境支持Java.Ruby.Node.js.PHP.Python. ...
 - angularjs三级联动
			
<div ng-controller="AjaxCtrl"> <h1>AJAX - Oriented</h1> <div> Coun ...
 - JSP内置对象--session对象(getId(),getCreationTime(),getLastAccessedTime(),isNew(),invalidate(),setAttribute(),getAttribute())
			
session对象是javax.servlet.http.HttpSession接口的实例,但是不像HttpServletRequest或HttpServletResponse一样,有父接口,他没有父 ...