自定义ListView item包含checkbox实现单选和多选
来源:互联网 发布:下载站源码 编辑:程序博客网 时间:2024/06/05 07:37
CheckBox本为复选框,仍然可以当单选框用
自定义ListView item中包含一个textview 和checkbox,checkbox选中级别高于item,故在xml中进行屏蔽
单选方法:(该方法同样适用于radiobutton)
main.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ImageView android:id="@+id/img" android:layout_width="fill_parent" android:layout_height="wrap_content" android:src="@drawable/triangle16blue"/> <ListView android:id="@+id/lvGroup" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@drawable/downbutton_corner"/></LinearLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="horizontal" > <TextView android:id="@+id/item_tv" android:textSize="18sp" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:gravity="center_vertical" /> <CheckBox android:id="@+id/item_cb" android:layout_width="wrap_content" android:layout_height="wrap_content" android:focusable="false" android:clickable="false" android:focusableInTouchMode="false" android:gravity="center_vertical"/></LinearLayout>
MainActivity.java
public class MainActivity extends Activity { private static final String TAG = "MainActivity"; private ListView listView; private ArrayList<String> groups; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); listView = (ListView) this.findViewById(R.id.list); groups = new ArrayList<String>();groups.add("11");groups.add("22");groups.add("33");groups.add("44");groups.add("55");groups.add("66");groups.add("77"); GroupAdapter adapter = new GroupAdapter(this,groups); listView.setAdapter(adapter); listView.setOnItemClickListener(listItemClickListener); OnItemClickListener listItemClickListener=new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position,long id) {//// 取得ViewHolder对象,这样就省去了通过层层的findViewById去实例化我们需要的cb实例的步骤 ViewHolder viewHolder=(ViewHolder)view.getTag();viewHolder.cb.toggle();// 把CheckBox的选中状态改为当前状态的反,gridview确保是单一选中}}; } }}
GroupAdapter.java
public class GroupAdapter extends BaseAdapter {private Activity activity;//上下文private ArrayList<String> list;private LayoutInflater inflater=null;//导入布局private int temp=-1;public GroupAdapter(Activity context, ArrayList<String> list) {this.activity = context;this.list = list;inflater=LayoutInflater.from(context);}@Overridepublic int getCount() {return list.size();}@Overridepublic Object getItem(int position) {return list.get(position);}@Overridepublic long getItemId(int position) {// TODO Auto-generated method stubreturn position;} //listview每显示一行数据,该函数就执行一次@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder=null; if (convertView==null) {//当第一次加载ListView控件时 convertView为空convertView=inflater.inflate(R.layout.group_item_view, null);//所以当ListView控件没有滑动时都会执行这条语句holder=new ViewHolder();holder.tv=(TextView)convertView.findViewById(R.id.item_tv);holder.cb=(CheckBox)convertView.findViewById(R.id.item_cb);convertView.setTag(holder);//为view设置标签 }else{//取出holderholder=(ViewHolder) convertView.getTag();//the Object stored in this view as a tag}//设置list的textview显示holder.tv.setTextColor(Color.WHITE);holder.tv.setText(list.get(position));// 根据isSelected来设置checkbox的选中状况holder.cb.setId(position);//对checkbox的id进行重新设置为当前的positionholder.cb.setOnCheckedChangeListener(new OnCheckedChangeListener() {//把上次被选中的checkbox设为false@Overridepublic void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {if(isChecked){//实现checkbox的单选功能,同样适用于radiobuttonif(temp!=-1){//找到上次点击的checkbox,并把它设置为false,对重新选择时可以将以前的关掉CheckBox tempCheckBox=(CheckBox)activity.findViewById(temp);if(tempCheckBox!=null)tempCheckBox.setChecked(false);}temp=buttonView.getId();//保存当前选中的checkbox的id值}}});//System.out.println("temp:"+temp);//System.out.println("position:"+position);if(position==temp)//比对position和当前的temp是否一致holder.cb.setChecked(true);else holder.cb.setChecked(false);return convertView;}static class ViewHolder {TextView tv;CheckBox cb;}}
MainAcitvity.java
public class MainActivity extends Activity { private static final String TAG = "MainActivity"; private ListView listView; private ArrayList<String> groups; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); listView = (ListView) this.findViewById(R.id.list); groups = new ArrayList<String>();groups.add("11");groups.add("22");groups.add("33");groups.add("44");groups.add("55");groups.add("66");groups.add("77"); GroupAdapter adapter = new GroupAdapter(this,groups); listView.setAdapter(adapter); listView.setOnItemClickListener(listItemClickListener); OnItemClickListener listItemClickListener=new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position,long id) {//// 取得ViewHolder对象,这样就省去了通过层层的findViewById去实例化我们需要的cb实例的步骤 ViewHolder viewHolder=(ViewHolder)view.getTag();viewHolder.cb.toggle();// 把CheckBox的选中状态改为当前状态的反,gridview确保是单一选中GroupAdapter.getIsSelected().put(position, viewHolder.cb.isChecked());//将CheckBox的选中状况记录下来 }}; } }
GroupAdapter.java
public class GroupAdapter extends BaseAdapter {private Context context;//上下文private ArrayList<String> list;//控制CheckBox选中情况private static HashMap<Integer,Boolean> isSelected;private LayoutInflater inflater=null;//导入布局public GroupAdapter(Context context, ArrayList<String> list) {this.context = context;this.list = list;inflater=LayoutInflater.from(context);isSelected=new HashMap<Integer, Boolean>();initData();}private void initData(){//初始化isSelected的数据for(int i=0;i<list.size();i++){getIsSelected().put(i,false);}}@Overridepublic int getCount() {return list.size();}@Overridepublic Object getItem(int position) {return list.get(position);}@Overridepublic long getItemId(int position) {// TODO Auto-generated method stubreturn position;} //listview每显示一行数据,该函数就执行一次@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder=null; if (convertView==null) {//当第一次加载ListView控件时 convertView为空convertView=inflater.inflate(R.layout.group_item_view, null);//所以当ListView控件没有滑动时都会执行这条语句holder=new ViewHolder();holder.tv=(TextView)convertView.findViewById(R.id.item_tv);holder.cb=(CheckBox)convertView.findViewById(R.id.item_cb);convertView.setTag(holder);//为view设置标签 }else{//取出holderholder=(ViewHolder) convertView.getTag();//the Object stored in this view as a tag}//设置list的textview显示holder.tv.setTextColor(Color.WHITE);holder.tv.setText(list.get(position));// 根据isSelected来设置checkbox的选中状况holder.cb.setChecked(getIsSelected().get(position));return convertView;}static class ViewHolder {TextView tv;CheckBox cb;}public static HashMap<Integer, Boolean>getIsSelected(){return isSelected;}public static void setIsSelected(HashMap<Integer, Boolean> isSelected){GroupAdapter.isSelected=isSelected;}}其中,getview负责显示每一行listview item,每显示一行就执行一次getview,
若要单选,必须保存当前选中的checkbox的position值,与listview 的每一个item的position进行比较,相同时才设置checkbox ischeck=true;
只有checkbox的setOnCheckChangeListener可以做到这点,保存上一次点击的position值,对checkbox的id值重新设置.temp保存该id值.
getview负责显示数据,onitemselectedlistener负责发送消息,提取数据,处理数据
参考:http://blog.csdn.net/notice520/article/details/7266896
http://blog.csdn.net/jdsjlzx/article/details/6969405
http://www.devdiv.com/forum.php?mod=viewthread&tid=85251
- 自定义ListView item包含checkbox实现单选和多选
- 自定义ListView item包含checkbox实现单选和多选
- 自定义ListView item包含checkbox实现单选记录自己开发是遇到的问题
- Listview的item包含radiobutton实现单选,checkbox也适用
- listview+checkbox实现单选
- Android 使用CheckBox实现ListView自定义单选
- Android ListView 实现Item单选效果
- ListView 加checkBox实现 单选功能
- ListView与CheckBox组合实现单选
- 用CheckBox实现ListView单选效果
- Android学习-ListView+ CheckBox实现单选
- CheckBox在listview中实现单选
- Android ListView带CheckBox实现单选
- android ListView+CheckBox实现单选
- ListView+CheckBox实现单选效果
- ListView+CheckBox实现单选列表
- ListView中的CheckBox实现单选
- Android ListView 使用checkbox 实现 单选、多选操作
- 扩展欧几里德 之 五指山 nefu 84
- Ubuntu 防火墙配置
- HUD 1978——How many ways
- 动态链接 静态链接
- C标准库中字符与数字的转换函数
- 自定义ListView item包含checkbox实现单选和多选
- App应用里应该自动跳转到系统设置界面吗?
- 词法分析——实验过程中遇到的问题
- 子网划分及子网掩码计算方法
- 常用查询条件\分组 group by\having和where的区别\union查询
- TCP 分段和IP分片对比
- 【eoeAndroid社区索引】android 条形码的知识汇总
- The notes of Algorithms ---- Dynamic Programming
- 从技术层次解析“微信收费事件”