直接上代码:
public class MyListView extends Activity implements OnItemClickListener {
private ListView mListView;
private List<Map<String, String>> list;
private ListViewAdapter mListViewAdapter;
/**
* 下面两行是模拟数据,当然可以由自己决定传什么值。
*/
private String[] itemName = { "北京", "南京", "东京","费城", "槟城", "上海" };
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.list_view);
list = new ArrayList<Map<String, String>>();
for (int i = 0; i < 6; i++) {
Map<String, String> map = new HashMap<String, String>();
map.put("Name", itemName[i]);
list.add(map);
}
mListView = (ListView) this.findViewById(R.id.listView);
mListViewAdapter = new ListViewAdapter(this, list);
mListView.setAdapter(mListViewAdapter);
mListView.setOnItemClickListener(this);
//自定义回调函数
mListViewAdapter.setOncheckChanged(new OnMyCheckChangedListener() {
@Override
public void setSelectID(int selectID) {
mListViewAdapter.setSelectID(selectID); //选中位置
mListViewAdapter.notifyDataSetChanged(); //刷新适配器
}
});
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
mListViewAdapter.setSelectID(position); //选中位置
mListViewAdapter.notifyDataSetChanged(); //刷新适配器
}
}
对应的适配器
public class ListViewAdapter extends BaseAdapter {
private List<Map<String, String>> list;
private Context context;
// 构造函数,用作初始化各项数据
public ListViewAdapter(Context context, List<Map<String, String>> list) {
this.context = context;
this.list = list;
}
// 获取ListView的item总数
public int getCount() {
return list.size();
}
// 获取ListView的item
public Object getItem(int position) {
return getItem(position);
}
// 获取ListView的item的ID
public long getItemId(int position) {
return position;
}
// 获取item的视图及其中含有的操作
public View getView(final int position, View convertView, ViewGroup parent) {
ViewCache viewCache;
if (convertView == null) {
viewCache = new ViewCache();
convertView = LayoutInflater.from(context).inflate(R.layout.list_item, null);
viewCache.itemName = (TextView) convertView.findViewById(R.id.name);
viewCache.radioBtn = (RadioButton) convertView.findViewById(R.id.radioBtn);
convertView.setTag(viewCache);
} else {
viewCache = (ViewCache) convertView.getTag();
}
viewCache.itemName.setText(list.get(position).get("Name"));
// 核心方法,判断单选按钮被按下的位置与之前的位置是否相等,然后做相应的操作。
if (selectID == position) {
viewCache.radioBtn.setChecked(true);
} else {
viewCache.radioBtn.setChecked(false);
}
// 单选按钮的点击事件监听
viewCache.radioBtn.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// 这一句的意思跟下面的一样,不过这个是itemClick的点击监听,而下面的是RadioButton的点击监听。
selectID = position;
/**
* 在MyListView中使用mListViewAdapter.setOncheckChanged
* 来监听RadioButton的点击事件,(当然,首先要判空)
* 当我们按下单选按钮时,我们把按下的item的位置赋值给selectID
* ,然后在上面的if语句中判断当前点击的位置与selectID的位置
* 是否相等,如果不相等,那么说明按下了新的位置,那么就把原来位置上的选择取消掉, 在新的位置让单选按钮显示选中状态就可以了。
*/
if (mCheckChange != null)
mCheckChange.setSelectID(selectID);
}
});
return convertView;
}
private int selectID;
private OnMyCheckChangedListener mCheckChange;
// 回调函数,很类似OnClickListener吧
public void setOncheckChanged(OnMyCheckChangedListener l) {
mCheckChange = l;
}
// 自定义的选中方法
public void setSelectID(int position) {
selectID = position;
}
// 回調接口
public interface OnMyCheckChangedListener {
void setSelectID(int selectID);
}
// 缓存类
class ViewCache {
TextView itemName;
RadioButton radioBtn;
}
}
list_view.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
list_item.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/item_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="horizontal" >
<TextView
android:id="@+id/name"
android:layout_width="150dip"
android:layout_height="wrap_content"
android:text="@string/name" />
<RadioButton
android:id="@+id/radioBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:focusable="false" />
</LinearLayout>
到此基本上就实现这个功能了,当然还有很多种方法,这只是其中一种。