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

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

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

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

2回答

800閲覧

Listview内のアダプターを使用したEditTextの処理について

tinkai

総合スコア17

Android

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2018/09/28 10:47

編集2018/09/28 14:52

ListView内のアダプターを使用したEditTextの処理について困っています。
ご回答よろしくお願いします。

###実現したいこと
EditTextの内容を変更しても表示が消えないこと。変更が反映されること。
そのために、編集したEditTextの内容を適切なItemクラスに反映させること。

###問題点
新しくEditTextを作成し、その中身を編集し、キーボードを消したときに編集内容が消えてしまいます。
これはアダプターにセットしたListが更新されていないからだと思っています。
具体的には以下のような動作をします。

1.初期画面 2.項目を追加するボタンを押下した後
初期画面 ボタン押下後
3.編集 4.キーボードを閉じた後(編集画像の左下ボタンを押した後)
編集 キーボードを閉じた後

###試したこと
ItemListAdapterクラスのコメントアウト部分です。
getView()内でEditTextを取得し、文字列に変換します。
その結果が空文字でなければItemにセットするという処理です。

しかし、思っているようなものにはなりませんでした。

###プログラム
MainActivity.java

lang

1public class MainActivity extends AppCompatActivity { 2 private ArrayList<Item> itemList; 3 private ItemListAdapter itemListAdapter; 4 5 @Override 6 protected void onCreate(Bundle savedInstanceState) { 7 super.onCreate(savedInstanceState); 8 setContentView(R.layout.activity_main); 9 10 ListView itemListView = findViewById(R.id.item_list); 11 12 this.itemList = new ArrayList<>(); 13 this.itemListAdapter = new ItemListAdapter(this); 14 this.itemListAdapter.setItemList(this.itemList); 15 itemListView.setAdapter(this.itemListAdapter); 16 17 // サンプルデータ 18 for (int i = 0; i < 3; i++) { 19 String itemName = "sampleName" + i; 20 String itemInfo = "sampleInfo" + i; 21 addItem(); 22 Item item = this.itemList.get(this.itemList.size()-1); 23 item.setName(itemName); 24 item.setInfo(itemInfo); 25 } 26 27 Button addButton = findViewById(R.id.item_add_button); 28 addButton.setOnClickListener(new View.OnClickListener() { 29 @Override 30 public void onClick(View v) { 31 addItem(); 32 } 33 }); 34 } 35 36 private void addItem() { 37 Item item = new Item(); 38 this.itemList.add(item); 39 this.itemListAdapter.notifyDataSetInvalidated(); 40 } 41}

activity_main.xml

lang

1<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:app="http://schemas.android.com/apk/res-auto" 3 xmlns:tools="http://schemas.android.com/tools" 4 android:layout_width="match_parent" 5 android:layout_height="match_parent" 6 android:orientation="vertical" 7 tools:context=".MainActivity"> 8 9 <ListView 10 android:id="@+id/item_list" 11 android:layout_width="match_parent" 12 android:layout_height="0dp" 13 android:layout_weight="9"> 14 </ListView> 15 16 <Button 17 android:id="@+id/item_add_button" 18 android:layout_width="match_parent" 19 android:layout_height="0dp" 20 android:layout_weight="1" 21 android:text="Add Item"/> 22 23</LinearLayout>

Item.java

lang

1public class Item { 2 private long id; 3 private String name; 4 private String info; 5 6 public long getId() { 7 return this.id; 8 } 9 10 public void setId(long id) { 11 this.id = id; 12 } 13 14 public String getName() { 15 return this.name; 16 } 17 18 public void setName(String name) { 19 this.name = name; 20 } 21 22 public String getInfo() { 23 return this.info; 24 } 25 26 public void setInfo(String info) { 27 this.info = info; 28 } 29}

ItemListAdapter.java

lang

1public class ItemListAdapter extends BaseAdapter { 2 private Context context; 3 private LayoutInflater layoutInflater = null; 4 private ArrayList<Item> itemList; 5 6 public ItemListAdapter(Context context) { 7 this.context = context; 8 this.layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 9 } 10 11 public void setItemList(ArrayList<Item> itemList) { 12 this.itemList = itemList; 13 } 14 15 @Override 16 public int getCount() { 17 return this.itemList.size(); 18 } 19 20 @Override 21 public Object getItem(int position) { 22 return this.itemList.get(position); 23 } 24 25 @Override 26 public long getItemId(int position) { 27 return this.itemList.get(position).getId(); 28 } 29 30 @Override 31 public View getView(int position, View convertView, ViewGroup parent) { 32 convertView = layoutInflater.inflate(R.layout.layout_item_row, parent, false); 33 34 Item item = this.itemList.get(position); 35 36 EditText itemName = convertView.findViewById(R.id.item_name); 37 /* 38 String name = String.valueOf(itemName.getText()); 39 if (!name.equals("")) { 40 item.setName(name); 41 } 42 */ 43 itemName.setText(item.getName()); 44 45 EditText itemInfo = convertView.findViewById(R.id.item_info); 46 /* 47 String info = String.valueOf(itemInfo.getText()); 48 if (!info.equals("")) { 49 item.setInfo(info); 50 } 51 */ 52 itemInfo.setText(item.getInfo()); 53 54 return convertView; 55 } 56}

layout_item_row.xml

lang

1<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 android:layout_width="match_parent" 3 android:layout_height="match_parent" 4 android:orientation="horizontal"> 5 6 <EditText 7 android:id="@+id/item_name" 8 android:layout_width="0dp" 9 android:layout_height="wrap_content" 10 android:layout_weight="1" 11 android:hint="Name"/> 12 13 <EditText 14 android:id="@+id/item_info" 15 android:layout_width="0dp" 16 android:layout_height="wrap_content" 17 android:layout_weight="1" 18 android:hint="Info"/> 19 20</LinearLayout>

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

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

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

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

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

guest

回答2

0

自己解決

Adapter内のgetView()での処理部分を以下のように直すことで実現できました。
getView()のconvertViewが毎回作成されているため、EditTextがリセットされていたようです。
そのため、ifで一回目だけレイアウトを作成して、文字列をセットする処理を加えました。
それ以降はEditTextの中身をItemに反映させるようにすることで実現できました。

Java

1@Override 2 public View getView(int position, View convertView, ViewGroup parent) { 3 // 一度目だけ呼ばれる 4 if (convertView == null) { 5 Log.d("log", "NewConvertView"); 6 convertView = layoutInflater.inflate(R.layout.layout_item_row, parent, false); 7 8 Item item = this.itemList.get(position); 9 10 EditText itemName = convertView.findViewById(R.id.item_name); 11 itemName.setText(item.getName()); 12 13 EditText itemInfo = convertView.findViewById(R.id.item_info); 14 itemInfo.setText(item.getInfo()); 15 } 16 17 // itemリストにEditTextの文字列を登録 18 Item item = this.itemList.get(position); 19 20 EditText itemName = convertView.findViewById(R.id.item_name); 21 String name = String.valueOf(itemName.getText()); 22 item.setName(name); 23 24 EditText itemInfo = convertView.findViewById(R.id.item_info); 25 String info = String.valueOf(itemInfo.getText()); 26 item.setInfo(info); 27 28 for (Item i : this.itemList) { 29 Log.d("log", "=======" + i.getName()); 30 Log.d("log", "=======" + i.getInfo()); 31 } 32 33 return convertView; 34 }

投稿2018/09/29 09:15

tinkai

総合スコア17

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

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

0

edittextを終えるときに更新するようにしてみたらどうですか?

もし、listのなかにedittextをいれなくてもいいのであれば、ダイアログをもちいて値の入力編集の管理をするのが楽なのかも...

参考
edittext入りのダイアログ
http://systemengineer.site/archives/4090846.html

listviewの更新
https://qiita.com/usugita_san/items/5989dcb2d352b21786f2

https://akira-watson.com/android/listview_3.html

投稿2018/09/28 12:42

rainy_073

総合スコア15

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問