Android自帶的RadioButton單選框隻支援添加文字,我們自己寫Adapter實作自定義的RadioButton
首先item的XML源碼
search_user_item.xml (現在隻是文字+單選按鈕+自定義背景,可以根據需要随意擴充)
[html] view plaincopy
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns: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_marginLeft="10dp" />
- </LinearLayout>
Listview就是用系統自帶的
- <ListView
- android:id="@+id/search_user_list"
- 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 plaincopy
- package ouc.sei.suxin.android.ui.adapter;
- import java.util.HashMap;
- import java.util.List;
- import ouc.sei.suxin.R;
- import android.content.Context;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.view.ViewGroup;
- import android.widget.BaseAdapter;
- import android.widget.LinearLayout;
- import android.widget.RadioButton;
- import android.widget.TextView;
- public class SearchUserAdapter extends BaseAdapter {
- private Context context;
- private List<String> userList;
- HashMap<String,Boolean> states=new HashMap<String,Boolean>();//用于記錄每個RadioButton的狀态,并保證隻可選一個
- public SearchUserAdapter(Context context, List<String> userList)
- {
- this.context = context;
- this.userList= userList;
- }
- @Override
- public int getCount() {
- return userList.size();
- public Object getItem(int position) {
- return userList.get(position);
- public long getItemId(int position) {
- return position;
- public View getView(final int position, View convertView, ViewGroup parent) {
- ViewHolder holder;
- if (convertView == null) {
- convertView = LayoutInflater.from(context).inflate(R.layout.search_user_item, null);
- holder = new ViewHolder();
- 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();
- }
- final RadioButton radio=(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);
- }
- else if(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(new View.OnClickListener() {
- public void onClick(View v) {
- //重置,確定最多隻有一項被選中
- for(String key:states.keySet()){
- states.put(key, false);
- }
- states.put(String.valueOf(position), radio.isChecked());
- SearchUserAdapter.this.notifyDataSetChanged();
- }
- });
- boolean res=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);
- return convertView;
- static class ViewHolder {
- LinearLayout background;
- TextView userName;
- RadioButton rdBtn;
List适配代碼(與一般無異):
- adapter = new SearchUserAdapter(this, searchUserList);
- searchUserLV.setAdapter(adapter);
- searchUserLV.setVisibility(View.VISIBLE);
- setListViewHeightBasedOnChildren(searchUserLV);
這裡還根據内容動态設定了一下,具體函數如下:
- public void setListViewHeightBasedOnChildren(ListView listView) {
- Adapter listAdapter = listView.getAdapter();
- if (listAdapter == null) {
- return;
- int totalHeight = 0;
- int viewCount = listAdapter.getCount();
- for (int i = 0; i < viewCount; i++) {
- View listItem = listAdapter.getView(i, null, listView);
- listItem.measure(0, 0);
- totalHeight += listItem.getMeasuredHeight();
- ViewGroup.LayoutParams params = listView.getLayoutParams();
- params.height = totalHeight
- + (listView.getDividerHeight() * (listAdapter.getCount()-1)) + 10;//加10是為了适配自定義背景
- listView.setLayoutParams(params);
當需要擷取ListView中RadioButton的選擇狀态時,可以直接看Adapter中的states,具體如下:
- // 根據RadioButton的選擇情況确定使用者名
- for (int i = 0, j = searchUserLV.getCount(); i < j; i++) {
- View child = searchUserLV.getChildAt(i);
- RadioButton rdoBtn = (RadioButton) child
- .findViewById(R.id.radio_btn);
- if (rdoBtn.isChecked())
- searchUser = searchUserList.get(i);
這裡的searchUserList是調用背景服務擷取的使用者名清單,通過states擷取選中使用者名進行後續操作
效果圖:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5iNwcTZhVTZlRDZlFWYiRGZzETMmRTY3YzY2IWYwEWZk9CXzAzLchDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL0M3Lc9CX6MHc0RHaiojIsJye.png)