我有一个SimpleCursorAdapter,我正在尝试将SimpleCursorAdapter.ViewBinder绑定到它。下面是我正在使用的代码。
// 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数据库中的有效行,并且有数据,但setViewValue
中的UserProfileViewBinder
方法似乎永远不会执行。我不确定我做错了什么,或忽略了包括。
作为替代方案,我正在执行以下操作来设置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服务器调用返回并且线程更新光标指向的行。
提前致谢。
答案 0 :(得分: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;
}
}