2012-11-26 2 views
2

this post과 매우 비슷한 문제가 있습니다. 내 ListView의 모든 행에 나는 청취자와 함께 확인란이 있습니다. 리스너 업데이트 데이터베이스 행입니다.CursorAdapter를 사용하여 ListView의 확인란 상자 수신기

@Override 
public void bindView(View v, Context context, Cursor c) { 
    TextView tvA = (TextView) v.findViewById(R.id.adi_tv_activity); 
    CheckBox cb = (CheckBox) v.findViewById(R.id.adi_cbox); 
    tvA.setText(c.getString(c.getColumnIndex("name"))); 
    final long id = c.getLong(c.getColumnIndex("_id")); 
    final Context ctx = context; 
    cb.setOnCheckedChangeListener(new OnCheckedChangeListener(){ 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      ObjDBF dbf = new ObjDBF(ctx); //Object thet update db 
      if(isChecked) { 
       dbf.tbActivitiesUpdateState(id, true); 
      } else { 
       dbf.tbActivitiesUpdateState(id, false);  
      } 
     }    
    }); 
    if (c.getBoolean(c.getColumnIndex("state"))) { 
     cb.setChecked(true); 
    } else { 
     cb.setChecked(false); 
    } 
} 

나는 2 가지 문제가 있습니다.

  1. 스크롤링 문제. 목록 이동 화면에서 사라지는 행의 확인란 상태를 잃어 버렸습니다.
  2. setChecked를 사용할 때마다 listener가 호출되어 새 db 업데이트가 발생합니다.

스크롤 문제를 해결하려면 db를 업데이트 할 때마다 adapter.changeCursor를 사용하고 싶지만 두 번째 문제의 경우 루프가 발생합니다. 어떻게 할 수있는 나는 cursorAdapter을 가지고 newView와의 Bindview

에서 일을,

은 내가 사용 위에 링크 된 게시물의 두 번째 대답으로 배열을 사용하는 것도 시도하지만, 메소드의 getView 외경 어댑터를 사용 문제를 풀다?

편집 : auselen 솔루션이 작동하지만 많은 청취자를 생성하고 파기합니다. 더 효율적인 다른 솔루션이 있습니까?

+3

CheckedChange Listener를 설정하기 전에 "블록"으로 이동하면 어떻게됩니까? 오래된 리스너를 없애기 위해 setOnCheckedChangeListener (null) -> setChecked -> setOnCheckedChangeListener (새 리스너)와 같은 작업을 수행해야 할 수도 있습니다. – auselen

+0

!!! 감사. 당신이 응답에있는 coment를 변형하는 경우에 나는 응답으로 추가하는 그 – crbin1

+0

를 받아 들인다. – auselen

답변

3

수신기에서 콜백을 트리거하지 않으려면 기존 번호를 등록 해제하고 cb.setChecked(c.getBoolean(c.getColumnIndex("state")))을 입력 한 다음 cb.setOnCheckedChangeListener()을 다시 설정해야합니다.

그러나 더 나은 방법으로 생각하면 그 OnCheckedChangeListener, 왜냐하면 당신은 결국 필요 이상의 수신기를 만드는 것입니다.

0
private SparseBooleanArray bolarray; 
public class ViewHolder{ 
     CheckBox checked_displayName; 
     int contact_id; 
     String displayName; 
     boolean isChecked=false; 
    } 

public void bindView(View v, Context context, Cursor cursor) 
{ 

ViewHolder viewHolder=new ViewHolder(); 

viewHolder.checked_displayName=(CheckBox) 
v.findViewById(R.id.checked_displayName); 

viewHolder.displayName=cursor.getString(cursor.getColumnIndex(PROJECTION[0])); 

viewHolder.checked_displayName.setText(viewHolder.displayName); 

viewHolder.checked_displayName.setTag(viewHolder); 

if(!bolarray.get(viewHolder.contact_id)){ 
      bolarray.put(viewHolder.contact_id, false); 
      viewHolder.checked_displayName.setChecked(false); 
      viewHolder.isChecked=false; 
     }else{ 

      bolarray.put(viewHolder.contact_id, true); 
      viewHolder.checked_displayName.setChecked(true); 
      viewHolder.isChecked=true; 
     } 
관련 문제