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
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/02/02 05:15
2017/02/02 05:21
2017/02/02 05:39