Android SimpleCursorAdapter.ViewBinder不更新绑定的TextView

时间:2012-07-01 00:46:45

标签: java android sqlite

我有一个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服务器调用返回并且线程更新光标指向的行。

提前致谢。

1 个答案:

答案 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;
        }
}