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

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

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

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

Android

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

Android Studio

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

Q&A

解決済

3回答

1890閲覧

searchviewを使用後、詳細内容が検索結果と一致しない

Haru_T

総合スコア34

SQLite

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

Android

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

Android Studio

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

0グッド

0クリップ

投稿2017/02/01 03:22

listviewを使ったアプリを開発しています。
一覧を並べアイテムをタップすると詳細情報が表示される仕組みです。
データ数が多いためsearchviewを使用してより使いやすいものにしようと考えています。
しかし、ダイアログの詳細内容はposition取得によって行っているため、検索した後にアイテムをタップすると、検索前のpositionに値する情報の詳細が表示されてしまいます。

私なりに考えたみたところでは、listviewの一覧を配列にするか、検索語にもSQL文を使うことで解決できるのかなと考えてみたのですが、、、
アドバイスお願いします。

java

1public class ListActivity extends AppCompatActivity implements TextToSpeech.OnInitListener { 2 // ListViewで一覧を表示 3 private SQLiteDatabase databaseObject; 4 private DataBaseHelper dbhelper = null; 5 private static TextToSpeech tts; 6 private String word; 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 final List<Map<String, String>> dataItems = new ArrayList<Map<String, String>>(); 20 21 final String query = "SELECT * FROM WordData"; 22 final Cursor cursor = databaseObject.rawQuery(query, null); 23 cursor.moveToFirst(); 24 for (int i = 0; i < cursor.getCount(); i++) { 25 data.add(cursor.getString(0)); 26 27 Map<String, String> map = new HashMap<String, String>(); 28 map.put("pron1", cursor.getString(1)); 29 map.put("pron2", cursor.getString(2)); 30 map.put("mean1", cursor.getString(3)); 31 map.put("mean2", cursor.getString(4)); 32 map.put("description", cursor.getString(5)); 33 map.put("part", cursor.getString(6)); 34 dataItems.add(map); 35 36 cursor.moveToNext(); 37 } 38 39 cursor.close(); 40 databaseObject.close(); 41 42 ArrayAdapter<String> adapter 43 = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, data); 44 mListView.setAdapter(adapter); 45 46 tts = new TextToSpeech(this, this); 47 48 mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 49 @Override 50 public void onItemClick(AdapterView<?> parent, 51 View view, int position, long id) { 52 53 AlertDialog.Builder diag = new AlertDialog.Builder(ListActivity.this); 54 Map<String, String> map = dataItems.get(position); 55 56 TextView textview = (TextView)view; 57 word = (String) textview.getText(); 58 diag.setTitle(word +"【" + map.get("pron1") + map.get("pron2") + "】"); 59 diag.setMessage( "品詞:" + map.get("part") + "\n" + map.get("mean1") 60 + "\n" + map.get("mean2") + "\n" + map.get("description")); 61 62 // ダイアログに表示するボタンの定義 63 DialogInterface.OnClickListener listener 64 = new DialogInterface.OnClickListener(){ 65 public void onClick(DialogInterface dialog, int which) { 66 setResult(RESULT_OK); 67 } 68 }; 69 70 diag.setPositiveButton("OK",listener); // 表示ボタンの設定 71 diag.create(); // ダイアログ作成 72 diag.show(); // ダイアログ表示 73 } 74 }); 75 76 mListView.setTextFilterEnabled(true); 77 78 // 検索Wordを入力したときの処理 79 SearchView sv = (SearchView) findViewById(R.id.search); 80 sv.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 81 @Override 82 public boolean onQueryTextSubmit(String text) { 83 if (text == null || text.equals("")) { 84 mListView.clearTextFilter(); 85 } else { 86 87 mListView.setFilterText(text); 88 } 89 return false; 90 } 91 92 public boolean onQueryTextChange(String newText) { 93 return false; 94 } 95 }); 96

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

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

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

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

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

guest

回答3

0

ArrayAdapterの中身は、setFilterTextした後の見た目と連動しています。

(実際は逆で、ArrayAdapterの中身がFilterによって変わった場合に、
ArrayAdapter自身が、notifyDataSetChangedを呼び出すことで、
ListViewの更新が行われているのですが・・・)

とりあえず、adapter.getItem(position)で、見た目と関係性があるデータを取得することが出来ます。

問題は、表示用のデータと、内部的なデータが別々で管理されているという点ですが・・・
1件分のデータを管理するクラスを作り、SQL読み込みで件数分のインスタンスを生成、
そのリストで、ArrayAdapterを生成してしまってください。

Java

1final ArrayList<HogeClass> data = new ArrayList<>(); 2 3final Cursor cursor = databaseObject.rawQuery(query, null); 4cursor.moveToFirst(); 5 6HogeClass tmpHoge; 7 8for (int i = 0; i < cursor.getCount(); i++) { 9 tmpHoge = new HogeClass( 10 cursor.getString(0), 11 cursor.getString(1), 12 cursor.getString(2), 13 cursor.getString(3), 14 cursor.getString(4), 15 cursor.getString(5), 16 cursor.getString(6)); 17 data.add(tmpHoge); 18 cursor.moveToNext(); 19} 20cursor.close(); 21databaseObject.close(); 22ArrayAdapter<HogeClass> adapter 23 = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, data);

