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

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

ただいまの
回答率

90.50%

  • Android

    7095questions

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

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

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 3,460

ryo_se

score 66

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • shigeo.h

    2015/07/15 15:13

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

    よろしくお願いします。

    キャンセル

  • ryo_se

    2015/07/15 16:07


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


    ソースコードを追記しました。

    キャンセル

回答 1

0

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

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

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


投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • Android

    7095questions

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