1

나는 각 행에 체크 박스가있는 textview를 포함하는 listview가있다. 그래서 체크 박스가 체크되고리스트 뷰를 스크롤하면 체크 박스 인스턴스가 다른 곳으로 이동하게된다. .. 다시)와 내가 목록보기에있는 확인란을 결합하려고 것을 해결하기 위해하지만 내 코드를 작동하지 않았다 방법을 몇 가지 확인 체크 박스를 가지고 있습니다 :의 행의 내용체크 박스를리스트 뷰에 바인딩하는 방법

SimpleCursorAdapter adapter =new SimpleCursorAdapter(this,R.layout.rating,cu,new String[]{"Title","Favorites"}, new int[]{R.id.text1,R.id.bt_rating},CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER); 
     listv.setAdapter(adapter); 

     adapter.setViewBinder(new SimpleCursorAdapter.ViewBinder(){ 
       /** Binds the Cursor column defined by the specified index to the specified view */ 
       public boolean setViewValue(View view, Cursor cursor, int columnIndex){ 
        if(view.getId() == R.id.bt_rating){ 

         ((CheckBox)view).setChecked(Boolean.valueOf(cursor.getString(cursor.getColumnIndex("Favorites")))); 
         ((CheckBox)view).setOnCheckedChangeListener(myCheckChangList); 
         return true; //true because the data was bound to the view 
        } 
        return false; 
       } 
      }); 


OnCheckedChangeListener myCheckChangList = new OnCheckedChangeListener() { 
      public void onCheckedChanged(CompoundButton buttonView, 
        boolean isChecked) { 
       buttonView.setChecked(isChecked); 
      } 
     }; 

내 XML 코드 내 목록보기 :

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="horizontal" > 

    <CheckBox 
android:id="@+id/bt_rating" 
android:focusable="false" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:layout_gravity="center_vertical" 
android:button="@android:drawable/btn_star"/> 

<TextView 

android:id="@+id/text1" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:textSize="@dimen/fsinlistview" 

/> 
</LinearLayout> 
+1

http://www.vogella.com/tutorials/AndroidListView/article.html#listviewselection –

+0

슬픈 듯이 내가 필요한 것을 찾지 못했습니다 ... 내 검색을 계속합니다 .. 어쨌든 덕분에 .. –

답변

0

것 같습니다. 코드를 보면 체크 박스가 과 동일한 수신기에 대한 참조를 얻는 것을 확인하십시오. 따라서 한 상자를 선택하면 다른 모든 상자도 확인 된 상태로 설정됩니다. 또한 백업 데이터를 업데이트하지 않을 수도 있습니다.

OnCheckedChangedListener은 상태가 이미 변경 되었기 때문에 콜백이 실행됩니다.사용자가 체크 박스를 확인할 때

그래서 다음 단계를 수행해야합니다 항목이 확인되었다

  1. 그림 아웃하고, 그 데이터에 대응하는 방법을
  2. 체크 새로운 맞게 데이터를 업데이트/체크되지 않은 상태
  3. 는 데이터 변경의 어댑터를 통보/커서 업데이트

당신은 그것을 다시 행의 ID와보기를 태그, 다음과 같은이 뭔가를 할 수 제공 :

public boolean setViewValue(View view, Cursor cursor, int columnIndex){ 
    if(view.getId() == R.id.bt_rating){ 
     view.setTag(cursor.getInt(cursor.getColumnIndex(SomeDBContract.ID))); 
     ((CheckBox)view).setChecked(Boolean.valueOf(cursor.getString(cursor.getColumnIndex("Favorites")))); 
     ((CheckBox)view).setOnCheckedChangeListener(myCheckChangList); 
     return true; //true because the data was bound to the view 
    } 
    return false; 
} 

그런 다음 데이터베이스를 업데이트 할 수 있습니다 리스너에 해당 ID에 따라 :

CheckedChangeListener myCheckChangList = new OnCheckedChangeListener() { 
     public void onCheckedChanged(CompoundButton buttonView, 
       boolean isChecked) { 
      int rowId = (int) buttonView.getTag(); 
      // Handle updating the database as per normal 
      updateSomeDbRowAsChecked(rowId, isChecked); 
     } 
    }; 

