Android ListView中包含的EditText的内容未保存

Android ListView中包含的EditText的内容未保存,第1张

Android ListView中包含的EditText的内容未保存

为了加快大多数移动应用程序(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());        }    }}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5133283.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-11-17
下一篇2022-11-17

发表评论

登录后才能评论

评论列表(0条)

    保存