2012-07-01 99 views
1

我有一個SimpleCursorAdapter,我試圖將一個SimpleCursorAdapter.ViewBinder綁定到它。以下是我正在使用的代碼。Android SimpleCursorAdapter.ViewBinder沒有更新綁定TextView

// Setup Cursor and SimpleCursorAdapter, called in Activity onResume() 
Cursor userCursor = getUserProfile(userEmail); 
mAdapter = new SimpleCursorAdapter(this, 
       R.layout.user_profile, 
       userCursor, 
       new String[] { 
        StackOverFlow.Users.FULL_NAME, 
        StackOverFlow.Users.EMAIL }, 
       new int[] { 
        R.id.txtvwProfileUserFullName, 
        R.id.txtvwProfileOtherUserInfo }); 
mAdapter.setViewBinder(new UserProfileViewBinder()); 

我UserProfileViewBinder類:

private class UserProfileViewBinder implements SimpleCursorAdapter.ViewBinder { 
    @Override 
    public boolean setViewValue(View view, Cursor cursor, int columnIndex) { 
     TextView tv; 
     switch (columnIndex) { 
     case 1: // TODO: Magic Numbers, bad! 
      tv = (TextView) view.findViewById(R.id.txtvwProfileUserFullName); 
      String userFullName = cursor.getString(columnIndex); 
      tv.setText(userFullName); 
      break; 
     case 2: // TODO: Magic Numbers, bad! 
      tv = (TextView) view.findViewById(R.id.txtvwProfileOtherUserInfo); 
      String userEmail = cursor.getString(columnIndex); 
      tv.setText(userEmail); 
      break; 
     } 
     return true; 

    } 
} 

問題

當我加載活動,TextView的公司沒有得到來自userCursor數據更新。我可以確認userCursor事實上是指向備份SQLite數據庫中的一個有效行,並且有數據,但UserProfileViewBinder中的setViewValue方法似乎從未執行。我不確定我做錯了什麼,或者忽略了包括在內。

作爲替代方案,我做以下設置TextView的文本:

if (mAdapter.getCursor().moveToFirst()) { 
    mUserFullName.setText(mAdapter.getCursor().getString(
      StackOverFlow.USER_FULL_NAME)); 
    mUserOtherInfo.setText(mAdapter.getCursor().getString(
      StackOverFlow.USER_EMAIL)); 
} 

但我不認爲這會自動更新的TextView的當光標數據的變化。 ContentProvider在執行查詢後調用setNotificationUri,並且REST服務器調用返回並且線程更新光標指向的行。

在此先感謝。

回答

3

你是否打算在除了設置這兩個文字TextViews之外做其他事情?如果答案是否定的,那麼您沒有理由使用ViewBinder作爲SimpleCursorAdapter,默認情況下會爲您設置文本。

反正,我不明白爲什麼你用columnIndex參數來識別的意見,並沒有傳遞進來視圖的id看看這有助於。

public boolean setViewValue(View view, Cursor cursor, int columnIndex) {   
     if (view.getId() == R.id.txtvwProfileUserFullName) { 
      String userFullName = cursor.getString(columnIndex); 
      ((TextView) view).setText(userFullName); 
      return true; 
     } else if (view.getId() == R.id.txtvwProfileOtherUserInfo) { 
      String userEmail = cursor.getString(columnIndex); 
      ((TextView) view).setText(userEmail); 
      return true; 
     } else { 
      return false; 
     } 
}