为了加快大多数移动应用程序(Android iOS
…)的运行速度,通常会回收列表单元格。这样可以节省内存,尤其是对于较长的列表。因此,您必须获取新显示的单元格的数据。当单元超出屏幕时,其布局/视图将被破坏。在您的情况下,您必须将编辑文本的文本保存在某处。这就是您要对哈希图执行的操作。
我看不到您的代码中有任何特别的错误。
如果问题是关于使用哈希图的“解决方法”,那么我确认对我而言,保存编辑文本的状态取决于您。使用哈希图是一种实现方式。
顺便说一下,
getItem(position).id可以
getItemId(position)为此替换此处。
不确定是否所有这些都能回答您的问题。
编辑
现在,我已经正确理解了您的问题,我可以提供一些代码。我必须说,我对找到的解决方案不完全满意,但至少可以正常使用。
TextWatcher的问题在于您无权访问上下文和相应的视图。
使用setOnFocusChangeListener解决了该问题。所以这是我终于开始工作的代码。
public final class PointVerificationAdapter extends baseAdapter { List<BasicNamevaluePair> mObjects; Context mContext; LayoutInflater mInflater; HashMap<Integer, String> mReponsesActuel; ArrayList<String> myItems = new ArrayList<String>(); public PointVerificationAdapter( Context context, List<BasicNamevaluePair> listObjets ) { this.mInflater = LayoutInflater.from(context); this.mContext = context; this.mObjects = listObjets; for (int i = 0; i < 30; i++) { myItems.add(Integer.toString(i)); } } @Override public int getCount() { return mObjects.size(); } @Override public BasicNamevaluePair getItem(int position) { return mObjects.get(position); } @Override public long getItemId(int position) { return position; } static class ViewHolder { EditText yourEditText; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; if (convertView == null) { holder = new ViewHolder(); convertView = mInflater.inflate(R.layout.intervention_reponses_controle_nombre, parent, false); convertView.setId(position); holder.yourEditText = (EditText) convertView.findViewById(R.id.edValeur); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } ((TextView) convertView.findViewById(R.id.tvNom)).setText(Integer.toString(position)); holder.yourEditText.setText(myItems.get(position)); holder.yourEditText.setId(position); holder.yourEditText.setonFocusChangeListener(new onFocusChangeListener() { public void onFocusChange(View view, boolean hasFocus) { if (!hasFocus){ final int position = view.getId(); final EditText editText = (EditText) view; myItems.set(position, editText.getText().toString()); } } }); return convertView; }}最终编辑
之前的代码可以工作,但我对此不满意,因为您要求
addTextChangedListener而不是
onFocusChange。
所以这是解决方案:
public final class PointVerificationAdapter extends baseAdapter { List<BasicNamevaluePair> mObjects; Context mContext; LayoutInflater mInflater; HashMap<Integer, String> mReponsesActuel; ArrayList<String> myItems = new ArrayList<String>(); public PointVerificationAdapter( Context context, List<BasicNamevaluePair> listObjets ) { this.mInflater = LayoutInflater.from(context); this.mContext = context; this.mObjects = listObjets; for (int i = 0; i < 30; i++) { myItems.add(Integer.toString(i)); } } @Override public int getCount() { return mObjects.size(); } @Override public BasicNamevaluePair getItem(int position) { return mObjects.get(position); } @Override public long getItemId(int position) { return position; } static class ViewHolder { EditText yourEditText; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; if (convertView == null) { holder = new ViewHolder(); convertView = mInflater.inflate(R.layout.intervention_reponses_controle_nombre, parent, false); convertView.setId(position); holder.yourEditText = (EditText) convertView.findViewById(R.id.edValeur); holder.yourEditText.setId(position); holder.yourEditText.addTextChangedListener(new GenericTextWatcher(holder.yourEditText)); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); holder.yourEditText.setId(position); } ((TextView) convertView.findViewById(R.id.tvNom)).setText(Integer.toString(position)); holder.yourEditText.setText(myItems.get(position)); return convertView; } private class GenericTextWatcher implements TextWatcher{ private View view; private GenericTextWatcher(View view) { this.view = view; } public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {} public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {} public void afterTextChanged(Editable editable) { final int position = view.getId(); final EditText editText = (EditText) view; myItems.set(position, editText.getText().toString()); } }}


