2014-02-27 22 views
0

我有一個listview與複選框,每當用戶按下複選框我收到一些用戶信息(例如說facebook的個人資料ID) 並存儲在arraylist.Now是什麼問題是每當用戶滾動列表視圖一些其它的配置文件ID的也被添加或附加地eventhough除去它 不marked.so它提供Listview複選框數組索引出界限異常

數組索引出界的異常

我試圖理清問題但我無法做到這一點,請provi給我一些解決方案。

這裏是我的完整列表視圖

public class MyComposeListItemAdapter extends ArrayAdapter { 

public Context mContext; 
int row; 
public List<MyComposeObject> arrayList;  
public ImageLoader imageLoader;  
private static LayoutInflater inflater=null;  

/* 
* Create an ArrayList of Boolean Object to store the state of the each CheckBox 
* Initializes the ArrayList items to default value false, means no CheckBox is checked yet. 
* When you click on CheckBox. Set a check against Checked/Unchecked state and store that value in ArrayList. 
* Now set that position to CheckBox using setChecked() method.*/ 

private ArrayList<Boolean> itemChecked = new ArrayList<Boolean>(); 

// for radio button 
private RadioButton mCurrentlyCheckedRB; 
private boolean userSelected = false; 
private int mResourceId = 0; 
private RadioButton mSelectedRB; 
private int mSelectedPosition = -1;// 

public static List<String> selected_profileid =new ArrayList<String>(); 
public static List<String> selected_profiletype =new ArrayList<String>(); 

public MyComposeListItemAdapter(Context context, int resource) { 
    super(context, resource); 
    // TODO Auto-generated constructor stub 

    this.mContext = context; 
    this.row = resource; 
    arrayList = (ArrayList<MyComposeObject>) Woosuite_Login.composeObjectslist; 
// System.out.println("arrayList2"+arrayList.size());  
    imageLoader=new ImageLoader(context);  
    for (int i = 0; i < this.getCount(); i++) { 
     itemChecked.add(i, false); // initializes all items value with false 
     }  
} 
@Override 
public Context getContext() { 
    // TODO Auto-generated method stub 
    return mContext; 
} 
@Override 
public int getCount() { 
    // TODO Auto-generated method stub 
    return arrayList.size(); 
} 
@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    // TODO Auto-generated method stub 
    ViewHolder holder; 

    if (convertView == null) { 
     LayoutInflater inflater = (LayoutInflater) mContext 
       .getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
     convertView = inflater.inflate(row, null); 
     holder = new ViewHolder(); 
     convertView.setTag(holder); 
    } else 
     holder = (ViewHolder) convertView.getTag(); 

    holder.userimage_ImageView=(ImageView) convertView.findViewById(R.id.imageView666); 
    holder.username_TextView=(TextView) convertView.findViewById(R.id.textView666); 
    holder.checkBox=(CheckBox) convertView.findViewById(R.id.checkBox666); 
    holder.radioButton=(RadioButton) convertView.findViewById(R.id.radio666); 

     holder.checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() { 

      @Override 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
       // TODO Auto-generated method stub 

       if(isChecked){                 
        itemChecked.set(position, true); 

        selected_profileid.add(arrayList.get(position).getCom_profileId()); 
        System.out.println("add selected_profileid "+selected_profileid); 

        selected_profiletype.add(arrayList.get(position).getCom_profileType()); 
        System.out.println("add selected_profiletype.size(); "+selected_profiletype); 

       }else{ 

        selected_profiletype.remove(arrayList.get(mposition).getCom_profileType()); 
        System.out.println("remove selected_profileid "+selected_profileid); 

        selected_profileid.remove(arrayList.get(mposition).getCom_profileId()); 
        System.out.println("remove selected_profiletype.size(); "+selected_profiletype); 
       } 
      } 
     });  

    if(arrayList.get(position).getCom_ProfileImgUrl()!=null){      
     imageLoader.DisplayImage(arrayList.get(position).getCom_ProfileImgUrl(), holder.userimage_ImageView);   

    }else{ 
     holder.userimage_ImageView.setImageResource(R.drawable.fb); 
    } 

    if(arrayList.get(position).getCom_ProfileName()!=null){ 
     holder.username_TextView.setText(arrayList.get(position).getCom_ProfileName()); 
    } 

    holder.checkBox.setChecked(itemChecked.get(position)); 
    return convertView; 
} 

private static class ViewHolder { 

    ImageView userimage_ImageView; 
    TextView username_TextView; 
    CheckBox checkBox; 
    RadioButton radioButton; 
} 
} 
+0

您將哪些方法添加到適配器滾動? – Apoorv

+0

它已經知道了,請檢查它在布爾真正的部分 – Androidcuckoo

+0

我想添加它的個人資料ID和配置文件類型,如果複選框被點擊並需要刪除相同的複選框未選中 – Androidcuckoo

回答

1

請添加以下代碼,並再次運行它,並告訴我logcat的輸出:

[...] 
@Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      // TODO Auto-generated method stub 
      if(position >= getCount()) { 
       System.out.println("Error: position '"+position+"' is out of bounds in 'arrayList'"); 
       return; 
      } 
[...] 

防止重複列表中的條目:

if(!myList.contains(objectToInsert) { 
    myList.add(objectToInsert); 
} 
+0

海這裏問題是我添加配置文件ID的裏面複選框,這意味着什麼時候它點擊那麼只有它會添加,但這裏發生了什麼是每當我滾動listview它的添加,它將如何進入複選框偵聽器而不點擊複選框 – Androidcuckoo

+0

因此,請嘗試我的代碼,以您的示例上面,它不可能幫助,因爲我們無法看到課外發生了什麼 – alex

+0

它不在logcat中打印,因爲條件總是變得虛假 – Androidcuckoo