天天看點

【轉】ListView與RadioButton組合——自定義單選清單

Android自帶的RadioButton單選框隻支援添加文字,我們自己寫Adapter實作自定義的RadioButton

首先item的XML源碼

search_user_item.xml (現在隻是文字+單選按鈕+自定義背景,可以根據需要随意擴充)

[html] ​​view plain​​​​copy​​

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:id="@+id/search_user_list_item"  
  4.     android:layout_width="fill_parent"  
  5.     android:layout_height="30dp"  
  6.     android:layout_marginBottom="10dp"  
  7.     android:layout_marginTop="10dp"  
  8.     android:background="@drawable/more_item_press"  
  9.     android:gravity="center_vertical"  
  10.     android:orientation="horizontal" >  
  11.     <TextView  
  12.         android:id="@+id/search_user_name"  
  13.         android:layout_width="200dp"  
  14.         android:layout_height="wrap_content"  
  15.         android:layout_marginLeft="30dp"  
  16.         android:gravity="left"  
  17.         android:textColor="@android:color/black"  
  18.         android:textSize="16sp" />  
  19.     <RadioButton  
  20.         android:id="@+id/radio_btn"  
  21.         android:layout_width="wrap_content"  
  22.         android:layout_marginLeft="10dp" />  
  23. </LinearLayout>  

Listview就是用系統自帶的

  1. <ListView  
  2.     android:id="@+id/search_user_list"  
  3.     android:layout_height="200dp"  
  4.     android:layout_marginLeft="5dp"  
  5.     android:layout_marginRight="5dp"  
  6.     android:paddingBottom="5dp"  
  7.     android:cacheColorHint="@android:color/transparent"  
  8.     android:divider="@null"  
  9.     android:listSelector="@android:color/transparent"  
  10.     android:visibility="gone" >  
  11. </ListView>  

再來是Adapter代碼

SearchUserAdapter.java (具體改動寫在代碼注釋裡面)

[java] ​​view plain​​​​copy​​

  1. package ouc.sei.suxin.android.ui.adapter;  
  2. import java.util.HashMap;  
  3. import java.util.List;  
  4. import ouc.sei.suxin.R;  
  5. import android.content.Context;  
  6. import android.view.LayoutInflater;  
  7. import android.view.View;  
  8. import android.view.ViewGroup;  
  9. import android.widget.BaseAdapter;  
  10. import android.widget.LinearLayout;  
  11. import android.widget.RadioButton;  
  12. import android.widget.TextView;  
  13. public class SearchUserAdapter extends BaseAdapter {  
  14.     private Context context;  
  15.     private List<String> userList;  
  16.     HashMap<String,Boolean> states=new HashMap<String,Boolean>();//用于記錄每個RadioButton的狀态,并保證隻可選一個  
  1. public SearchUserAdapter(Context context, List<String> userList)  
  2. {  
  3.     this.context = context;  
  4.     this.userList= userList;  
  5. }  
  6. @Override  
  7. public int getCount() {  
  8.     return userList.size();  
  9. public Object getItem(int position) {  
  10.     return userList.get(position);  
  11. public long getItemId(int position) {  
  12.     return position;  
  13. public View getView(final int position, View convertView, ViewGroup parent) {  
  14.     ViewHolder holder;  
  15.     if (convertView == null) {  
  16.         convertView = LayoutInflater.from(context).inflate(R.layout.search_user_item, null);  
  17.         holder = new ViewHolder();  
  18.         holder.background = (LinearLayout) convertView.findViewById(R.id.search_user_list_item);  
  19.         holder.userName = (TextView) convertView.findViewById(R.id.search_user_name);  
  20.         convertView.setTag(holder);  
  21.     }else{  
  22.         holder=(ViewHolder) convertView.getTag();  
  23.     }  
  24.        final RadioButton radio=(RadioButton) convertView.findViewById(R.id.radio_btn);  
  25.     holder.rdBtn = radio;  
  26.     holder.userName.setText(userList.get(position));  
  27.     //根據Item位置配置設定不同背景          
  28.     if(userList.size() > 0)  
  29.     {  
  30.         if(userList.size() == 1)  
  31.         {  
  32.             holder.background.setBackgroundResource(R.drawable.more_item_press);  
  33.         }  
  34.         else{  
  35.             if(position == 0){  
  36.                 holder.background.setBackgroundResource(R.drawable.more_itemtop_press);  
  37.             }  
  38.             else if(position == userList.size()-1){  
  39.                 holder.background.setBackgroundResource(R.drawable.more_itembottom_press);  
  40.             else{  
  41.                 holder.background.setBackgroundResource(R.drawable.more_itemmiddle_press);  
  42. //當RadioButton被選中時,将其狀态記錄進States中,并更新其他RadioButton的狀态使它們不被選中      
  43.        holder.rdBtn.setOnClickListener(new View.OnClickListener() {  
  44.            public void onClick(View v) {  
  45.                //重置,確定最多隻有一項被選中  
  46.                for(String key:states.keySet()){  
  47.                    states.put(key, false);  
  48.                }  
  49.                states.put(String.valueOf(position), radio.isChecked());  
  50.                SearchUserAdapter.this.notifyDataSetChanged();  
  51.            }  
  52.        });  
  53.        boolean res=false;  
  54.        if(states.get(String.valueOf(position)) == null || states.get(String.valueOf(position))== false){  
  55.            res=false;  
  56.            states.put(String.valueOf(position), false);  
  57.        }  
  58.        else  
  59.            res = true;  
  60.        holder.rdBtn.setChecked(res);  
  61.     return convertView;  
  62. static class ViewHolder {  
  63.    LinearLayout background;  
  64.           TextView userName;  
  65.           RadioButton rdBtn;  

List适配代碼(與一般無異):

  1. adapter = new SearchUserAdapter(this, searchUserList);  
  2. searchUserLV.setAdapter(adapter);  
  3. searchUserLV.setVisibility(View.VISIBLE);  
  4. setListViewHeightBasedOnChildren(searchUserLV);  

這裡還根據内容動态設定了一下,具體函數如下:

  1. public void setListViewHeightBasedOnChildren(ListView listView) {  
  2.     Adapter listAdapter = listView.getAdapter();  
  3.     if (listAdapter == null) {  
  4.         return;  
  5.     int totalHeight = 0;  
  6.     int viewCount = listAdapter.getCount();  
  7.     for (int i = 0; i < viewCount; i++) {  
  8.         View listItem = listAdapter.getView(i, null, listView);  
  9.         listItem.measure(0, 0);  
  10.         totalHeight += listItem.getMeasuredHeight();  
  11.     ViewGroup.LayoutParams params = listView.getLayoutParams();  
  12.     params.height = totalHeight  
  13.             + (listView.getDividerHeight() * (listAdapter.getCount()-1)) + 10;//加10是為了适配自定義背景  
  14.     listView.setLayoutParams(params);  

當需要擷取ListView中RadioButton的選擇狀态時,可以直接看Adapter中的states,具體如下:

  1. // 根據RadioButton的選擇情況确定使用者名  
  2. for (int i = 0, j = searchUserLV.getCount(); i < j; i++) {  
  3.     View child = searchUserLV.getChildAt(i);  
  4.     RadioButton rdoBtn = (RadioButton) child  
  5.             .findViewById(R.id.radio_btn);  
  6.     if (rdoBtn.isChecked())  
  7.         searchUser = searchUserList.get(i);  

這裡的searchUserList是調用背景服務擷取的使用者名清單,通過states擷取選中使用者名進行後續操作

效果圖:

【轉】ListView與RadioButton組合——自定義單選清單