У меня была точно такая же проблема с проектом, над которым я работал.Все решения, которые я нашел, также упоминались с использованием textChangeListener
, однако из-за характера списка и с EditText
в каждом представлении строки это было очень неэффективно.Я выбрал отдельный подход, используя EditText.setOnFocusChangeListener()
.
Я прикрепил это к каждому EditText в методе getView.Причина, по которой это работает так хорошо, заключается в том, что он вызывается, когда пользователь переключается на другой текст редактирования или прокручивает его, так что текущая строка выходит за пределы экрана, что приводит к потере фокусировки EditText
.
В onFocusChange (View v, boolean hasFocus) внутри слушателя я просто помещаю:
if (!hasFocus) {
EditText et = (EditText) v.findViewById(R.id.groupAmount);
data.get(position).put("dueAmount", et.getText().toString().trim());
}
В моем примере я сохраняю введенное значение в моих данных, используемых для заполнения представлений накаждый вызов getView, но это все равно должно показывать, как получить доступ к данным, введенным пользователем.Просто убедитесь, что вы пытаетесь взять эти сохраненные данные и попробуйте заполнить editText в соответствующей позиции.
Надеюсь, это поможет.
Размещение моего полного адаптера здесь для справки
public class memberlistadapter extends BaseAdapter {
private LayoutInflater mInflater;
public ArrayList<Hashtable<String, String>> data;
ViewHolder viewHolder;
public static HashMap<Integer,String> myList=new HashMap<Integer,String>();
public memberlistadapter(Context context) {
mInflater = LayoutInflater.from(context);
}
public memberlistadapter(Activity activity, ArrayList<Hashtable<String, String>> objects) {
super();
mInflater = activity.getLayoutInflater();
//this.activity = activity;
this.data = objects;
Log.d("data", data.toString());
}
public void clear() {
this.data.clear();
viewHolder = null;
}
public void setData(ArrayList<Hashtable<String, String>> data) {
this.data = data;
}
public int getCount() {
return data.size();
}
public Object getItem(int item) {
return data.get(item);
}
public long getItemId(int position) {
return position;
}
public View getView(final int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = mInflater.inflate(R.layout.member_amount_child, null);
viewHolder = new ViewHolder();
viewHolder.nameText = (TextView) convertView.findViewById(R.id.grp_amt_child);
viewHolder.amountText = (EditText) convertView.findViewById(R.id.groupAmount);
viewHolder.checkBox = (CheckBox) convertView.findViewById(R.id.memberCheckNotif);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
//Log.d("data at "+position, data.get(position).toString());
String amt = data.get(position).get("dueAmount");
String name = data.get(position).get("name");
String check = data.get(position).get("reminder");
viewHolder.nameText.setText(name);
try {
if (amt.length() > 0 && !amt.equalsIgnoreCase("0")) {
viewHolder.amountText.setText(amt);
} else {
viewHolder.amountText.setText("");
}
} catch (Exception e) {
viewHolder.amountText.setText("");
}
viewHolder.amountText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
public void onFocusChange(View v, boolean hasFocus) {
if (!hasFocus) {
EditText et = (EditText) v.findViewById(R.id.groupAmount);
data.get(position).put("dueAmount", et.getText().toString().trim());
}
}
});
try {
if (check.equalsIgnoreCase("true")) {
viewHolder.checkBox.setChecked(true);
} else {
viewHolder.checkBox.setChecked(false);
}
} catch (Exception e) {
viewHolder.checkBox.setChecked(false);
}
viewHolder.checkBox.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if (((CheckBox) v).isChecked()) {
data.get(position).put("reminder", "True");
} else {
data.get(position).put("reminder", "False");
}
}
});
if (position == 0) {
viewHolder.checkBox.setVisibility(View.GONE);
viewHolder.amountText.setVisibility(View.GONE);
viewHolder.nameText.setVisibility(View.GONE);
} else {
viewHolder.checkBox.setVisibility(View.VISIBLE);
viewHolder.amountText.setVisibility(View.VISIBLE);
viewHolder.nameText.setVisibility(View.VISIBLE);
}
return convertView;
}
static class ViewHolder {
TextView nameText;
EditText amountText;
CheckBox checkBox;
}
}