2012-04-18 18 views
1

この画像を変更する方法CheckBoxAdapterコードは、スクロール時にチェックボックスのステータスを維持するために使用されます(スクロールした後でもチェックボックスをオンにしておく必要があります)。 )?カスタムチェックボックス難易度アンドロイド

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); 
    } 
} 

これがあなたを助けている場合、答えとしてこのポストをマークしてください。 getViewメソッドで、我々は、チェックボックスの状態を設定しているため、我々はチェックボックスの状態を設定しているので、onCheckedChangedListenerよりonClickListener選択する方が良い上に私の提案に

+0

こんにちは、このコードで '状態'変数の使用は何ですか? @Override public void onClick(ビュー表示){ 整数インデックス=(整数)view.getTag(); ブール状態= checks.get(index.intValue()); checks.set(index.intValue()、true); } – raghs

+0

と私は外部から 'チェック'静的変数を読み取ろうとすると、それはエラーをスローする..なぜ? – raghs

+0

チェックにアクセスしていないチェック値のリストのゲッターメソッドを持っていると上記の私のコードを編集します。 – Joey

0

は、私は、配列に値を格納するためにあなたの必要性を考えます。各checkBoxに対して、関連付けられたcheckBoxを格納するようにchangeListenerを設定します。

+0

、onCheckedChange方法は、我々のコードので、呼び出されます

おかげで.. arraylistを使用してチェックボックスの状態を保存するために使用します。 リストビューがスクロールされると、チェックボックスの状態が再び変更されるため、結果が汚染されます – Joey

0

私は最近、誰かが尋ねた似たようなケースがどこにあるのかはまだわかりません。

私が正しく理解しているのは、コントロールがDataRepeaterItemにデータバインディングされていないためで、チェックボックスをスクロールすると状態が失われたためです。

Viewstateを使用してチェック値を維持することができます。私はそのポストを見つけることを試みる、それは有益だったようだ。チェックボックス以来

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

はの間接的なサブクラスです:

0

は、私はあなたがこのようなgetViewメソッドであなたのチェックボックスの参照を作る View.setTagメソッドを使用して、リスト内のチェックボックスの位置を保存することができると思います

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

はその後のようなあなたのCHKにOnCheckedChangeListenerを設定します。ビューは、それはまた、このような属性を持っていView.setTagブール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.. 
} 

我々はスニペットをしましたリストビューが上下にスクロールされると、見えない行項目に対してgetViewが呼び出されるためです。チェックされている場合は行項目を更新します。

これが役立つ場合は、この投稿を回答としてマークしてください。

おかげ..

+0

こんにちは、私はアンドロイドプログラミングの初心者ですから、あなたのコードをコードスニペットに追加するのが難しいと思っています。だから、私のコードを編集して変更してください。 – raghs

+0

こんにちは、私は質問をすることができません。彼らは私の質問をするためにメタスタックのオーバーフローを使用しているので、私は質問をするのを妨げている。私の質問を通過し、それに答えてください。すぐにur応答を送ってください。私のプロジェクトのための緊急の – raghs