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

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

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

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

Android

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

Q&A

3回答

6559閲覧

カスタムリストビューのクリックした項目の情報を取得する方法

seiya1311

総合スコア27

SQLite

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

Android

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

0グッド

4クリップ

投稿2014/09/21 13:08

###ToDoアプリを作成するためのリストビューの表示です。

たびたびすみません。ソースも修正しました。

職業訓練で卒業制作をかねて、趣味のコミケのチェックリストを作成しています。
ここでは、コミケの持ち物をチェックするリストなのでToDoリストのようなイメージです。

リストを表示して、リストのアイテムをクリックすると
コンテキストメニューを出して編集するか削除したいと考えています。

データベースに格納しているので、
リストビューのPOSITION->データベースのID->そのカラムを取得できれば
やりたいことを満たせると思っていますが、取得できていません。

onTouchItemEventなどで取得しようとしましたが、うまく取得できませんでした。
継承するファイルをListActivityにして
また、コンテキストメニューでデータを取得しようとしてもうまくいきません。

カスタムリストビューの構成は
チェックボックスとテキストビューです。
このデータをSQLLiteに
id、チェックしたかのデータ(boolean)、アイテム(テキスト)
で格納しています。

何かいい取得する方法があれば教えてください。
お願いいたします。

###遷移イメージ
![イメージ説明]WIDTH:320
![イメージ説明]WIDTH:320

###ファイルの構成
上記の処理は別ファイルにしています。

  • カスタムリストビューとリストビュー高速化
  • DBへ接続する書き込みする

lang

