4

my の各アイテムには、名前と 2 つの数字のSherlockListFragment3 つの s が含まれています。データは、次の構造を持つ私のデータベースTextViewのテーブルから取得されます。objective

CREATE TABLE objective (
    _id INTEGER PRIMARY KEY,
    id_project INTEGER NOT NULL,
    activity_code INTEGER NOT NULL,
    day_duration INTEGER NOT NULL,
    week_frequency INTEGER NOT NULL,
    FOREIGN KEY(id_project) REFERENCES project(id_project)
);

さらに、カーソルからのリストへの入力は、ローダーを使用して行う必要があることを読みました (特にデータベースを使用する場合は、操作が非常に遅くなる可能性があるため)。ここで stackoverflowSimpleCursorLoaderでクラスを見つけましたが、データをフィールドに直接マップします。

ご覧のとおり、私のobjectiveテーブルにはactivity_code. したがって、それを文字列に置き換えたいと思います(すべてのアクティビティコードをリストし、それぞれに文字列リソース識別子を返す Enum があります)。

sに表示される前にデータを操作する方法を知っていますTextViewか?

これが私のSherlockListFragment

public class ObjectivesDisplayFragment extends SherlockListFragment implements LoaderManager.LoaderCallbacks<Cursor>
{
    private Activity activity;
    private SimpleCursorAdapter adapter;


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    {
        return inflater.inflate(R.layout.objectives_display, container, false);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState)
    {
        super.onActivityCreated(savedInstanceState);
        activity = getActivity();

        String[] columns = new String[] { "activity_code", "day_duration", "week_frequency" };
        int[] to = new int[] { R.id.activityName, R.id.objectiveDuration, R.id.objectiveFrequency };

        getLoaderManager().initLoader(0x01, null, this);

        adapter = new SimpleCursorAdapter(activity.getApplicationContext(), R.layout.objective_row, null, columns, to, SimpleCursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
        setListAdapter(adapter);
    }

    public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) {
        return new SimpleCursorLoader(activity) {
            @Override
            public Cursor loadInBackground() {
                DatabaseHelper dbHelper = DatabaseHelper.getInstance(activity);

                String query = "SELECT _id, activity_code, day_duration, week_frequency FROM objective WHERE id_project = ?";
                String[] args = new String[] { "1" }; // projectId
                Cursor results = dbHelper.getReadableDatabase().rawQuery(query, args);

                return results;
            }
        };
    }

    public void onLoadFinished(Loader<Cursor> arg0, Cursor cursor) {
        adapter.swapCursor(cursor);
    }

    public void onLoaderReset(Loader<Cursor> arg0) {
        adapter.swapCursor(null);
    }
}

EDIT:SimpleCursorLoader> loadInBackgroundでカーソルとデータベースを閉じる必要はありませんよね?そうしないと、データを読み取ることができませんでした。閉鎖操作は自動的に処理されますか、それとも他の場所で自分で行う必要がありますか?

4

1 に答える 1

3

私はこれがあなたのために働くかもしれないと思います:

adapter.setViewBinder(new ViewBinder(){
        @Override
        public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
            String label = "Inactive";

            if(columnIndex == 4) {
                if(cursor.getInt(columnIndex) == 1) {
                    label = "Active";
                }

                TextView tv = (TextView) view.findViewById(R.id.status);
                tv.setText(label);

                return true;
            }

            return false;
        }
    });

    setListAdapter(adapter);

背景情報: テーブルに外部キー列 (整数) があり、リスト ビューに入力するときに (リンクされたテーブルから) その文字列値に解決したいと考えていました。列は 4 番目のインデックス (セットの 5 番目の列) にあったため、setViewBinder() を使用して必要な列を操作しました。

さらに、私のレイアウトには、カーソルから 5 つのフィールドを表示するための 5 つのテキスト ビューがありました。ここで注目すべきことの 1 つは、「if」条件を使用して列インデックスをキャッチする場合、すべての条件付きブロックに「return true」が含まれている必要があることです。インタープリターが「return false」に達した場合、フィールドが操作されなかったことを意味します。

上記のコード ブロックは非常にシンプルで理解しやすいと思います。

于 2012-08-31T18:39:47.510 に答える