質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.49%

  • Java

    16118questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Android

    7385questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

  • Android Studio

    4356questions

    Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

  • SQLite

    795questions

    SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

listviewで取得したデータを遷移先のActivityでも取得したい

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 1,044

Haru_T

score 28

英単語帳アプリを作っています。
その中でListviewを使ってデータベースに入れている単語の一覧を表示させるActivityを用意したいと考えています。
そして、表示されている単語をクリックすると、その単語の詳細データを表示させるActivityに遷移させるようにしたいのです。
自分で調べて遷移させる方法は分かったのですが、タップした単語と画面遷移後のActivityに表示する詳細データの単語とを同じものにするにはどうすればいいのかが分かりません。
単語を示す変数を受け渡しすればいいと思っているのですが、for文でListを作っているため、どこにputExtraを用意すべきかが分かっていません。アドバイスお願いします、、、

public class ListActivity extends AppCompatActivity {
    /*ListViewでデータベースの単語一覧を表示*/

    private SQLiteDatabase databaseObject;
    private DataBaseHelper dbhelper = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list);

        final ListView mListView = (ListView) findViewById(R.id.word_list);

        dbhelper = new DataBaseHelper(this);
        databaseObject = dbhelper.getReadableDatabase();

        ArrayList<String> data = new ArrayList<String>();
        String query = "SELECT * " + "FROM WordData";

        Cursor cursor = databaseObject.rawQuery(query, null);
        cursor.moveToFirst();
        for (int i = 0; i < cursor.getCount(); i++) {

            data.add(cursor.getString(0));
            cursor.moveToNext();
        }

        cursor.close();
        databaseObject.close();

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, data);
        mListView.setAdapter(adapter);


    //タップした単語の詳細を表示するActivityに画面遷移
        mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                ListView listView = (ListView)parent;
                String item = (String)listView.getItemAtPosition(position);

                //ここで値を渡す??
                Intent intent = new Intent(getApplicationContext(), WordActivity.class);
                intent.putExtra("word", item); /*処理は合ってる??*/
                startActivity(intent);
            }
        });
}
public class WordActivity extends AppCompatActivity {
    /*ListViewのitemをタップして詳細データを表示*/
    private DataBaseHelper dbhelper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_word);

        dbhelper = new DataBaseHelper(this);

        SQLiteDatabase databaseObject = dbhelper.getReadableDatabase();

        /*ここで値を受け取る??*/
        Intent intent = getIntent();
        String item = intent.getStringExtra("word");

        String query = "SELECT * " + "FROM WordData";
        Log.d("query", "query = " + query);

        Cursor cursor = databaseObject.rawQuery(query, null);

        String word = cursor.getString(0);
        String pron1 =cursor.getString(1);
        String pron2 = cursor.getString(2);
        String mean1 = cursor.getString(3);
        String mean2 = cursor.getString(4);
        String des = cursor.getString(5);
        String part = cursor.getString(6);

        TextView wordView = (TextView)findViewById(R.id.word_view);
        wordView.setText(word);

        TextView pronView =(TextView) findViewById(R.id.pron_view);
        pronView.setText("【" + pron1 + pron2 + "】");

        TextView partView =(TextView) findViewById(R.id.part_view);
        partView.setText(part);

        TextView mean1View =(TextView)findViewById(R.id.mean1_view);
        mean1View.setText("①" + mean1);

        TextView mean2View =(TextView) findViewById(R.id.mean2_view);
        mean2View.setText("②" + mean2);

        TextView desView = (TextView) findViewById(R.id.des_view);
        desView.setText("※" + des);

    }
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

Intentを発行する直前(startActivity)がいいですね。
コードの箇所で問題ありません。

とは言っても単語を渡していますが、同じ単語を複数登録する可能性があるなら少しテーブル設計を見直したほうがいいかもしれないですね。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/10/17 15:39

    Intent intent = new Intent(getApplicationContext(), WordActivity.class);
    String item = (String)listView.getItemAtPosition(position);
    intent.putExtra("word", item);
    startActivity(intent);
    こういうことでしょうか?それとも下の2行が逆ですか?

    キャンセル

  • 2016/10/17 15:45 編集

    いえ、そのコードであっています。
    ただIntentのコンストラクタの第一引数はActivityを渡したほうがいいので、ListActivity.thisに修正した方がいいです。

    エラーが出ますか?

    キャンセル

  • 2016/10/17 16:00

    Intent intent = new Intent(ListActivity.this, WordActivity.class);
    String item = (String)listView.getItemAtPosition(position);
    intent.putExtra("word", item);
    startActivity(intent);
    このように訂正しました!
    受け取り側に問題があるようでエラーとなってしまいます、、

    キャンセル

  • 2016/10/17 16:04

    エラーじゃわからないです。
    エラーログを載せましょう。

    キャンセル

  • 2016/10/17 16:09

    エラーは以下の通りです。
    お返事が遅くなりましたが同じ単語を登録することはありません。
    受け取ったitemをwordと結び付けたいのですが、、、


    E/AndroidRuntime: FATAL EXCEPTION: main
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.wordcard2/com.example.wordcard2.WordActivity}: android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 69
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
    at android.app.ActivityThread.access$600(ActivityThread.java:130)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:4745)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
    at dalvik.system.NativeStart.main(Native Method)
    Caused by: android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 69
    at android.database.AbstractCursor.checkPosition(AbstractCursor.java:418)
    at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136)
    at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:50)
    at com.example.wordcard2.WordActivity.onCreate(WordActivity.java:35)
    at android.app.Activity.performCreate(Activity.java:5008)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) 
    at android.app.ActivityThread.access$600(ActivityThread.java:130) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:137) 
    at android.app.ActivityThread.main(ActivityThread.java:4745) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:511) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
    at dalvik.system.NativeStart.main(Native Method) 

    キャンセル

  • 2016/10/17 16:11

    エラーログのWordActivity.java:35
    のところで引っかかっているようです。String word = cursor.getString(0)のところです。

    キャンセル

  • 2016/10/17 16:14

    Cursorの作法をもう一度調べた方がいいですね。
    リストを表示する時にCursor#moveToFirst等は使いませんでしたか?
    また、DAOやDTOを作成することをオススメします。

    キャンセル

  • 2016/10/17 16:35

    難しいです。勉強します、、、
    ありがとうございます。
    たしかに端末にファイルを作った方がよさそうです。

    キャンセル

  • 2016/10/17 16:43

    難しいですが、一度ListViewのデータを作成しているところで同じ処理をしているのでそれを参考にしたらいいですよ。

    また、端末にファイルを作るとはDAOとDTOに対してのコメントなら
    誤解がありそうです。
    データ処理を行うクラスを新規で作成した方がいいですよって意味なので。

    キャンセル

同じタグがついた質問を見る

  • Java

    16118questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Android

    7385questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

  • Android Studio

    4356questions

    Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

  • SQLite

    795questions

    SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。