마지막으로, 데이터베이스 행에 한 번 새 커서 커서 어댑터를 업데이트해야합니다 업데이트됩니다

myAdapter.swapCursor(newCursor); 

당신은 당신의 코드에 맞게이 모든 것을 조정해야 할 것이다, 그러나 당신이이 문제를 접근 할 수있는 하나의 방법의 아이디어를 줄 것이다.

+0

ok는 문제를 해결할 것입니다.하지만 내 viewbinder는 log.d를 안에 넣었 기 때문에 호출되지 않습니다 .. –

+0

도 청취자의 컨텐츠가 직접 결과를 확인하기 위해 추가되었습니다. 내 데이터베이스에 변경 사항을 추가하는 것입니다. 뷰 파인더가 왜 불려 오지 않는가? –

+0

죄송합니다. 뷰 바인더를 설정하는 코드가 올바르게 보입니다. –

0

모든 목록보기에서보기가 다시 사용됩니다. 목록을 스크롤 할 때 화면을 위아래로 스크롤하는 항목은 재활용되며 아래 나온대로 최신 정보와 함께 사용됩니다.

희소 배열로 확인란을 추적해야합니다. 사용자가 각각을 터치 할 때 배열의 색인을 체 크/체크하지 않음으로 표시하십시오. 그런 다음 배열의 값에 따라 체크 상자의 상태를 설정합니다.

예전 앱의 일부 예제 코드는 "모두 선택"확인란을 선택하고 확인란을 선택하거나 선택 취소하여 전체 목록을 관리합니다. 그것은 내가 쓴 교실 출석 앱을위한 것이 었습니다. 그래서 선생님이 수업에서 "ALL"을 선택하고 존재하지 않는 학생들을 선택 해제하는 것이 훨씬 쉬웠습니다.

이 목록보기에는 두 개의 확인란과 두 개의 희소 배열 인 itemCheckedHere 및 itemCheckedLate (학생이 수업 중이거나 늦었 음)가 있습니다. 당신의 OnCheckedChangedListener 문제는 여기처럼

public class MyDataAdapter extends SimpleCursorAdapter { 
    private Cursor c; 
    private Context context; 
    private Long classnum; 
    private gradeBookDbAdapter mDbHelper; 

    public static final int LATE=2; 
    public static final int ATTEND=1; 
    int idxCol; 
    int idx; 

    // itemChecked will store the position of the checked items. 

    public MyDataAdapter(Context context, int layout, Cursor c, String[] from, 
      int[] to, Long mRowId) { 
     super(context, layout, c, from, to); 
     this.c = c; 
     this.context = context; 
     mDbHelper = new gradeBookDbAdapter(context); 
     mDbHelper.open(); 
     classnum = mRowId; 
     c.moveToFirst(); 



    } 
    public class ViewHolder{ 
     public TextView text; 
     public TextView text2; 
     public ImageView image; 
     public CheckBox here; 
     public CheckBox late; 
    } 