1package com.example.comikechecklist; 2 3import java.util.ArrayList; 4import java.util.List; 5 6import android.app.Activity; 7import android.content.Intent; 8import android.database.Cursor; 9import android.os.Bundle; 10import android.view.ContextMenu; 11import android.view.ContextMenu.ContextMenuInfo; 12import android.view.Menu; 13import android.view.MenuItem; 14import android.view.View; 15import android.view.View.OnClickListener; 16import android.widget.AdapterView; 17import android.widget.AdapterView.OnItemSelectedListener; 18import android.widget.Button; 19import android.widget.ListView; 20 21import com.example.comikecheckdb.DBConnection; 22import com.example.comikecheckdb.DataBaseAdapter; 23import com.example.comikecheckparts.CustomAdapter; 24import com.example.comikecheckparts.CustomItem; 25 26public class ItemListActivity extends Activity { 27 28 // フィールド 29 private DataBaseAdapter helper; 30 31 @Override 32 protected void onCreate(Bundle savedInstanceState) { 33 super.onCreate(savedInstanceState); 34 setContentView(R.layout.activity_item_list); 35 36 // データベース接続処理、アイテム表示 37 helper = new DataBaseAdapter(this); 38 DBConnection dao = new DBConnection(helper); 39 dao.open(DBConnection.DB_MODE_READ); 40 Cursor c = DBConnection.findAllCursor(); 41 dao.close(); 42 43 // リスト表示 44 List<CustomItem> list = new ArrayList<CustomItem>(); 45 do { 46 list.add(new CustomItem(c.getInt(1), c.getString(2))); 47 } while(c.moveToNext()); 48 49 ListView listView = (ListView)findViewById(R.id.list); 50 listView.setAdapter(new CustomAdapter(this, list)); 51 52 Button button = (Button)findViewById(R.id.button_item_add); 53 button.setOnClickListener(new OnClickListener() { 54 55 @Override 56 public void onClick(View v) { 57 Intent intent = new Intent(ItemListActivity.this, EditItemActivity.class); 58 startActivity(intent); 59 } 60 }); 61 62// CheckBox checkBox = (CheckBox)findViewById(R.id.check); 63 64 //コンテキストメニュー表示するための登録 65 registerForContextMenu(listView); 66 67 } 68 69 @Override 70 protected void onRestart() { 71 super.onRestart(); 72 reloadCursor(); 73 } 74 75 private void reloadCursor() { 76 // データベース接続処理、アイテム表示 77 helper = new DataBaseAdapter(this); 78 DBConnection dao = new DBConnection(helper); 79 dao.open(DBConnection.DB_MODE_READ); 80 Cursor c = DBConnection.findAllCursor(); 81 dao.close(); 82 83 List<CustomItem> list = new ArrayList<CustomItem>(); 84 do { 85 list.add(new CustomItem(c.getInt(1), c.getString(2))); 86 } while(c.moveToNext()); 87 88 } 89 90 @Override 91 public void onCreateContextMenu(ContextMenu menu, View v, 92 ContextMenuInfo menuInfo) { 93 super.onCreateContextMenu(menu, v, menuInfo); 94 getMenuInflater().inflate(R.menu.item_context_menu, menu); 95 } 96 97 @Override 98 public boolean onContextItemSelected(MenuItem item) { 99 switch (item.getItemId()) { 100 //編集処理 101 case R.id.context_menu1: 102 ListView listView = (ListView)findViewById(R.id.list); 103 listView.setOnItemSelectedListener(new OnItemSelectedListener() { 104 105 @Override 106 public void onItemSelected(AdapterView<?> parent, View v, 107 int position, long id) { 108 ListView listView = (ListView) parent; 109 CustomItem custom = (CustomItem) listView.getItemAtPosition(position); 110 } 111 112 @Override 113 public void onNothingSelected(AdapterView<?> parent) { 114 115 } 116 }); 117 Intent intent = new Intent(ItemListActivity.this, EditItemActivity.class); 118// intent.putExtra("item", custom.toString()); 119// intent.putExtra("id", id); 120 startActivity(intent); 121 122 return true; 123 //削除処理 124 case R.id.context_menu2: 125 return true; 126 default: 127 return super.onContextItemSelected(item); 128 } 129 130 } 131 132 @Override 133 protected void onSaveInstanceState(Bundle outState) { 134 super.onSaveInstanceState(outState); 135 } 136 137 @Override 138 protected void onRestoreInstanceState(Bundle savedInstanceState) { 139 super.onRestoreInstanceState(savedInstanceState); 140 } 141 142 143 @Override 144 public boolean onCreateOptionsMenu(Menu menu) { 145 // Inflate the menu; this adds items to the action bar if it is present. 146 getMenuInflater().inflate(R.menu.item_list, menu); 147 return true; 148 } 149 150 @Override 151 protected void onActivityResult(int requestCode, int resultCode, Intent data) { 152 super.onActivityResult(requestCode, resultCode, data); 153 154 } 155 156 @Override 157 public boolean onOptionsItemSelected(MenuItem item) { 158 // Handle action bar item clicks here. The action bar will 159 // automatically handle clicks on the Home/Up button, so long 160 // as you specify a parent activity in AndroidManifest.xml. 161 int id = item.getItemId(); 162 if (id == R.id.action_settings) { 163 return true; 164 } 165 return super.onOptionsItemSelected(item); 166 } 167 168}

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

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

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

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

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

guest

回答3

0

ListViewは外の枠なので、解決したい内容というのはAdapterの中にあります。
おそらく一番手っ取り早いのは、CursorAdapterというクラスを継承した独自Adapterを作ることです。
CursorAdapterを使わなくても
List<CustomItem> list = new ArrayList<CustomItem>();
do {
list.add(new CustomItem(c.getInt(1), c.getString(2)));
} while(c.moveToNext());
わざわざ上記のようにListにしないで、Cursor自体をAdapterに入れればいいと思います。
listView.setAdapter(new CustomAdapter(this, list));
ではなく
CustomAdapter adapter = new new CustomAdapter(this, c)
こんなかんじですね。
adapterの中身はどうなっていますか?

投稿2014/09/25 14:28

taptappun

総合スコア69

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

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

seiya1311

2014/09/26 00:00

taptappunさん 回答ありがとうございます。 CursorAdapterのほうがいいのですね。先生もそっちのほうでないとDB扱えないということだったので自分でも試してみます。 Adapterの中身はこんな感じです。 足りないものがあればいってください。 お願いします。 ```java package com.example.comikecheckparts; import java.util.List; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.CheckBox; import android.widget.TextView; import com.example.comikechecklist.R; public class CustomAdapter extends ArrayAdapter<CustomItem> { private LayoutInflater mInflater; private ViewHolder holder; private static class ViewHolder { private CheckBox checkBox; private TextView textView; public ViewHolder(View view){ this.checkBox = (CheckBox) view.findViewById(R.id.check); this.textView = (TextView) view.findViewById(R.id.item); } } // コンストラクタ public CustomAdapter(Context context, List<CustomItem> objects) { super(context, 0, objects); mInflater = (LayoutInflater)context.getSystemService( Context.LAYOUT_INFLATER_SERVICE); } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null ) { convertView = mInflater.inflate(R.layout.item_row, parent, false); holder = new ViewHolder(convertView); convertView.setTag(holder); } else { holder = (ViewHolder)convertView.getTag(); } CustomItem data = getItem(position); // 明示的にチェックボックスをオフ holder.checkBox.setChecked(false); if (data.getCheck() == 1) { holder.checkBox.setChecked(true); } holder.textView.setText(data.getItem()); return convertView; } } ```
taptappun

2014/09/26 15:47

ArrayAdapterはList向けのAdapterですね。私はよく万能なBaseAdapterを使います。 まぁ、どれ使っても要領は同じです。 基本的にAdapterの中の @Override public long getItemId(int position){ } のreturn に DBのIDを入れるとたしか、 OnItemSelectedListenerのidというのがその値になるはず。(とれなくても、AdapterからgetItemId(position)でクリックしたリストの位置のidはとれます。Adapterの中ではcursor.moveToPosition(int position)で該当の行へ、cursor.getString(int columnIndex)で値が取れます) ちなみに、 setOnItemSelectedListener と setOnItemClickListener 似てるんですが、挙動が微妙に違います。 基本的に setOnItemClickListener を使うことをおすすめします。 この他に Adapterの中で、 @Override public Object getItem(int position){ } でreturn でcursor自体を返すようにすることもできます。要領は↑のidと同じです。 またgetViewで色々やってますが、 チェックボックスは制御がめんどくさいので、 listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); でできるんならこっちを使うほうをお勧めします。 ViewHolderというのをつかっていますが、これも意図した表示にならなくなったり、メモリリークの元になるので今回のような場合では使わないほうがいいです。 getViewのreturnはListViewの一行分のViewです。convertViewがまさにその一行分のViewで最初にlayoutを定義したら、残りのViewはすべてconvertViewを使いまわしているだけです。convertViewの中にある。TextViewとかは文字だけ変えれば使い回しができます。 こんなかんじで実現できると思います。
seiya1311

