2012-07-01 61 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; 
     } 
}