teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

3

質問内容をより詳細な物に変更

2020/09/13 13:42

投稿

UTF-8
UTF-8

スコア1

title CHANGED
File without changes
body CHANGED
@@ -2,26 +2,61 @@
2
2
  androidを勉強しています。拙い質問ですがご容赦下さい。
3
3
  ListViewにFilter()を使ってフィルタリングをしています。
4
4
  メモ帳を作っており、ListViewの項目を選択するとそれに対応したメモ編集画面に遷移する簡単なものです。
5
+ メモ画面への遷移、データの管理にUUIDによって生成した乱数を使用しており、これをデータベースのuuidというテーブルに格納しています。
5
- フィルターを掛けた後リスト正しくアクセス出来ればと思っております。
6
+ idってDBレコードの検索、削除等の処理を行っています。
7
+ positionに非常に依存しており、filter()を掛けた後のpositionの位置では対応できなくなってしまいました。(フィルター後のリスト選択でフィルター前のpositionのデータを参照してしまう)
8
+ 以下のソースコードでpositionに依存しない参照方法などありますでしょうか?
9
+ この構造自体がよろしくないような気もしてきました。
6
10
 
7
- ### 発生している問題・エラーメッセージ
8
- フィルタリング自体は正常に行われるのですが、フィルタリングされたリストを選択すると、フィルタリングされる前に表示されているリストの項目に飛んでしまいます。
9
-
10
11
  ### 該当のソースコード
11
12
 
12
13
  ```java
13
- final SimpleAdapter simpleAdapter = new SimpleAdapter(this
14
- , memoList // メモリストデータ格納ているArrayList
14
+ // リスト項目クリックたときの処理
15
- , android.R.layout.simple_expandable_list_item_2 //使用するレイアウト
15
+ listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
16
+
16
- , new String[]{"title","time"} // タイトル、現在時刻
17
+ public void onItemClick(AdapterView<?> parent, View view, int position, long id){
18
+ Intent intent = new Intent(ListActivity.this, jp.wings.nikkeibp.simplememo.CreateActivity.class);
19
+ // クリックされたリストに格納されたデータを参照する処理
17
- , new int[]{android.R.id.text1,android.R.id.text2});
20
+ String idStr = memoList.get(position).get("id");
18
- filter = simpleAdapter.getFilter();
19
- // idがmemoListのListView取得
21
+ // 新規作成かどうかを判断するidを引き渡す
22
+ // このuuidは遷移先でSELECT検索する際に使用します
20
- ListView listView = findViewById(R.id.memoList);
23
+ intent.putExtra("uuid",idStr);
21
- // フィルター機能ON
24
+ // Activity遷移
22
- listView.setTextFilterEnabled(true);
23
- listView.setAdapter(simpleAdapter);
25
+ startActivity(intent);
26
+ }
27
+ });
24
28
  ```
29
+ ```java
30
+ // リスト項目を長押しクリックした時の処理
31
+ listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener(){
32
+ public boolean onItemLongClick(AdapterView<?> parent, View view, final int position, long id) {
33
+ // クリックされたリストに格納されたデータを参照する処理
34
+ final String idStr = memoList.get(position).get("uuid");
35
+ //アラートダイアログ
36
+ final AlertDialog.Builder builder = new AlertDialog.Builder(ListActivity.this);
37
+ builder.setTitle("選択してください");
38
+ builder.setItems(items, new DialogInterface.OnClickListener() {
39
+ @Override
40
+ public void onClick(DialogInterface dialog, int which) {
41
+ //削除する が選択された場合
42
+ if(which == 0){
43
+ // 長押しした項目をデータベースから削除
44
+ SQLiteDatabase db = helper.getWritableDatabase();
45
+ try { db.execSQL("DELETE FROM MEMO_TABLE WHERE uuid = '"+ idStr +"'"); }
46
+ finally { db.close(); }
47
+ // 長押しした項目を画面から削除
48
+ memoList.remove(position);
49
+ simpleAdapter.notifyDataSetChanged();
50
+ } else if (which == 1){
51
+ } else { }
52
+ }
53
+ });
54
+ builder.show();
55
+ // trueにすることで通常のクリックイベントを発生させない
56
+ return true;
57
+ }
58
+ });
59
+ ```
25
60
 
26
61
  ```java
27
62
  private SearchView.OnQueryTextListener onQueryTextListener = new SearchView.OnQueryTextListener() {
@@ -38,9 +73,8 @@
38
73
  };
39
74
  ```
40
75
 
41
- ### 試したこと
42
- 調べたところフィルタリングされたリストのpositionを別の配列で管理するところまではわかったのですが、既存のfilterを使用している手前、何処でposition等の項目を管理すればよいか分かりませんでした。
43
76
 
44
77
  ### 補足情報(FW/ツールのバージョンなど)
45
78
 
46
- フィルターはアダプターに用意されているものをそのまま使っています。
79
+ フィルターはアダプターに用意されているものをそのまま使っています。
80
+ memoListはDBから取り出したデータを格納しているArrayListです。

2

タイトルをわかりやすく修正

2020/09/13 13:42

投稿

UTF-8
UTF-8

スコア1

title CHANGED
@@ -1,1 +1,1 @@
1
- [android] Filter()後のpositionがおかし
1
+ [android] ListViewのFilter()後のデータ参照につ
body CHANGED
File without changes

1

ソースコード一部修正

2020/09/13 13:02

投稿

UTF-8
UTF-8

スコア1

title CHANGED
File without changes
body CHANGED
@@ -16,6 +16,11 @@
16
16
  , new String[]{"title","time"} // タイトル、現在時刻
17
17
  , new int[]{android.R.id.text1,android.R.id.text2});
18
18
  filter = simpleAdapter.getFilter();
19
+ // idがmemoListのListViewを取得
20
+ ListView listView = findViewById(R.id.memoList);
21
+ // フィルター機能ON
22
+ listView.setTextFilterEnabled(true);
23
+ listView.setAdapter(simpleAdapter);
19
24
  ```
20
25
 
21
26
  ```java