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

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

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

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

Q&A

1回答

7566閲覧

android ListView内に設置したEditTextの値取得

ryo_se

総合スコア68

Android

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

0グッド

0クリップ

投稿2015/07/14 06:56

編集2015/07/15 07:05

android開発を行っております。

DBから取得した1カラム分のデータをListViewのEditTextに各々表示させ、ListView内の各行に表示されている更新ボタンを押すと
EditTextに入力されている文字を更新して登録するというプログラムを作っています。

現在更新ボタンをおしたときに、position情報を取得するところまではできたのですが、
position情報からEditTextの情報を取得しても入力内容変更前のデータしか取得することができません。

参考になりそうな文献が少ないため、方法をご教授していただければ幸いです。

追記

●DataBaseActivity.java

public class DataBaseActivity extends ActionBarActivity { static final String DB = "sqlite_sample.db"; static final int DB_VERSION = 1; static final String CREATE_TABLE = "create table mytable ( _id integer primary key autoincrement, data integer not null );"; static final String DROP_TABLE = "drop table mytable;"; static SQLiteDatabase mydb; private SimpleCursorAdapter myadapter; private static final String TAG = MainActivity.class.getSimpleName(); private ListView listview; private Button addbtn, delbtn, addTxtbtn; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_data_base); MySQLiteOpenHelper hlpr = new MySQLiteOpenHelper(getApplicationContext()); mydb = hlpr.getWritableDatabase(); Cursor cursor = mydb.query("mytable", new String[] {"_id", "data"}, null, null, null, null, "_id DESC"); String[] from = new String[] {"_id", "data"}; int[] to = new int[] {R.id.db_id, R.id.db_data}; startManagingCursor(cursor); myadapter = new SimpleCursorBtnAdapter(this,R.layout.db_text, cursor, from, to,R.id.btn_update); listview = (ListView)findViewById(R.id.db_listView); listview.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { update(parent,view,position,id); } }); listview.setAdapter(myadapter); } private static class MySQLiteOpenHelper extends SQLiteOpenHelper { public MySQLiteOpenHelper(Context c) { super(c, DB, null, DB_VERSION); } public void onCreate(SQLiteDatabase db) { db.execSQL(CREATE_TABLE); } public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL(DROP_TABLE); onCreate(db); } } /** * 更新を行う(未完成) * @param parent * @param view * @param position * @param id */ private void update(AdapterView<?> parent, View view, int position, long id) { ListView listView = (ListView) parent; Cursor item = (Cursor)listView.getItemAtPosition(position); int lgin_id = item.getInt(item.getColumnIndex("_id")); String lgin_name = item.getString(item.getColumnIndex("data")); Log.d("ItemClick", "id="+lgin_id+", data=" + lgin_name); } }

●DataBaseActivity.java

/** * ListViewにおけるボタン要素のポジション取得アダプター * Created by r-aga on 2015/07/13. */ public class SimpleCursorBtnAdapter extends SimpleCursorAdapter { private int mButton; public SimpleCursorBtnAdapter(Context context, int layout, Cursor c, String[] from, int[] to, int button) { super(context, layout, c, from, to); mButton = button; } public View getView(final int position, View convertView, final ViewGroup parent) { View view = super.getView(position, convertView, parent); Button btn = (Button) view.findViewById(mButton); btn.setTag(position); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg) { AdapterView.OnItemClickListener listener = list.getOnItemClickListener(); long id = getItemId(position); listener.onItemClick((AdapterView<?>) parent, arg, position, id); } }); return view; } }

不要な部分は削除したので、おかしなところがあるかもしれません。
ListViewにおいて、更新ボタンを押した時のpositionを作成するために、アダプターを自前で用意しています。
参考サイト
http://blogs.gine.jp/taka/archives/2966

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

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

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

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

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

shigeo.h

2015/07/15 06:13

以下2点お願いします。 ①EditTextの内容が更新されたタイミングで何か処理をしていますか? (Adapterへ渡しているデータの更新など) ②「position情報からEditTextの情報を取得」とは具体的にどのような処理でしょうか? よろしくお願いします。
ryo_se

2015/07/15 07:07

① EditTextの内容が更新されたタイミングでは現在処理はしていません。 TextWatcher等を使用して値を取得するといった例があるようですが、具体的な参考例がなく現在も取得できていません。 ② ソースコードを追記しました。
guest

回答1

0

listView.getItemAtPosition(position)は内部で adapter.getItemId(position)しています。
なのでSimpleCursorBtnAdapterに渡しているCursorの中身を参照します。
※「Cursorの中身・・・」というのは少し語弊があるかもしれませんが、
表示内容を参照せず、元データを参照するという意味では同じだと思います。

で現状ですが、EditTextを変更してもCursorの中身は更新されていないため、
入力内容変更前のデータしか取得することができません。

解決方法としては、listView上のEditTextにaddTextChangedListenerしてあげて、
入力内容変更後の値を保持すればよいと思います。
ListなどをAdapterに渡している場合には、Listの該当する箇所を更新すればよいと思います。
今回のようにCursorの場合は同様のことができるかは、申し訳ないですがわかりません。

投稿2015/07/15 08:02

shigeo.h

総合スコア90

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問