2014/09/28 20:27

taptappunさん 返事が遅くなり申し訳ございません。 丁寧な説明ありがとうございます。 読んでいるとモヤモヤがとれてきたような感じがします。 週末は少し体調崩していたので、自分で方法とか考え直したり、再実装をしてみます。
seiya1311

2014/11/17 04:11

taptappunさん ほったらかしになってしまい申し訳ございません。 やりかたは違いますが、CursorAdapterを継承して取得することができました。 ありがとうございます。
guest

0

CustomAdapterをグローバル変数にした上でですが
ポジションさえ分かればadapter.getItem(position)で目的のCustomItemは取得できるかと。

投稿2014/09/24 10:38

soundsketcher

総合スコア38

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

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

seiya1311

2014/09/25 06:08

soundsketcherさん 返信、ご回答ありがとうございます。 onCreate、onContextItemSelectedとも ```java public void onItemClick(AdapterView<?> parent, View view, int position, long id) ``` で取得することができました。 しかしpositionとidが同じになりデータベースの書き込みへの書き込みがあやしくなりました。 CursorAdapterなのか確認しようと思います。
guest

0

斜め読みですみません。
CustomAdapter内でgetViewを使用したらうまくいかないでしょうか?

投稿2014/09/22 13:13

Akku

総合スコア21

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

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

seiya1311

2014/09/23 12:55

Akkuさん 早速の返信ありがとうございます。 getViewを呼び出して出来るか試してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問