ListView与RadioButton组合——自定义单选列表
16lz
2021-01-26
标签:radiobuttonlistviewandroidlayout 2013-09-10 11:1319396人阅读评论(8)收藏举报 分类: Android(19)
再来是Adapter代码
List适配代码(与一般无异): [java] view plain copy
这里还根据内容动态设置了一下,具体函数如下: [java] view plain copy
当需要获取ListView中RadioButton的选择状态时,可以直接看Adapter中的states,具体如下: [java] view plain copy
这里的searchUserList是调用后台服务获取的用户名列表,通过states获取选中用户名进行后续操作
版权声明:本文为博主原创文章,未经博主允许不得转载。
Android自带的RadioButton单选框只支持添加文字,我们自己写Adapter实现自定义的RadioButton
首先item的XML源码
search_user_item.xml (现在只是文字+单选按钮+自定义背景,可以根据需要随意扩展)
[html] view plain copy- <?xmlversion="1.0"encoding="utf-8"?>
- <LinearLayoutxmlns: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就是用系统自带的
[html] view plain copy- <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 (具体改动写在代码注释里面)
[java] view plain copy- packageouc.sei.suxin.android.ui.adapter;
- importjava.util.HashMap;
- importjava.util.List;
- importouc.sei.suxin.R;
- importandroid.content.Context;
- importandroid.view.LayoutInflater;
- importandroid.view.View;
- importandroid.view.ViewGroup;
- importandroid.widget.BaseAdapter;
- importandroid.widget.LinearLayout;
- importandroid.widget.RadioButton;
- importandroid.widget.TextView;
- publicclassSearchUserAdapterextendsBaseAdapter{
- privateContextcontext;
- privateList<String>userList;
- HashMap<String,Boolean>states=newHashMap<String,Boolean>();//用于记录每个RadioButton的状态,并保证只可选一个
- publicSearchUserAdapter(Contextcontext,List<String>userList)
- {
- this.context=context;
- this.userList=userList;
- }
- @Override
- publicintgetCount(){
- returnuserList.size();
- }
- @Override
- publicObjectgetItem(intposition){
- returnuserList.get(position);
- }
- @Override
- publiclonggetItemId(intposition){
- returnposition;
- }
- @Override
- publicViewgetView(finalintposition,ViewconvertView,ViewGroupparent){
- ViewHolderholder;
- if(convertView==null){
- convertView=LayoutInflater.from(context).inflate(R.layout.search_user_item,null);
- holder=newViewHolder();
- 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();
- }
- finalRadioButtonradio=(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);
- }
- elseif(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(newView.OnClickListener(){
- publicvoidonClick(Viewv){
- //重置,确保最多只有一项被选中
- for(Stringkey:states.keySet()){
- states.put(key,false);
- }
- states.put(String.valueOf(position),radio.isChecked());
- SearchUserAdapter.this.notifyDataSetChanged();
- }
- });
- booleanres=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);
- returnconvertView;
- }
- staticclassViewHolder{
- LinearLayoutbackground;
- TextViewuserName;
- RadioButtonrdBtn;
- }
List适配代码(与一般无异): [java] view plain copy
- adapter=newSearchUserAdapter(this,searchUserList);
- searchUserLV.setAdapter(adapter);
- searchUserLV.setVisibility(View.VISIBLE);
- setListViewHeightBasedOnChildren(searchUserLV);
这里还根据内容动态设置了一下,具体函数如下: [java] view plain copy
- publicvoidsetListViewHeightBasedOnChildren(ListViewlistView){
- AdapterlistAdapter=listView.getAdapter();
- if(listAdapter==null){
- return;
- }
- inttotalHeight=0;
- intviewCount=listAdapter.getCount();
- for(inti=0;i<viewCount;i++){
- ViewlistItem=listAdapter.getView(i,null,listView);
- listItem.measure(0,0);
- totalHeight+=listItem.getMeasuredHeight();
- }
- ViewGroup.LayoutParamsparams=listView.getLayoutParams();
- params.height=totalHeight
- +(listView.getDividerHeight()*(listAdapter.getCount()-1))+10;//加10是为了适配自定义背景
- listView.setLayoutParams(params);
- }
当需要获取ListView中RadioButton的选择状态时,可以直接看Adapter中的states,具体如下: [java] view plain copy
- //根据RadioButton的选择情况确定用户名
- for(inti=0,j=searchUserLV.getCount();i<j;i++){
- Viewchild=searchUserLV.getChildAt(i);
- RadioButtonrdoBtn=(RadioButton)child
- .findViewById(R.id.radio_btn);
- if(rdoBtn.isChecked())
- searchUser=searchUserList.get(i);
- }
这里的searchUserList是调用后台服务获取的用户名列表,通过states获取选中用户名进行后续操作
效果图:
- 顶
- 0
- 踩
- 0
- 上一篇GenyMotion使用遇到的问题杂记(更新中)
- 下一篇【随手记】进程与线程
我的同类文章
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 搜索 源码
- 猜你在找
- 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:一楼正解,楼主的方法虽然也能实现,但是比较消耗性能。
更多相关文章
- git使用小结
- Android(安卓)WifiManager 中的常量
- 我的Android心得(5)--响铃、震动、状态栏提示
- Android(安卓)Lollipop 设置状态栏颜色
- Android(安卓)4.4+ 实现半透明状态栏(Translucent Bars)
- Android(安卓)View 下拉刷新之头部效果自定义 [水]
- Android(安卓)开发学习小结(五)
- Android中的享元模式
- (转载) Android(安卓)RecyclerView 使用完全解析 体验艺术般的控件