android listview实现单选按钮,Android ListView+RadioButton实现单选的方法

【目标】

实现列表的单项选择

0818b9ca8b590ca3270a3433284dd417.png

【方案】

在ListView中添加RadioButton。

【存在的问题】

若设置RadioButton为可点击时,会屏蔽ListView的itemClick。

各个RadioButton互相没有关联,可以都把它们选中却无法取消。

【我的解决办法】

取消ListView 的onItemClickListener()

使用RadioButton的onClickListener()

新建一个变量,记录每次被点击的position

getView的时候只让变量记录的RadioButton被选中

通过handler将选中的值传到activity中

【缺点】

必须点击RadioButton才行

点击listView的item没有响应

可操作的面积变小

【代码】

下面是adapter类

package com.example.model;

import java.util.List;

import android.content.Context;

import android.os.Handler;

import android.os.Message;

import android.view.LayoutInflater;

import android.view.View;

import android.view.View.OnClickListener;

import android.view.ViewGroup;

import android.widget.ArrayAdapter;

import android.widget.RadioButton;

import com.example.haveimgfun.R;

public class NumRecAdapter extends ArrayAdapter{

private int resourceId;

private Handler myHandler;

//被选择的checkedButton序号

int checkedPos;

public NumRecAdapter(Context context, int resource, List objects, Handler handler) {

super(context, resource, objects);

// TODO Auto-generated constructor stub

myHandler = handler;

resourceId = resource;

}

private static class ViewHolder{

RadioButton radioButton;

int position;

}

//getView在每个子项被滚到屏幕内的时候调用

@Override

public View getView(final int position, View convertView, ViewGroup parent){

//Log.i("tag","position:"+position);

int numRecord = getItem(position).getNum();

View view; //代表每个子项

ViewHolder viewHolder;

//convertView,更新子项的布局

if(convertView == null){

//为子项加载传入的布局

view = LayoutInflater.from(getContext()).inflate(resourceId,null);

viewHolder = new ViewHolder();

viewHolder.radioButton = (RadioButton) view.findViewById(R.id.tab2_radio);

//给view添加一个额外的数据

view.setTag(viewHolder);

}else{

view = convertView;

viewHolder = (ViewHolder)view.getTag();

}

//checkedButton被点击时,设置checkedPos为当前的position

//每一个进入view的list都会设置一个监听器

//因此position为被点击的list

viewHolder.radioButton.setOnClickListener(new OnClickListener(){

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

//Log.i("tag","clicked position:"+position);

checkedPos = position;

//将选中的消息通过handler返回给MainActivity

Message message = new Message();

message.what = position;

myHandler.sendMessage(message);

//重绘listView

notifyDataSetChanged();

}

});

viewHolder.position = position;

//更新radioButton,只用checkedPos才被选中

viewHolder.radioButton.setChecked(position == checkedPos);

//使radioButton无法点击,这样listItem才能捕获点击事件

//viewHolder.radioButton.setClickable(false);

viewHolder.radioButton.setText(String.valueOf(numRecord));

return view;

}

}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值