1

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 が .xml からのデータで更新されませんuserCursoruserCursor実際には、バッキング 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 サーバー呼び出しが返され、スレッドがカーソルが指している行を更新するとき。

前もって感謝します。

4

1 に答える 1

3

この 2 つのテキストを設定する以外に、何か他のことをする予定はありますTextViewsか? 答えが「いいえ」の場合、 を使用する理由はありませViewBinderSimpleCursorAdapter。デフォルトでは がテキストを設定します。

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;
        }
}
于 2012-07-02T14:37:34.900 に答える