How to add EditText in listview and get its value dynamically in all the rows?
android, android-edittext, checkbox, listview, scroll
Solution
you can achieve this using the custom list view.
find the example of listview with edittext is here
Problem
I have Checkbox and EditText and a Textview in a listView. It gets value for the text view from a list. Checkbox will be checked dynamically. In the same way EditText also can be entered dynamically. Now my problem is, When i scroll the list view (up and down) after entering the text in the Edit text, I could not get the typed value. I check the check box also like that. But using the position, I set it correct. I Could not know How to set the EditText value to the list properly. Please help me. Here is my code: main.xml: (Main xml for launch) ``` <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <ListView android:id="@+id/my_list" android:layout_width="fill_parent" android:layout_height="250px" /> <Button android:text="Save" android:id="@+id/btnSave" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </LinearLayout> ``` row.xml: (ListView Row) ``` <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:id="@+id/label" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@+id/label" android:textSize="30sp"/> <CheckBox android:id="@+id/check" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <EditText android:text="" android:id="@+id/txtAddress" android:layout_width="150px" android:layout_height="wrap_content"/> </LinearLayout> ``` Model.Java: (It is the POJO class) ``` package com.checkboxlistview; public class Model { private String name; private boolean selected; private String address; public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public void setName(String name) { this.name = name; } public Model(String name) { this.name = name; } public String getName() { return name; } public boolean isSelected() { return selected; } public void setSelected(boolean selected) { this.selected = selected; } } ``` MyAdapter.Java: (This is used to Hold the view in the list view using the converter and holder) ``` package com.checkboxlistview; import java.util.List; import android.app.Activity; import android.text.Editable; import android.text.TextWatcher; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.EditText; import android.widget.TextView; public class MyAdapter extends ArrayAdapter<Model> implements TextWatcher { private final List<Model> list; private final Activity context; int listPosititon; public MyAdapter(Activity context, List<Model> list) { super(context, R.layout.row, list); this.context = context; this.list = list; } static class ViewHolder { protected TextView text; protected CheckBox checkbox; protected EditText address; } @Override public View getView(int position, View convertView, ViewGroup parent) { listPosititon = position; ViewHolder viewHolder = null; if (convertView == null) { LayoutInflater inflator = context.getLayoutInflater(); convertView = inflator.inflate(R.layout.row, null); viewHolder = new ViewHolder(); viewHolder.text = (TextView) convertView.findViewById(R.id.label); viewHolder.checkbox = (CheckBox) convertView .findViewById(R.id.check); viewHolder.address = (EditText) convertView .findViewById(R.id.txtAddress); viewHolder.checkbox .setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { int getPosition = (Integer) buttonView.getTag(); //Here we get the position that we have set for the checkbox using setTag. list.get(getPosition).setSelected( buttonView.isChecked()); // Set the value of checkbox to maintain its state. } }); viewHolder.address.addTextChangedListener(this); convertView.setTag(viewHolder); convertView.setTag(R.id.label, viewHolder.text); convertView.setTag(R.id.check, viewHolder.checkbox); convertView.setTag(R.id.txtAddress, viewHolder.address); } else { viewHolder = (ViewHolder) convertView.getTag(); } viewHolder.checkbox.setTag(position); // This line is important. viewHolder.text.setText(list.get(position).getName()); viewHolder.checkbox.setChecked(list.get(position).isSelected()); if (list.get(position).getAddress() != null) { viewHolder.address.setText(list.get(position).getAddress() + ""); } else { viewHolder.address.setText(""); } return convertView; } @Override public void afterTextChanged(Editable s) { list.get(listPosititon).setAddress(s.toString()); } @Override public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { // TODO Auto-generated method stub } @Override public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { // TODO Auto-generated method stub } } ``` MainActivity.java (This is the activity): ``` package com.checkboxlistview; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.ListView; import android.widget.Toast; public class MainActivity extends Activity { ListView listView; Button btnSave; ArrayAdapter<Model> adapter; List<Model> list = new ArrayList<Model>(); public void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.main); listView = (ListView) findViewById(R.id.my_list); btnSave = (Button)findViewById(R.id.btnSave); adapter = new MyAdapter(this,getModel()); listView.setAdapter(adapter); btnSave.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { for (int i = 0; i < list.size(); i++) { Toast.makeText(getBaseContext(), "Name : "+list.get(i).getName() +" Selected: "+list.get(i).isSelected(), Toast.LENGTH_SHORT).show(); } } }); } private List<Model> getModel() { list.add(new Model("Linux")); list.add(new Model("Windows7")); list.add(new Model("Suse")); list.add(new Model("Eclipse")); list.add(new Model("Ubuntu")); list.add(new Model("Solaris")); list.add(new Model("Android")); list.add(new Model("iPhone")); list.add(new Model("Java")); list.add(new Model(".Net")); list.add(new Model("PHP")); return list; } } ``` There is no error in the code. It runs well. I could maintain the checkbox position and display at the same position even I scroll up and down. But I could not get and set the EditText value properly. Please Help me out. Thanks in advance.