2011-04-13 25 views
0

我有一個奇怪的問題。Android - 自定義列表視圖適配器中的複選框的奇怪問題?

我工作的這一個按鍵,並與複選框列表視圖(每個列表項目之一)和功能要求,每當我在此按鈕上單擊,從檢查列表中的項目應該被刪除一個應用程序。我使用布爾類型Arraylist在我的自定義ListView適配器中保存了複選框的狀態,並試圖在我的主要活動中訪問它,但問題是每當我單擊Button時,它都不會刪除選中的項目,而是將刪除項目的確切數量作爲選中的項目從List的底部開始。

這裏是我的自定義接口的代碼 -

public class IconAdapter extends BaseAdapter 
{ 
private Activity activity; 
private Object[] data; 
private ArrayList<HashMap<String,String>> listItems; 
public static LayoutInflater inflater = null; 
private PackageManager pm; 
public ArrayList<Boolean> itemChecked = new ArrayList<Boolean>(); 
private ArrayList<String> itemSelected = new ArrayList<String>(); 
private ArrayList<TextView> ctv = new ArrayList<TextView>(); 
private int posi; 
private String pkg; 

public IconAdapter(Activity a, ArrayList<HashMap<String,String>> items) 
{ 
    activity = a; 
    listItems = items; 
    data = items.toArray(); 
    inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    pm = a.getPackageManager(); 
    for(int i = 0; i < items.size(); i++) 
    { 
     itemChecked.add(i,false); 
    } 
    for(int i = 0; i < items.size(); i++) 
    { 
     itemSelected.add(i," "); 
    } 

} 

public int getCount() { 
    return listItems.size(); 
} 

public Object getItem(int position) { 
    return position; 
} 

public long getItemId(int position) { 
    return position; 
} 

public static class ViewHolder{ 
    public TextView textView; 
    public ImageView imageView; 
    public CheckBox checkBox; 
} 

public View getView(final int position, View convertView, ViewGroup parent) 
{ 
    View row = convertView; 
    ViewHolder holder; 

    if(row==null) 
    { 
     row = inflater.inflate(R.layout.item, parent, false); 
     holder = new ViewHolder(); 
     holder.textView = (TextView)row.findViewById(R.id.text1); 
     holder.imageView = (ImageView)row.findViewById(R.id.image); 
     holder.checkBox = (CheckBox)row.findViewById(R.id.check); 
     row.setTag(holder); 
    } 
    else 
    { 
     holder = (ViewHolder) row.getTag(); 
    } 


    String s = data[position].toString(); 
    String[] tokens = s.split(","); 
    String[] mToken = tokens[0].split("="); 
    String taskName = mToken[1]; 
    String[] mTokens = tokens[1].split("="); 
    final String pkgName = mTokens[1].substring(0, (mTokens[1].length() - 1)); 


    holder.textView.setText(taskName); 
    holder.textView.setTag(pkgName); 


    holder.checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() { 
     public void onCheckedChanged(CompoundButton button, boolean b) { 

        if (b) 
        { 
         itemChecked.set(position, true); 
         itemSelected.set(position, pkgName); 

        } 
        else 
        { 
         itemChecked.set(position, false); 


        } 


     } 
    }); 

    holder.checkBox.setChecked(itemChecked.get(position)); 


    try{ 
     Drawable icon = pm.getApplicationIcon(pkgName); 
     holder.imageView.setImageDrawable(icon); 
    } 
    catch (PackageManager.NameNotFoundException ne) 
    { 

    } 

    return row; 
} 




public String getPkgName(int position) 
{ 
    return itemSelected.get(position); 
} 
public void setItemChecked(boolean isChecked) 
{ 

} 
} 

第二,這裏是我的onClick代碼 -

public void onClick(View view) 
{ 
    int size = icon.getCount(); 
    for(int i = size-1; i >= 0; i--) 
    { 
     if(icon.itemChecked.get(i)) 
     { 
      list.remove(i); 
     } 
    } 
    icon.notifyDataSetChanged(); 
} 

,它也給我一個IOOBException一段時間。

請幫忙。

+0

那是一個徹頭徹尾的,身體的異常? :D – rajath 2011-04-13 12:42:31

+0

@Rajath沒有那是一個IndexOutOfBoundException。 – Varundroid 2011-04-13 12:53:22

回答

1

您的onClick代碼是錯誤的,因爲在list.remove(i)之後您得到了size = size-1,但您仍然認爲它是不變的。你需要重寫你的刪除循環。另外,你必須認識到,當你做remove,什麼也不做你的迭代指數i,你跳過了1個項目(這是坐落取出一個一前一後)。

+0

的for(int i =大小-1; I> = 0;我 - ) 我重寫它和IOOBException是不存在任何更多但對於從底部移除項目????那仍然是我的主要錯誤。任何想法?解? – Varundroid 2011-04-13 12:57:45

+0

只是一個猜測:嘗試移動'icon.notifyDataSetChanged();'從環路:'用於(INT I =大小-1; I> = 0;我 - ) { 如果(icon.itemChecked.get( i)) { list.remove(i); }} icon.notifyDataSetChanged();' 它可以調用'getView'將與新的位置,可能導​​致衝突重置'onCheckedChangeListener'。 – ernazm 2011-04-13 13:12:39

+0

@ user639183它不會工作或者因爲你建議我做同樣的事情,所以只是爲了調試目的,我把它放在循環中。 :( – Varundroid 2011-04-13 13:16:19

相關問題