2012-04-18 32 views
1

如何修改這個imageCheckBoxAdapter代碼,以便在滾動時保持checkBox的狀態(即所有選中的複選框在滾動後都應該保持檢查狀態,並且所選的變量也需要存儲在數組中)?android中的自定義複選框難度

class imageCheckBoxAdapter extends ArrayAdapter<String> 
{ 
private final Context context; 
private final ArrayList<String> values; 
private final Map< String, SmbFile> obj; 
static ArrayList<Boolean> checks=new ArrayList<Boolean>(); 
public imageCheckBoxAdapter(Context context,ArrayList<String> values,Map< String, SmbFile>obj) 
{ 
    super(context, R.layout.row_checkbox, values); 
    this.context = context; 
    this.values = values; 
    this.obj=obj; 
} 
@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    LayoutInflater inflater = (LayoutInflater) context 
     .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View rowView = inflater.inflate(R.layout.row_checkbox, parent, false); 
    TextView textView = (TextView) rowView.findViewById(R.id.text1_check); 
    textView.setText(values.get(position)); 
    ImageView imageView = (ImageView) rowView.findViewById(R.id.icon_image_check); 
    try 
    { 
     if((obj.get(values.get(position)).isFile())) 
     { 
      imageView.setImageResource(R.drawable.view_file_icon); 
     } 
     else 
     { 
      imageView.setImageResource(R.drawable.view_folder_icon); 
     } 
    } 
    catch (SmbException e) 
    { 
     Toast.makeText(context,"Network error",Toast.LENGTH_SHORT).show(); 
     Log.d("id1", "error1"); 
     e.printStackTrace(); 
    } 
    return rowView; 
} 
} 

row_checkbox.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:padding="5dp" > 
    <CheckBox 
    android:id="@+id/checkBox1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:checked="false" /> 
<ImageView 
    android:id="@+id/icon_image_check" 
    android:layout_width="50px" 
    android:layout_height="50px" 
    android:layout_marginLeft="5px" 
    android:layout_marginRight="20px" 
    android:layout_marginTop="5px" 
    android:src="@drawable/view_file_icon" > 
    </ImageView> 
<TextView 
    android:id="@+id/text1_check" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@+id/label" 
    android:textSize="30px" 
    android:typeface="sans"> 
    </TextView> 
</LinearLayout> 

回答

5
class imageCheckBoxAdapter extends ArrayAdapter<String> implements View.onClickListener 
{ 
private final Context context; 
private final ArrayList<String> values; 
private final Map< String, SmbFile> obj; 
private ArrayList<Boolean> checks=new ArrayList<Boolean>(); 
public imageCheckBoxAdapter(Context context,ArrayList<String> values,Map< String, SmbFile>obj) 
{ 
    super(context, R.layout.row_checkbox, values); 
    this.context = context; 
    this.values = values; 
    this.obj=obj; 

    for (int i = 0; i < values.size(); i++) { 
     checks.add(i, false); 
    } 
} 
@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    LayoutInflater inflater = (LayoutInflater) context 
     .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View rowView = inflater.inflate(R.layout.row_checkbox, parent, false); 
    TextView textView = (TextView) rowView.findViewById(R.id.text1_check); 
    CheckBox chk = (CheckBox) rowView.findViewById(R.id.checkBox1); 
    textView.setText(values.get(position)); 
    ImageView imageView = (ImageView) rowView.findViewById(R.id.icon_image_check); 
    try 
    { 
     if((obj.get(values.get(position)).isFile())) 
     { 
      imageView.setImageResource(R.drawable.view_file_icon); 
     } 
     else 
     { 
      imageView.setImageResource(R.drawable.view_folder_icon); 
     } 
    } 
    catch (SmbException e) 
    { 
     Toast.makeText(context,"Network error",Toast.LENGTH_SHORT).show(); 
     Log.d("id1", "error1"); 
     e.printStackTrace(); 
    } 

    chk.setTag(Integer.valueOf(position)); 

    // Set a listener for the checkbox 
    chk.setOnClickListener(this); 

    //Sets the state of CB, since we have the list of checked CB 
    chk.setChecked(checks.get(position)); 

    return rowView; 
} 
    @Override 
    public void onClick(View view) { 
    Integer index = (Integer)view.getTag(); 
    boolean state = checks.get(index.intValue()); 

    checks.set(index.intValue(), !state); 
    } 
} 

如果這可以幫助您,請註明這篇文章作爲一個答案。

謝謝..我建議以上,最好是選擇比onCheckedChangedListener onClickListener因爲在getView我們設置複選框的狀態,因爲我們設置了狀態的複選框的

+0

嗨,這個代碼中使用'狀態'變量是什麼? @Override public void onClick(View view){ Integer index =(Integer)view.getTag(); 布爾狀態= checks.get(index.intValue()); checks.set(index.intValue(),true); } – raghs 2012-04-23 14:58:37

+0

當我試圖從外面讀'檢查'靜態變量時,它會拋出錯誤..爲什麼? – raghs 2012-04-23 15:05:10

+0

不訪問檢查嘗試有一個getter方法的檢查值列表,我編輯我的代碼上面。 – Joey 2012-04-24 09:54:21

0

我覺得你在陣列中需要存儲的值。對於每個複選框,您設置一個changeListener來存儲關聯的複選框。

+0

,onCheckedChange方法,因爲我們的代碼被稱爲用於通過使用數組列表保存複選框的狀態。 當滾動列表視圖時,結果將被污染,因爲複選框的狀態會再次更改 – Joey 2012-04-19 01:45:36

0

我最近讀過,不確定哪裏有人問過類似的情況。

如果我理解正確,這可能是因爲CheckBox控件不是0123B中的數據綁定,並且滾動複選框時會丟失其狀態。

您可以嘗試使用Viewstate來保持檢查值。我會試着找到那篇文章,它似乎很有用。

0

我想你可以通過使用View.setTag方法 讓你的複選框中的getView這樣的參考保存在列表中的複選框的位置:

CheckBox chk = (CheckBox) rowView.findViewById(R.id.checkBox1); 

由於複選框被間接子類看來,它也有一個這樣的屬性View.setTag:

chk.setTag(Integer.valueOf(position)); 

然後一個OnCheckedChangeListener設爲您的CHK像:

chk.setOnCheckedChangeListener(new OnCheckedChangeListener { 
    public void onCheckedChanged(CompoundButton buttonView, boolean state) { 
      Integer int = (Integer)buttonView.getTag(); 

      checks.set(int.intValue(), !boolean) 
    } 
}); 

由於布爾ArrayList的大小是相同的值的大小,指定的位置對應的複選框的確切位置

這個片段然後添加到您的getView方法:

if (checks.get(position)) { 
    chk.setChecked(checks.get(position)); 
    // do some stuff if wanted.. 
} else { 
    chk.setChecked(checks.get(position)); 
    // do some stuff if wanted.. 
} 

我們做了摘錄因爲當listview向上或向下滾動時,getView被稱爲未看見的行項目。並且如果已經檢查或者沒有更新行項目。

如果這可以幫助你,請將此帖標記爲答案。

謝謝..

+0

嗨,joey因爲我是android編程的新手,我發現很難將代碼添加到我的代碼段。所以你可以編輯我的代碼並做改變嗎? – raghs 2012-04-19 11:05:03

+0

嗨,我無法提問。他們阻止我提出問題,所以我使用元堆棧溢出來提問我的問題。請通過我的問題並回答它。請快速發送你的回覆。其緊急爲我的項目 – raghs 2012-04-30 06:46:26