自己定义ListView就要自己写个LIstviewAdapter继承BaseAdapter这个类然后通过其中的getView()方法把数据映射到相应控件之中
下面是我实现的带单选框的listView(如果是想带按钮实现更简单,就不需要考虑单选框的按钮特性了)
在做的过程之中出现了点击item无响应的情况,最后发现是子控件radioButton获得了焦点是其父控件即item失去了焦点所以在getView ()之中让RadioButton失去焦点即可
先放个效果图
代码如下
- package com.example.mylistview;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import android.app.Activity;
- import android.app.AlertDialog;
- import android.content.Context;
- import android.content.DialogInterface;
- import android.os.Bundle;
- import android.util.Log;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.view.ViewGroup;
- import android.widget.AdapterView;
- import android.widget.AdapterView.OnItemClickListener;
- import android.widget.BaseAdapter;
- import android.widget.Button;
- import android.widget.CompoundButton;
- import android.widget.ImageView;
- import android.widget.ListView;
- import android.widget.RadioButton;
- import android.widget.TextView;
- public class MyListViewWithRadio extends Activity implements OnItemClickListener {
- private ListView listView;
- private List<Map<String, Object>> mData;
- //record the current checked radio number
- private int checkedIndex = -1;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- mData = getData();
- listView = new ListView(this);
- MyAdapter myAdapter = new MyAdapter(this);
- listView.setAdapter(myAdapter);
- listView.setOnItemClickListener(this);
- setContentView(listView);
- }
- //获取要在list中显示的数据
- private List<Map<String,Object>> getData(){
- List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
- Map<String,Object> map = new HashMap<String,Object>();
- map.put("title", "G1");
- map.put("info", "google 1");
- map.put("img", R.drawable.wear_breast);
- list.add(map);
- map = new HashMap<String, Object>();
- map.put("title", "G2");
- map.put("info", "google 2");
- map.put("img", R.drawable.wear_wasit);
- list.add(map);
- map = new HashMap<String, Object>();
- map.put("title", "G3");
- map.put("info", "google 3");
- map.put("img", R.drawable.wear_wrist);
- list.add(map);
- map = new HashMap<String, Object>();
- map.put("title", "G4");
- map.put("info", "google 4");
- map.put("img", R.drawable.wearl_ankle);
- list.add(map);
- map = new HashMap<String, Object>();
- map.put("title", "G5");
- map.put("info", "google 5");
- map.put("img", R.drawable.wear_breast);
- list.add(map);
- map = new HashMap<String, Object>();
- map.put("title", "G6");
- map.put("info", "google 6");
- map.put("img", R.drawable.wear_wasit);
- list.add(map);
- map = new HashMap<String, Object>();
- map.put("title", "G7");
- map.put("info", "google 7");
- map.put("img", R.drawable.wear_wrist);
- list.add(map);
- map = new HashMap<String, Object>();
- map.put("title", "G8");
- map.put("info", "google 8");
- map.put("img", R.drawable.wearl_ankle);
- list.add(map);
- map = new HashMap<String, Object>();
- map.put("title", "G9");
- map.put("info", "google 9");
- map.put("img", R.drawable.wear_breast);
- list.add(map);
- map = new HashMap<String, Object>();
- map.put("title", "G10");
- map.put("info", "google 10");
- map.put("img", R.drawable.wear_wasit);
- list.add(map);
- map = new HashMap<String, Object>();
- map.put("title", "G11");
- map.put("info", "google 11");
- map.put("img", R.drawable.wear_wrist);
- list.add(map);
- map = new HashMap<String, Object>();
- map.put("title", "G12");
- map.put("info", "google 12");
- map.put("img", R.drawable.wearl_ankle);
- list.add(map);
- return list;
- }
- //实现点击整个item时 都会触发单选框的 动作
- @Override
- public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
- // arg0:当前的listview。arg1:当前点击的item的句柄,arg2:当前item在listview中的position
- //arg3:当前listview中行数一般和position相等
- System.out.println("取position和id的值:"+arg2+"--"+arg3);
- ListView lv = (ListView)arg0;
- if(checkedIndex != arg2){
- { //定位到现在处于点击状态的radio
- System.out.println("checkedIndex != arg2");
- int childId = checkedIndex - lv.getFirstVisiblePosition();
- if(childId >= 0){ //如果checked =true的radio在显示的窗口内,改变其状态为false
- View item = lv.getChildAt(childId);
- if(item != null){
- RadioButton rb = (RadioButton)item.findViewById(checkedIndex);
- if(rb != null)
- rb.setChecked(false);
- }
- }
- //将当前点击的radio的checked变为true
- RadioButton rb1 = (RadioButton)arg1.findViewById(arg2);
- if(rb1 != null)
- rb1.setChecked(true);
- checkedIndex = arg2;
- }
- }
- }
- //存放listview中的数据项
- public final class ViewHolder{
- public ImageView img;
- public TextView title;
- public TextView info;
- public RadioButton viewBtn;
- }
- //自定义listview adapter
- public class MyAdapter extends BaseAdapter{
- private LayoutInflater mInflater;
- public MyAdapter(Context context){
- this.mInflater = LayoutInflater.from(context);
- }
- @Override
- public int getCount() {
- // TODO Auto-generated method stub
- return mData.size();
- }
- @Override
- public Object getItem(int arg0) {
- // TODO Auto-generated method stub
- return null;
- }
- @Override
- public long getItemId(int arg0) {
- // TODO Auto-generated method stub
- return 0;
- }
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- ViewHolder holder = null;
- if (convertView == null) {//convertView 存放item的
- holder=new ViewHolder();
- convertView = mInflater.inflate(R.layout.activity_mylistviewwithradio, null);
- holder.img = (ImageView)convertView.findViewById(R.id.img2);
- holder.title = (TextView)convertView.findViewById(R.id.title2);
- holder.info = (TextView)convertView.findViewById(R.id.info2);
- holder.viewBtn = (RadioButton)convertView.findViewById(R.id.listview2_radiobutton);
- convertView.setTag(holder);
- }else {
- holder = (ViewHolder)convertView.getTag();
- }
- holder.img.setBackgroundResource((Integer)mData.get(position).get("img"));
- holder.title.setText((String)mData.get(position).get("title"));
- holder.info.setText((String)mData.get(position).get("info"));
- //让子控件button失去焦点 这样不会覆盖掉item的焦点 否则点击item 不会触发响应即onItemClick失效
- holder.viewBtn.setFocusable(false);//无此句点击item无响应的
- holder.viewBtn.setId(position);
- holder.viewBtn.setChecked(position == checkedIndex);
- holder.viewBtn.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
- @Override
- public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
- if(isChecked){
- //set pre radio button
- if(checkedIndex != -1)
- {
- int childId = checkedIndex - listView.getFirstVisiblePosition();
- if(childId >= 0){
- View item = listView.getChildAt(childId);
- if(item != null){
- RadioButton rb = (RadioButton)item.findViewById(checkedIndex);
- if(rb != null)
- rb.setChecked(false);
- }
- }
- }
- //set cur radio button
- checkedIndex = buttonView.getId();
- }
- }
- });
- return convertView;
- }
- }
- }
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="horizontal"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
- <ImageView android:id="@+id/img2"
- android:layout_width="80dp"
- android:layout_height="wrap_content"
- android:layout_margin="5px"/>
- <LinearLayout android:orientation="vertical"
- android:layout_width="80dp"
- android:layout_height="wrap_content">
- <TextView android:id="@+id/title2"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textSize="22px" />
- <TextView android:id="@+id/info2"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textSize="13px" />
- </LinearLayout>
- <RadioButton
- android:id="@+id/listview2_radiobutton"
- android:layout_width="80dp"
- android:layout_height="wrap_content"
- android:layout_gravity="bottom|right" />
- </LinearLayout>