4

제안 목록에 db 테이블의 데이터를 채우려고합니다. 그러나 나는 StaleDataException을 얻는다. 그것은 무작위로 던져 지지만 항상 텍스트 뷰에 문자를 입력 할 때.CursorLoader 및 SimpleCursorAdapter가있는 AutoCompleteTextView

CursorLoader Cristian의 확장 SimpleCursorLoader 클래스

public class TagCursorLoader extends SimpleCursorLoader { 

    private String mSelection; 
    private TagDbLoader mDbLoader; 

    public TagCursorLoader(Context context, TagDbLoader dBLoader, String selection) { 
     super(context); 
     this.mDbLoader = dBLoader; 
     this.mSelection = selection; 
    } 

    @Override 
    public Cursor loadInBackground() { 
     return mDbLoader.fetchContainingString(mSelection); 
    } 

} 

로더 콜백 : 여기

내 코드입니다

: 마지막으로

public class TagCursorLoaderCallback implements LoaderCallbacks<Cursor>, CursorToStringConverter { 

    private Context mContext; 
    private TagDbLoader mdDbLoader; 
    private SimpleCursorAdapter mAdapter; 
    private String mSelection; 

    public TagCursorLoaderCallback(Context context, TagDbLoader dBLoader, SimpleCursorAdapter adapter) { 
     this.mContext = context; 
     this.mdDbLoader = dBLoader; 
     mAdapter = adapter; 
     mSelection = ""; 
    } 

    @Override 
    public Loader<Cursor> onCreateLoader(int id, Bundle args) { 
     return new TagCursorLoader(mContext, mdDbLoader, mSelection); 
    } 

    @Override 
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 

     if (!data.isClosed()) { 
      mAdapter.swapCursor(data); 
     } 
    } 

    @Override 
    public void onLoaderReset(Loader<Cursor> loader) { 
     mAdapter.swapCursor(null); 
    } 

    public void setSelection(String mSelection) { 
     this.mSelection = mSelection; 
    } 

    @Override 
    public CharSequence convertToString(Cursor cursor) { 
     return cursor.getString(cursor.getColumnIndexOrThrow(DbConstants.Tags.KEY_TAG)); 
    } 

} 

그리고 나는 AutoCompleteTextView을 설정할 때

private void initializeAutoComplete() { 

     mTagDbLoader = new TagDbLoader(getActivity()); 
     mTagDbLoader.open(); 

     mTagInput = (AutoCompleteTextView) mLayout.findViewById(R.id.autoComplete); 

     mTagInput.addTextChangedListener(new TextWatcherAdapter() { 

      @Override 
      public void afterTextChanged(Editable s) { 
       mLoaderCallback.setSelection(s.toString()); 
       getLoaderManager().restartLoader(0, null, mLoaderCallback); 
      } 
     }); 

     mAdapter = new SimpleCursorAdapter(getActivity(), android.R.layout.simple_list_item_1, 
       null, new String[] { DbConstants.Tags.KEY_TAG }, new int[] { android.R.id.text1 }, 
       0); 

     mLoaderCallback = new TagCursorLoaderCallback(getActivity(), mTagDbLoader, mAdapter); 
     mAdapter.setCursorToStringConverter(mLoaderCallback); 
     mTagInput.setAdapter(mAdapter); 
     getLoaderManager().initLoader(0, null, mLoaderCallback); 
    } 

답변

6

조사를 마치면 SimpleCursorAdapter은 에서 상속받은 ResourceCursorAdapter을 상속 한 것으로 보입니다. CursorAdapterCursorFilter을 필터링에 사용하며이 클래스는 publishResults()changeCursor()을 호출합니다. changeCursor은 이전 커서를 닫습니다. 그래서 내 커서가 자동으로 닫혔습니다.

은 내가 로더 하락, 아래의 코드 구현을 변경하고 크게 작동합니다

mAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, 
       mTagDbLoader.fetchAll(), new String[] { DbConstants.Tags.KEY_TAG }, 
       new int[] { android.R.id.text1 }, 0); 

mAdapter.setFilterQueryProvider(new FilterQueryProvider() { 

    @Override 
    public Cursor runQuery(CharSequence constraint) { 

     if (constraint == null || constraint.equals("")) 
      return mAdapter.getCursor(); 

     return mTagDbLoader.fetchContainingString(constraint.toString()); 
    } 
}); 

mAdapter.setCursorToStringConverter(new CursorToStringConverter() { 

    @Override 
    public CharSequence convertToString(Cursor c) { 

     return c.getString(c.getColumnIndexOrThrow(DbConstants.Tags.KEY_TAG)); 
    } 
}); 
+0

게시물은 내가 convertToString의 메소드를 오버라이드 (override) 할 필요가있는 정보에 의해 그 내용으로하지 않음으로써, 도움 !, 감사 –