こんな感じ、
表示される文字はどうなるのかというと、
StringなどのCharSequenceを継承したクラス以外が型に指定された場合
toString()の値を参照するようになります。

HogeClass内でtoString()をオーバーライドし、cursor.getString(0)の値が返るようにしたら、
特にgetView()等をいじらなくても、目的の文字を表示できるようになります。

(なるはずです・・・)

投稿2017/02/01 05:30

abs123

総合スコア1280

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

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

Haru_T

2017/02/02 05:15

mapを使わずにってことですかね? Hogeclassに関してあまり知識がないので調べて試してみようと思います。ありがとうございます! データの管理は、全部一緒にしようと思います(^^)
abs123

2017/02/02 05:21

HogeClassのHogeはメタ構文変数といって特に意味はないので気にしないで!! 自分で新しいクラス作ってくださいってことです!! (hogeはもう伝わらないのか・・・)
Haru_T

2017/02/02 05:39

私の知識が乏しいだけです。 調べたら、聞いたことありました(^^;) 新しいクラス内でcursor.getString(0)の値が返るように、ということですね。 知識が乏しいので調べてばっかりです、、頑張ります。
guest

0

dataItemsからデータを取得しているからですね。こちらにはフィルターされる前のデータが入っているので前のデータが取得されるんだと思いますよ。
onItemClickの第一引数からデータを取得するようにしましょう。

投稿2017/02/01 04:30

yona

総合スコア18155

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

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

Haru_T

2017/02/02 04:58

parentってことですよね。 調べてみたところ、オブジェクトを用意するということなのですが、、 Mapを使っているのですが応用はできますか?
yona

2017/02/02 05:29

できます。 Mapが取得できます。
Haru_T

2017/02/02 06:31

色々調べて記述を変えたりしているのですが、うまくいきません。 値取得の部分をこのようにしてみました。 Map<String, String> map = (Map<String,String>)parent.getItemAtPosition(position); そもそもこのままではgetItemAtPositionは使えないのでしょうか、、
yona

2017/02/02 07:45

parentの型はAdapterViewですよね? この型はListViewのスーパークラスです。 だから(ListView)parentというキャストが出来ます。
guest

0

自己解決

アドバイスいただいた方法を試すも、知識が乏しいせいでうまくいかず。
結局、初めに一覧にするものだけを取り出してListviewにsetし、
クリックイベントでもう一度DB検索を行うことにしました。
クリックしたアイテムと一致する行を取り出し、
そちらをmapにしてダイアログに出力させることとしました。
アドバイスを生かせませんでしたが、ほかにもやり方があることを知り、
調べることで新たな発見もあったので良かったです。ありがとうございました。

投稿2017/02/02 07:19

Haru_T

総合スコア34

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問