    public View getView(final int pos, View inView, ViewGroup parent) { 
     Bitmap bm; 
     ImageView studentPhoto; 
     View vi=inView; 
     final ViewHolder holder; 

     if (inView == null) { 
      LayoutInflater inflater = (LayoutInflater) context 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      vi = inflater.inflate(R.layout.show_attendance, null); 

      holder=new ViewHolder(); 
      holder.text=(TextView)vi.findViewById(R.id.stuname); 
      holder.text2=(TextView)vi.findViewById(R.id.stuIndex); 
      holder.image=(ImageView)vi.findViewById(R.id.icon); 
      holder.here=(CheckBox)vi.findViewById(R.id.attend); 
      holder.late=(CheckBox)vi.findViewById(R.id.late); 
      vi.setTag(holder); 

     } 
     else 
      holder=(ViewHolder)vi.getTag(); 


     c.moveToPosition(pos); 
     int index = c.getColumnIndex(gradeBookDbAdapter.KEY_NAME); 
     String name = c.getString(index); 
     holder.text.setText(name); 
     index = c.getColumnIndex(gradeBookDbAdapter.KEY_ROWID); 
     String Index = c.getString(index); 
     holder.text2.setText(Index); 

     bm = gradeBookDbAdapter.getStudentPhoto(name); 
     if (bm != null) { 
      holder.image.setImageBitmap(bm); 
     }   
     else { 
      // use icon image 
      holder.image.setImageResource(R.drawable.person_icon); 
     } 


     // pull out existing attend/late fields and set accordingly 
     int attend = c.getInt(c.getColumnIndex(gradeBookDbAdapter.KEY_ATTEND)); 
     if(attend==1){ 
      holder.here.setChecked(true); 
      itemCheckedHere.set(pos, true); 
     } 
     //else { 
     // holder.here.setChecked(false); 
     // itemCheckedHere.set(pos, false); 
     //} 

     int late = c.getInt(c.getColumnIndex(gradeBookDbAdapter.KEY_LATE)); 
     if (late==1){ 
      holder.late.setChecked(true); 
      itemCheckedLate.set(pos, true); 
     } 
     //else { 
     // holder.late.setChecked(false); 
     // itemCheckedLate.set(pos, false); 
     //} 


     if (selectAllTouched) { 
      if(selectAll){ 
       holder.here.setChecked(true); 
       itemCheckedHere.set(pos, true); 
       int who= new Integer(holder.text2.getText().toString()); 
       mDbHelper.updateAttend(who, classnum, ATTEND, 1, attendDate); 
      } 
      else{ 
       holder.here.setChecked(false); 
       itemCheckedHere.set(pos, false); 
       int who = new Integer(holder.text2.getText().toString()); 
       mDbHelper.updateAttend(who, classnum, ATTEND, 0, attendDate); 
      } 
     } 


     holder.here.setOnClickListener(new OnClickListener() { 

      public void onClick(View v) { 

       CheckBox cb = (CheckBox) v.findViewById(R.id.attend); 

       if (cb.isChecked()) { 
        itemCheckedHere.set(pos, true); 
        int Index = new Integer(holder.text2.getText().toString()); 
        mDbHelper.updateAttend(Index, classnum, ATTEND, 1, attendDate); 
       } else if (!cb.isChecked()) { 
        itemCheckedHere.set(pos, false); 
        int Index = new Integer(holder.text2.getText().toString()); 
        mDbHelper.updateAttend(Index, classnum, ATTEND, 0, attendDate); 
       } 
      } 
     }); 
     holder.late.setOnClickListener(new OnClickListener() { 

      public void onClick(View v) { 
       CheckBox cb = (CheckBox) v.findViewById(R.id.late); 

       if (cb.isChecked()) { 
        itemCheckedLate.set(pos, true); 
        int Index = new Integer(holder.text2.getText().toString()); 
        mDbHelper.updateAttend(Index, classnum, LATE, 1, attendDate); 
       } else if (!cb.isChecked()) { 
        itemCheckedLate.set(pos, false); 
        int Index = new Integer(holder.text2.getText().toString()); 
        mDbHelper.updateAttend(Index, classnum, LATE, 0, attendDate); 
       } 
      } 
     }); 


     holder.here.setChecked(itemCheckedHere.get(pos)); // this will Check or Uncheck the 
     holder.late.setChecked(itemCheckedLate.get(pos)); // this will Check or Uncheck the 
     // CheckBox in ListView 
     // according to their original 
     // position and CheckBox never 
     // loss his State when you 
     // Scroll the List Items. 

     return vi; 
    } 

} 

은}

+0

대단히 감사합니다. 마틴하지만이 코드는 솔루션에서 다 떨어지면 내 것을 볼 수있는 것과 다릅니다 :) –

+0

예, 당신과 다릅니다. 내 의도는 당신을 위해 코드를 작성하는 것이 아니라 오히려 listview에서 체크 박스를 다루는 방법의 예제를 제공하는 것이 었습니다. 프로젝트에 간단히 빠져들 수있는 플러그 앤 플레이 코드를 찾고 있다면, 먼저 내 노력에 돈을 지불 할 수있는 페이팔 계정을 제공해야합니다. – Martin