hyljava

          ListView實現RadioButton的功能有bug改進

          前言:之前做的ListView實現RadioButton的功能有bug,當ListView控件的內容超出屏幕可見區域時,滑動ListView控件會報錯,下面有為什么出錯和解決方法進行的注解,不多說了,看源碼,有更好的解決辦法請指教

          1,MainActivity.java

          package com.excetop.listradio;

          import android.app.Activity;
          import android.os.Bundle;
          import android.util.Log;
          import android.view.View;
          import android.view.ViewGroup;
          import android.widget.BaseAdapter;
          import android.widget.Button;
          import android.widget.CompoundButton;
          import android.widget.ListView;
          import android.widget.RadioButton;
          import android.widget.CompoundButton.OnCheckedChangeListener;

          public class MainActivity extends Activity {
              private static final String TAG = "MainActivity";
              private ListView listView;
              @Override
              public void onCreate(Bundle savedInstanceState) {
                  super.onCreate(savedInstanceState);
                  setContentView(R.layout.main);
                  listView = (ListView) this.findViewById(R.id.list);
                  MyAdapter adapter = new MyAdapter();
                  listView.setAdapter(adapter);
              }
              private class MyAdapter extends BaseAdapter{
                  private String[] s = new String[]{"a","b","c","d","e","a","b","c","d","e","a","b","c","d","e","a","b","c","d","e"};
                  private int temp = -1;

                  @Override
                  public int getCount() {
                      // TODO Auto-generated method stub
                      return s.length;
                  }

                  @Override
                  public Object getItem(int position) {
                      // TODO Auto-generated method stub
                      return null;
                  }

                  @Override
                  public long getItemId(int position) {
                      // TODO Auto-generated method stub
                      return 0;
                  }

                  @Override
                  public View getView(int position, View convertView, ViewGroup parent) {
                      convertView = MainActivity.this.getLayoutInflater().inflate(R.layout.item, null);  //解決辦法: 每次都重新獲取View
                      Button button = (Button) convertView.findViewById(R.id.button);
                      button.setText(s[position]);
                      RadioButton radioButton = (RadioButton) convertView.findViewById(R.id.radioButton);
                      radioButton.setId(position);  //把position設為radioButton的id
                      radioButton.setOnCheckedChangeListener(new OnCheckedChangeListener() {
                          
                          @Override
                          public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                              
                              if(isChecked){
                                  //這段代碼來實現單選功能
                                  if(temp != -1){
                                      RadioButton tempButton = (RadioButton) MainActivity.this.findViewById(temp);
                                      if(tempButton != null){
                                         tempButton.setChecked(false);
                                      }
                                      
                                  }
                                  
                                  temp = buttonView.getId();
                                  Log.i(TAG,"you are women- -   " + isChecked + "   " + temp);
                                  
                              }
                          }
                      });
                      
                      //這里實現單選框選的回顯,解決了單選框移出屏幕范圍未選中狀態
                      if(temp == position){
                          radioButton.setChecked(true);
                      }
                      return convertView;
                  }
          //            Holder holder;
          //            if(convertView == null){    //1,當第一次加載ListView控件時  convertView為空 
          //                convertView = MainActivity.this.getLayoutInflater().inflate(R.layout.item, null); //所以當ListView控件沒有滑動時都會執行這條語句
          //                holder = new Holder();
          //                convertView.setTag(holder);
          //            }else{
          //                holder = (Holder) convertView.getTag();
          //            }
          //            
          //            holder.button = (Button) convertView.findViewById(R.id.button);
          //            holder.button.setText(s[position]);
          //            
          //            holder.radioButton = (RadioButton) convertView.findViewById(R.id.radioButton);   //
          //            holder.radioButton.setId(position);  //2,因為這里對radioButton的id進行重新設置,滑動ListView時convertView不為空,上面的語句就沒法得到radioButton對象,這條語句就會報空指針異常
                    
          //            holder.radioButton.setOnCheckedChangeListener(new OnCheckedChangeListener() {
          //                
          //                @Override
          //                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
          //                    
          //                    if(isChecked){
          //                        if(temp != -1){
          //                            RadioButton tempButton = (RadioButton) MainActivity.this.findViewById(temp);
          //                            tempButton.setChecked(false);
          //                            
          //                        }
          //                        
          //                        temp = buttonView.getId();
          //                        Log.i(TAG,"you are women- -   " + isChecked + "   " + temp);
          //                        
          //                    }
          //                }
          //            });
          //            return convertView;
          //        }
          //        private class Holder{
          //            private Button button;
          //            private RadioButton radioButton;
          //        }
              }
          }

          2,item.xml

          <?xml version="1.0" encoding="utf-8"?>
          <LinearLayout
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
            <Button
              android:id="@+id/button"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:text="測試">
            
            </Button>
            
            <RadioButton
              android:id="@+id/radioButton"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              />  
           
          </LinearLayout>
          3, main.xml

          <?xml version="1.0" encoding="utf-8"?>
          <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              >
          <TextView  
              android:layout_width="fill_parent" 
              android:layout_height="wrap_content" 
              android:text="@string/hello"
              />
              <ListView
                 android:id="@+id/list"
                 android:layout_width="fill_parent"
                 android:layout_height="fill_parent"
                 />
          </LinearLayout>

          posted on 2014-02-22 22:58 何云隆 閱讀(258) 評論(0)  編輯  收藏 所屬分類: Android

          主站蜘蛛池模板: 肇州县| 苗栗市| 望江县| 双流县| 武义县| 阳西县| 昌吉市| 林芝县| 白河县| 万源市| 营山县| 彭泽县| 九龙城区| 互助| 莫力| 天柱县| 屏南县| 阜南县| 永昌县| 孝昌县| 中卫市| 平邑县| 阿克| 蒙山县| 石景山区| 嘉禾县| 喀什市| 德兴市| 安福县| 安多县| 若羌县| 武川县| 巴林左旗| 普宁市| 淳化县| 武功县| 平塘县| 新野县| 肇庆市| 肇东市| 稷山县|