2012-04-18 2 views
1

이 이미지를 수정하는 방법 CheckBoxAdapter 코드는 스크롤 할 때 checkBox의 상태를 유지하기 위해 (즉, 체크 된 모든 체크 박스는 스크롤 한 후에도 체크되어야한다.) 또한 체크 된 변수는 배열에 저장되어야한다.)?안드로이드의 사용자 정의 체크 상자 난이도

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 공개 무효 onClick (보기보기) { 정수 인덱스 = (정수) view.getTag(); 부울 상태 = checks.get (index.intValue()); checks.set (index.intValue(), true); } – raghs

+0

외부에서 '수표'정적 변수를 읽으려고하면 오류가 발생합니다 .. 왜? – raghs

+0

수표에 액세스하지 않으면 수표 값 목록에 대한 getter 메서드가 있고 위 코드를 편집합니다. – Joey

0

나는 배열에 저장 값으로 당신의 필요를 생각한다. 각 checkBox에 대해 연관된 checkBox를 저장하도록 changeListener를 설정합니다.

+0

, onCheckedChange 방법은 우리의 코드부터 호출 될

감사합니다 .. arraylist를 사용하여 체크 박스의 상태를 저장하는 데 사용합니다. 목록보기가 스크롤 될 때 체크 박스의 상태가 다시 변경되므로 결과가 오염 될 것입니다. – Joey

0

나는 최근에 누군가가 물었던 유사한 사례를 이미 읽었는지 모르겠다.

정확하게 이해하면 DataRepeaterItemCheckBox 컨트롤이 데이터 바인딩되지 않았고 체크 상자를 스크롤하면 상태가 사라질 수 있습니다.

Viewstate을 사용해 확인 된 값을 유지할 수 있습니다. 나는 그 지위를 발견하려고 노력할 것이다, 유익한 것처럼 보였다. 확인란 이후

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

는 간접적 인 서브 클래스 :

0

나는이 같은의 getView에서 체크 박스의 기준을 View.setTag 방법을 사용하여 목록에서 체크 박스의 위치를 ​​저장할 수 있다고 생각

:

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

그런 다음처럼 CHK에 OnCheckedChangeListener을 설정보기, 그것은 또한이 같은 속성 View.setTag있다

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.. 
} 

우리는 조각을했다 : 부울 ArrayList의 크기가 값의 크기에 동일하기 때문에

는 지정된 위치는

그런 다음 당신의 getView 방법이 조각을 추가 확인란의 정확한 위치를 대응 listview가 위 또는 아래로 스크롤 될 때 보이지 않는 행 항목에 대해 getView가 호출되기 때문입니다. 그리고 이미 체크 된 경우 행 항목을 업데이트합니다.

이 정보가 도움이 될 경우이 게시물을 답으로 표시하십시오. 이 당신을 도움이된다면

감사합니다 ..

+0

안녕하세요, Android 프로그래밍에 익숙하지 않으므로 조이 내 코드 조각에 코드를 추가하기가 어렵습니다. 그래서 제발 내 코드를 수정하고 변경합니까? – raghs

+0

안녕하세요, 질문을 할 수 없습니다. 그들은 내 질문을하기 위해 메타 스택 오버 플로우를 사용했기 때문에 질문을하지 못하게했다. 내 질문을 통해 가서 대답 해주세요. 신속하게 답장을 보내주십시오. 그게 내 프로젝트에 대한 긴급 – raghs

관련 문제