1

私のアプリでは、ListActivityを使用してデータベースからデータを取得する がありますLoaderManager。私がやりたいことは、アイテムがクリックされたときに、別のアクティビティ (データベースからデータを取得してグリッドを表示する) を開始し、ID をコンテンツ プロバイダーに渡して、コンテンツ プロバイダー経由でデータベース クエリを実行することです。どうすればこれを行うことができますか?

答えを探しましたが、この問題を解決する答えが見つからないようです。

ContentProvider で getIntent() を使用しようとしましたが、この質問のように getIntent() が機能しないことがわかりましたAndroid アプリケーションのアクティビティ間でデータを渡すにはどうすればよいですか?

これは onListItemClick です

   protected void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id); 
    startActivity(i);

}

次のアクティビティを作成するには、どのアイテムがクリックされたか (したがって ID) を知る必要があります。この ID はコンテンツ プロバイダに渡されます

    public Cursor query(Uri uri, String[] projection, String selection,
        String[] selectionArgs, String sortOrder) {

    switch (mUriMatcher.match(uri)) {
    case QUESTIONS:
        Log.d(DBHelper.TAG, "fetching categories");
        return  myDH.fetchCatgories();

    case GRID:
        //row here is the id from my list activity
        //myDH is an instance of my DB helper class
        return myDH.fetchQuestions(row);

    default:
        throw new IllegalArgumentException("Unsupported URI: " + uri);
    }
}

を設定しましたurimatcher。私の質問は、リストからその ID を取得して、このクエリの引数にする方法です。LoaderManager を使用しているため、コンテンツ プロバイダーからクエリを作成する必要があります。

これは ContentProvider クラスです

    private static final int QUESTIONS = 1;
private static final int GRID = 2;
TestAdapter myTestAdapter;
DBHelper myDH;
private static final UriMatcher mUriMatcher;

static {
    mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
    mUriMatcher.addURI(AUTHORITY, BASE_PATH_CATEGORY, QUESTIONS);
    mUriMatcher.addURI(AUTHORITY, BASE_PATH_GRID, GRID);
}

@Override
public boolean onCreate() {
    myDH = new DBHelper(getContext());
    try {
        myDH.createDatabase();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    myDH.openDatabase();
    return true;
}

@Override
public Cursor query(Uri uri, String[] projection, String selection,
        String[] selectionArgs, String sortOrder) {

    switch (mUriMatcher.match(uri)) {
    case QUESTIONS:
        Log.d(DBHelper.TAG, "fetching categories");
        return  myDH.fetchCatgories();
    case GRID:
                   //this is where i need the position that was clicked
                   //so that i can use this value in the DBHelper.
        return myDH.fetchQuestions(row);

    default:
        throw new IllegalArgumentException("Unsupported URI: " + uri);
    }
}

DBHelper と通信するために ContentProvider を使用しています。これはコードの関連部分です

  //DBHelper Code
  public Cursor fetchQuestions(long row) throws SQLException{
    Cursor cursor = myDataBase.rawQuery("select _id, used, question_level from questions_en where category" + " = " + row, null);
    return cursor;
}

返されたカーソルは、別のアクティビティで使用されてグリッドに入力されます。

LoaderManager を使用しない場合 (このメソッドは機能しますが、非推奨の startManagingCursor を使用します)、これは listActivity に関連するコードです

    @Override
protected void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id); 
    Intent i = new Intent(this, QuestionSelection.class);
    i.putExtra(DBHelper.KEY_ID, id);
    startActivity(i);

}

次のアクティビティの onCreate で:

        protected void onCreate(Bundle savedInstanceState) {
    Bundle extras = getIntent().getExtras();
    rowId = extras.getLong(DBHelper.KEY_ID);
    mDbHelper = new DBHelper(this);
    try {
        mDbHelper.createDatabase();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    mDbHelper.openDatabase();
    Cursor cursor = mDbHelper.fetchQuestions(rowId);
    startManagingCursor(cursor);
    String[] from = {DBHelper.KEY_ID, "question_level", "used"};
    int[] to = {R.id.grid_text, R.id.grid_image_right, R.id.grid_image_left};
    GridView grid = (GridView)findViewById(R.id.question_grid);
    mAdapter = new SimpleCursorAdapter(this, R.layout.grid_item, cursor, from, to);
    grid.setAdapter(mAdapter);
}
4

1 に答える 1

0

次のように開始すると、アイテムの位置を からListViewアクティビティに渡すことができます。

protected void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id); 
    i.putExtra("itemPosition", position);
    startActivity(i);
}

次に、他のアクティビティで、次のようにアイテムの位置を取得できます。

int itemPosition = getIntent().getIntExtra("itemPosition", -1);
if (itemPosition != -1) {
    // itemPosition is the position in the ListView where the user clicked...
于 2013-11-12T14:15:03.103 に答える