2012-11-07 3 views
2

커서 어댑터를 사용하여 확인란 listView가 있습니다. 어떤 이유로 머리글을 스크롤하면 (pageOrder == 3) 모든 곳으로 이동합니다. 그것은 맨 위에 머 무르지 않습니다. 13, 2 또는 3. 포지션으로 이동합니다.커서 목록을 사용하여 안드로이드 ListView 목록 스크롤 시작 때 엉망이

public class ExamCursorAdapter extends CursorAdapter { 

private LayoutInflater inflater; 
private int pageIndex; 
private int pageTitleIndex; 
private int pageOrderIndex; 
private Context context; 
private String assessmentId; 

static class ViewHolder{ 
    protected TextView textViewTitle; 
    protected TextView textViewHeader; 
    protected TextView textViewCheckBox; 
    protected CheckBox checkbox; 
    protected int pageOrder; 
    protected int pageId; 
} 

public ExamCursorAdapter(Context context, Cursor cursor, String assessmentId) { 
    super(context, cursor, 0); 
    this.context = context; 
    this.assessmentId = assessmentId; 
    pageIndex = cursor.getColumnIndex(PagesTable.COLUMN_ID); 
    pageTitleIndex = cursor.getColumnIndex(PagesTable.COLUMN_TITLE); 
    pageOrderIndex = cursor.getColumnIndex(PagesTable.COLUMN_ORDER); 
    inflater = LayoutInflater.from(context); 
} 

@Override 
public void bindView(View view, Context context, Cursor cursor) { 
    ViewHolder holder = (ViewHolder) view.getTag(); 
    holder.textViewTitle.setText(cursor.getString(pageTitleIndex)); 
    holder.pageOrder = cursor.getInt(pageOrderIndex); 

} 

@Override 
public View newView(Context context, Cursor cursor, ViewGroup parent) { 
    ViewHolder holder = new ViewHolder(); 

    View view = null; 
    holder.pageId = cursor.getInt(pageIndex); 
    holder.pageOrder = cursor.getInt(pageOrderIndex); 

    if(holder.pageOrder == 3) { 
     view = inflater.inflate(R.layout.list_adapter_header_exam, null); 
     holder.textViewTitle = (TextView) view.findViewById(R.id.adapter_header_textview_exam_column1); 
     holder.textViewCheckBox = (TextView) view.findViewById(R.id.adapter_header_textview_exam_column2); 
     holder.textViewCheckBox.setText("Complete"); 
     view.setFocusable(true); 
    } else { 
     view = inflater.inflate(R.layout.exam_row, null); 
     holder.textViewTitle = (TextView) view.findViewById(R.id.exam_cursor_adapter_textview); 
     holder.checkbox = (CheckBox) view.findViewById(R.id.exam_cursor_adapter_check_box); 
     holder.checkbox.setClickable(false);  
     String[] projection = { ExamCompleteTable.COLUMN_EXAM_COMPLETE }; 
     StringBuilder sb = new StringBuilder(); 
     sb.append(BPContentProvider.EXAM_COMPLETE_URI).append("/assessment/").append(assessmentId); 
     sb.append("/page/").append(holder.pageId); 
     Uri examCompleteUri = Uri.parse(sb.toString()); 
     Cursor examCompleteCursor = context.getContentResolver().query(examCompleteUri, projection, null, null, null); 
     if (examCompleteCursor.moveToFirst()) { 
      int examComplete = examCompleteCursor.getInt(examCompleteCursor.getColumnIndexOrThrow(ExamCompleteTable.COLUMN_EXAM_COMPLETE)); 
      if(examComplete == 1) { 
       holder.checkbox.setChecked(true); 
      } 
     } 
     examCompleteCursor.close(); 
    } 
    view.setTag(holder); 
    return view; 
} 


} 

답변

2

View recycler에 문제가 있습니다. CursorAdapter이 내장 된 방법에 하나 이상의 레이아웃이 있음을 알려보십시오 :

@Override 
public int getItemViewType(int position) { 
    Cursor cursor = getCursor(); 
    cursor.moveToPosition(position); 
    return (cursor.getInt(pageOrderIndex) == 3 ? 0 : 1); 
} 

@Override 
public int getViewTypeCount() { 
    return 2; 
} 

또한 은 각 행의 내용에 따라 변경 같은이 데이터가 보인다 :

String[] projection = { ExamCompleteTable.COLUMN_EXAM_COMPLETE }; 
StringBuilder sb = new StringBuilder(); 
sb.append(BPContentProvider.EXAM_COMPLETE_URI).append("/assessment/").append(assessmentId); 
sb.append("/page/").append(holder.pageId); 
Uri examCompleteUri = Uri.parse(sb.toString()); 
Cursor examCompleteCursor = context.getContentResolver().query(examCompleteUri, projection, null, null, null); 
if (examCompleteCursor.moveToFirst()) { 
    int examComplete = examCompleteCursor.getInt(examCompleteCursor.getColumnIndexOrThrow(ExamCompleteTable.COLUMN_EXAM_COMPLETE)); 
    if(examComplete == 1) { 
     holder.checkbox.setChecked(true); 
    } 
} 
examCompleteCursor.close(); 

각 행의 데이터를 변경하려면이 코드가 bindView() (또는 getView())이어야합니다.

팁으로,이 활동이 포 그라운드에있는 동안 examComplete이 일정하게 유지되면 SparseIntArray 또는 List<Integer>에 이러한 정수를 저장하여 작업 속도를 높일 수 있습니다.

관련 문제