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

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

新規登録して質問してみよう
ただいま回答率
85.50%
SQLite

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

Java

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

Android

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

Android Studio

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

Q&A

解決済

2回答

3381閲覧

ダイアログで詳細データ表示を行いたい

Haru_T

総合スコア34

SQLite

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

Java

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

Android

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

Android Studio

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

0グッド

0クリップ

投稿2016/11/11 08:45

listViewとDBを使って、英単語の一覧を表示させるものを作っています。
その中で、アイテムをタップするとその単語を詳細データをダイアログで表示させたいと思っています。
ダイアログを表示させるところと、タップしたアイテムをタイトルとして表示させる部分まではできています。
はじめはダイアログにデータを表示させるためのlistをlistviewの分とは別で用意して、そこからタップしたアイテムの情報を引き出せないかと考えたのですが、なかなかうまくいかず。
今のコードのままでは、当然といえば当然なのですがDB上最後の単語の発音記号が出力されてしまいます。

ほかにも新しくsql文を指定して、positionとDBのrowIdが一致するものを取り出す方法も考えてみたのですが、そのままに"SELECT * WordData WHERE ROWID == position"が通用するはずもなくうまくいきませんでした。
データベースとダイアログをうまく使う方法や参考サイトを知っている方がいらっしゃれば教えていただきたいです。

java

1public class ListActivity extends AppCompatActivity { 2 /*ListViewでデータベースの単語一覧を表示*/ 3 4 private SQLiteDatabase databaseObject; 5 private DataBaseHelper dbhelper = null; 6 private String pron1; 7 8 @Override 9 protected void onCreate(Bundle savedInstanceState) { 10 super.onCreate(savedInstanceState); 11 setContentView(R.layout.activity_list); 12 13 final ListView mListView = (ListView) findViewById(R.id.word_list); 14 15 dbhelper = new DataBaseHelper(this); 16 databaseObject = dbhelper.getReadableDatabase(); 17 18 final ArrayList<String> data = new ArrayList<String>(); 19 dlist = new ArrayList<String>(); 20 21 final String query = "SELECT * " + "FROM WordData"; 22 23 final Cursor cursor = databaseObject.rawQuery(query, null); 24 cursor.moveToFirst(); 25 for (int i = 0; i < cursor.getCount(); i++) { 26 data.add(cursor.getString(0)); 27 pron1 = cursor.getString(1); 28 29 cursor.moveToNext(); 30 } 31 32 cursor.close(); 33 databaseObject.close(); 34 35 ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, data); 36 mListView.setAdapter(adapter); 37 38 mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 39 @Override 40 public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 41 AlertDialog.Builder diag = new AlertDialog.Builder(ListActivity.this); 42 43 // ダイアログの表示内容 44 TextView textview = (TextView)view; 45 diag.setTitle(textview.getText() +"【" + pron1 + "】");/*pron1というのは発音記号を指します*/ 46 diag.setMessage("意味"); /*もちろん「意味」という言葉ではなく、意味を表示させたい*/ 47 48 // ダイアログに表示するボタンの定義 49 DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener(){ 50 public void onClick(DialogInterface dialog, int which) { 51 setResult(RESULT_OK); 52 } 53 }; 54 55 // ダイアログに表示するボタンの設定 56 diag.setPositiveButton("OK",listener); 57 // ダイアログの作成、表示 58 diag.create(); 59 diag.show(); 60 } 61 });

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

・WordDataテーブルに対応したDTOを作りましょう。
・ArrayAdapterのジェネリクスに作成したDTOを指定しましょう。

あなたはたくさん質問していて、私は毎回DTO,DAOを勧めています。
腐った土台に家を建てても仕方ありません、先ずは土台を綺麗にすることをお勧めします。

投稿2016/11/11 09:39

yona

総合スコア18155

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Haru_T

2016/11/11 09:55

ここまで進めてしまったので手間なんだろうなと勝手に思い作ろうとしてませんでしたが、DTOについて何度もアドバイスを頂いたり調べたりする中でやはり作った方が良いということは分かりました。 自分なりに調べてDTOの作り方は分かりましたが、運用の仕方が分かりません。 たとえば他のActivityでDataBaseHelperを使ったように、newするだけで使えるのでしょうか? とりあえず今はAndroid Studioが扱える状況にないので明日試してみます。
yona

2016/11/11 10:00

このまま勧めて行った方が取り返しのつかない状態になります。 DTOはただの責任が明確になっているクラスです、インスタンス化して使えます。 Activityからデータベースに関する処理を取り除きましょう。
Haru_T

2016/11/12 07:39

つまり簡単に言うと、Activityに記述しているDBに関することは全部DTOクラスに記述すればいいってことですよね。DTOクラス内でDataBaseHelperを呼び出して、Sql文も記述してその結果を他のActivityに渡せばいいのですか?
guest

0

ベストアンサー

現状のソースを出来る限り変更せずに実現させるのであれば下記の様に
Adapterに渡しているデータとポジションをリンクさせた配列をもう一つ生成すれば可能です。

super.onCreate(savedInstanceState); setContentView(R.layout.activity_list); final ListView mListView = (ListView) findViewById(R.id.word_list); dbhelper = new DataBaseHelper(this); databaseObject = dbhelper.getReadableDatabase(); final ArrayList<String> data = new ArrayList<String>(); final List<Map<String, String>> dataItems = new ArrayList<Map<String, String>>(); final String query = "SELECT * " + "FROM WordData"; final Cursor cursor = databaseObject.rawQuery(query, null); cursor.moveToFirst(); for (int i = 0; i < cursor.getCount(); i++) { data.add(cursor.getString(0)); Map<String, String> map = new HashMap<String, String>(); map.put("pron", cursor.getString(1)); // cursorからのデータの取得に関してはテーブルの構成によるので適宣変更してください map.put("imi", cursor.getString(2)); // cursorからのデータの取得に関してはテーブルの構成によるので適宣変更してください dataItems.add(map); cursor.moveToNext(); } cursor.close(); databaseObject.close(); ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, data); mListView.setAdapter(adapter); mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { AlertDialog.Builder diag = new AlertDialog.Builder(ListActivity.this); Map<String, String> map = dataItems.get(position); // ダイアログの表示内容 TextView textview = (TextView)view; diag.setTitle(textview.getText() +"【" + map.get("pron") + "】");/*pron1というのは発音記号を指します*/ diag.setMessage(map.get("pron")); /*もちろん「意味」という言葉ではなく、意味を表示させたい*/ // ダイアログに表示するボタンの定義 DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener(){ public void onClick(DialogInterface dialog, int which) { setResult(RESULT_OK); } }; // ダイアログに表示するボタンの設定 diag.setPositiveButton("OK",listener); // ダイアログの作成、表示 diag.create(); diag.show(); } });

仮に私が実装するのであればですが
dataとdataItemsと二つの配列を保持していないといけないのはスマートではないので
Adapterをカスタマイズし、List<Map<String, String>>をdata引数としてとるように変更するかと思います。
参考までにAdapterのカスタマイズ方法のページを記載しておきます。

投稿2016/11/11 09:10

yag

総合スコア100

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Haru_T

2016/11/12 07:57

回答ありがとうございます。 できました!Mapを使えばよかったんですね。 アドバイスも参考にしてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問