如何在listview中添加EditText,并在所有行中dynamic获取它的值?

我有一个ListView中的checkbox和EditText和Textview。 它从列表中获取文本视图的值。 checkbox将被dynamic检查。 以同样的方式EditText也可以dynamicinput。 现在我的问题是,当我在编辑文本中input文本后滚动列表视图(上下),我无法得到键入的值。 我也检查checkbox。 但是使用这个位置,我把它设置正确。 我无法知道如何正确设置EditText值到列表。 请帮帮我。 这是我的代码:

main.xml:(主要的xml启动)

<?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 :(这是POJO类)

 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 :(这是用来保持列表视图使用转换器和持有人的观点)

 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(这是活动):

 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; } } 

代码中没有错误。 它运行良好。 我可以保持checkbox的位置,并显示在相同的位置,即使我上下滚动。 但我无法正确设置EditText值。 请帮助我。 提前致谢。

Solutions Collecting From Web of "如何在listview中添加EditText,并在所有行中dynamic获取它的值?"

您可以使用自定义列表视图来实现此目的。

用edittextfindlistview的例子就在这里

只要保持viewHolder.address.setTag(位置),它完美的欢呼声。

适配器类:

 package com.qzick.adapter; import java.util.ArrayList; import android.content.Context; import android.text.Editable; import android.text.TextWatcher; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.EditText; import android.widget.TextView; import com.example.qzick.R; import com.qzick.model.Get_All_Class_Model; public class Get_Class_Adapter extends BaseAdapter { protected ArrayList<Get_All_Class_Model> get_class_details; LayoutInflater inflater; Context context; private int x = 1; public Get_Class_Adapter(Context context, ArrayList<Get_All_Class_Model> get_class_details) { this.get_class_details = get_class_details; this.inflater = LayoutInflater.from(context); this.context = context; } @Override public int getCount() { // TODO Auto-generated method stub return get_class_details.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return get_class_details.get(position); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return 0; } @Override public View getView(final int position, View convertView, ViewGroup parent) { final ViewHolder holder; if (convertView == null) { holder = new ViewHolder(); convertView = this.inflater.inflate( R.layout.activity_adapter_class_ll, parent, false); holder.textclass = (TextView) convertView .findViewById(R.id.text_class_ll); holder.txtid = (TextView) convertView.findViewById(R.id.text_id_ll); holder.checkclass = (CheckBox) convertView .findViewById(R.id.check_class_LL); holder.edtsection = (EditText) convertView .findViewById(R.id.edttxt_addsection_ll); holder.checkclass .setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { int getPosition = (Integer) buttonView.getTag(); get_class_details.get(getPosition).setChecked( buttonView.isChecked()); notifyDataSetChanged(); } }); convertView.setTag(holder); convertView.setTag(R.id.check_class_LL, holder.checkclass); convertView.setTag(R.id.edttxt_addsection_ll, holder.edtsection); } else { holder = (ViewHolder) convertView.getTag(); } holder.checkclass.setTag(position); holder.edtsection.setTag(position); holder.edtsection.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { int pos = (Integer) holder.edtsection.getTag(); get_class_details.get(pos).setEdtsections(s.toString()); } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void afterTextChanged(Editable s) { } }); holder.txtid.setText(get_class_details.get(position).getId()); holder.textclass.setText(get_class_details.get(position).getText()); holder.edtsection.setText(get_class_details.get(position) .getEdtsections()); holder.textclass.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { x++; if (x % 2 == 0) { holder.checkclass.setChecked(false); } else { holder.checkclass.setChecked(true); } } }); holder.checkclass.setChecked(get_class_details.get(position) .isChecked()); return convertView; } private class ViewHolder { TextView textclass, txtid;`enter code here` CheckBox checkclass; EditText edtsection; } }