Java Android ListView中包含的EditText内容不是';我救不了你

Java Android ListView中包含的EditText内容不是';我救不了你,java,android,android-listview,Java,Android,Android Listview,在我的项目中,我必须向用户显示一个基本上包含EditText的ListView 这就像一份调查问卷,当他回答这个问题时,他可以下去回答下一个问题。(然后回去) 适配器上的公共类扩展了BaseAdapter{ 列出移动对象; 语境; 拉平机; HashMap-mChoix; HashMap-mrepons; HashMap-mreponseasctuel; 整数mPositionSelectionne; 整数干涉; /** *建设者 *@param上下文 *@param listpoints验证点

在我的项目中,我必须向用户显示一个基本上包含EditText的ListView

这就像一份调查问卷,当他回答这个问题时,他可以下去回答下一个问题。(然后回去)

适配器上的公共类扩展了BaseAdapter{ 列出移动对象; 语境; 拉平机; HashMap-mChoix; HashMap-mrepons; HashMap-mreponseasctuel; 整数mPositionSelectionne; 整数干涉; /** *建设者 *@param上下文 *@param listpoints验证点列表。 *@param ListChoiExpoints验证从vérification points到vérification chaque point的vérification points的选择。 *@param listeReponsesPointsVerification réponses déjáfournies pour chaque point de vérification *@param-idIntervention-identification-de-l'intervention */ 公共网络适配器( 语境, 整数干涉, 列表ListPoints验证, List>ListChoExpointsVerification, ResponsePointVerification>ListResponseSpointsVerification){ this.mInflater=LayoutInflater.from(上下文); this.mContext=上下文; this.mObjects=ListPointsVerification; this.mChoix=listcooxpointsverification; this.mReponses=listreponsespointsverification; 这个。中间干预=中间干预; P/P关系式 this.mreponseasctuel=newhashmap(); } @凌驾 公共视图getView(int位置、视图转换视图、视图组父视图){ 查看行; 最终整数idPointVerification=getItem(position).id; if(convertView==null) { row=mInflater.充气(R.layout.intervention\u Responses\u controle\u nombre,null); EditText-edValeur=(EditText)row.findViewById(R.id.edValeur); //洛尔斯凯·洛尔斯凯·洛尔斯凯·洛尔斯凯·洛尔斯凯·洛尔斯凯·洛尔斯凯·洛尔斯凯·洛尔斯凯·洛尔斯凯·洛尔斯凯·洛尔斯凯·洛尔斯凯·洛尔斯凯·洛尔斯凯·洛尔斯凯·洛尔斯凯·洛尔斯凯·洛尔斯凯·洛尔斯凯·洛尔斯凯·洛 //电子注册 edValeur.addTextChangedListener(新的TextWatcher() @凌驾 public void onTextChanged(字符序列、int start、int before、int count){ } @凌驾 更改前的公共无效(字符序列、整数开始、整数计数、, 整数后){ } @凌驾 公共无效后文本已更改(可编辑){ //此hashmap是解决此错误的一种尝试 //我将所有修改注册到此hashmap中 普特先生( 国内流离失所者核查, s、 toString()); //保存过程 //例如,已删除 //但是我更新了我的数据库 } }); } 其他的 { 行=转换视图; } EditText-edValeur=(EditText)row.findViewById(R.id.edValeur); //更新案文 //它是hashmap中包含的 if(mreponsecatuel.containsKey(idPointVerification)){ 字符串valeur=mreponsecatuel.get(idPointVerification); edValeur.setText(valeur); //否则我会查数据库 }else if(mReponses!=null&&mReponses.containsKey(idPointVerification) &&mReponses.get(idPointVerification.valeur!=null){ edValeur.setText(mReponses.get(idPointVerification.valeur); } 其他的 { edValeur.setText(“”); } 返回行; } } 我不知道为什么,但用户在ListView中进入,内容未保存,并显示一些特殊值,如其他EditText。我没有发现如何纠正这种行为,这真的很匆忙

基本上,我制作了一个TextWatcher,它将数据注册到数据库中,也注册到一个包含所有值的临时HashMap中。当调用GetView时,该数据被回调。如果我删除该初始化,编辑文本将被删除

注意:我在代码中做了一些测试,所以可能会有不同的问题

编辑

我上传了一个有问题的项目:

以下是重现问题的步骤:

  • 以调试模式启动项目

  • 写在第一行A,第二行B,第三行C

  • 向下滚动直到C被隐藏

  • 向上滚动到顶部。结果:没有更多的文本

  • 如果仔细查看调试日志,可以看到带有后文本的行。每次我们在第2部分中编写一些文本时,都会有一个包含事件注册的调试行

    但是在第三阶段,当你隐藏一个项目时。事件将以“”启动


    结果:在第四阶段,它加载“”字符串以加快大多数移动应用程序(Android iOS…)中的速度。列表单元格通常是循环使用的。这会特别为长列表节省内存。因此,您必须获取新显示单元的数据。当单元格离开屏幕时,其布局/视图将被破坏。在您的情况下,您必须将编辑文本的文本保存在某个位置。这就是您试图使用hashmap所做的

    我看不出你的代码有什么特别的错误

    如果问题是关于使用hashmap的“变通方法”,我确认您可以保存编辑文本的状态。使用hashmap是一种方法

    顺便说一下,
    getItem(position).id
    可以替换为
    getItemId(position)
    ,这里就是为了这个目的

    我不确定这些是否回答了你的问题

    编辑

    既然我正确理解了你的问题,我可以提供一些代码。我必须说,我对这件事并不完全满意
    public class onAdapter extends BaseAdapter {
        List<PointVerification> mObjects;
        Context mContext;
        LayoutInflater mInflater;
    
        HashMap<Integer, List<ChoixPointVerification>> mChoix;
        HashMap<Integer, ReponsePointVerification> mReponses;
        HashMap<Integer, String> mReponsesActuel;
        Integer mPositionSelectionne;
        Integer mIdIntervention;
    
    
        /**
         * Constructeur
         * @param context
    
         * @param listePointsVerification Liste des points de vérification à afficher.
         * @param listeChoixPointsVerification liste des choix de points de vérification pour chaque point de vérification.
         * @param listeReponsesPointsVerification réponses déjà fournies pour chaque point de vérification
         * @param idIntervention Identifiant de l'intervention
         */
        public onAdapter(
                Context context,
    
                Integer idIntervention, 
                List<PointVerification> listePointsVerification,
                List<ChoixPointVerification>> listeChoixPointsVerification,
                ReponsePointVerification> listeReponsesPointsVerification) {
    
            this.mInflater = LayoutInflater.from(context);
            this.mContext = context;
            this.mObjects = listePointsVerification;
    
            this.mChoix = listeChoixPointsVerification;
            this.mReponses = listeReponsesPointsVerification;
            this.mIdIntervention = idIntervention;
    
    
            // préparation des réponses par position
            this.mReponsesActuel = new HashMap<Integer, String>();
        }
    
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View row;
    
            final Integer idPointVerification = getItem(position).id;
    
            if (convertView == null)
            {
                row = mInflater.inflate(R.layout.intervention_reponses_controle_nombre, null);
    
                EditText edValeur = (EditText) row.findViewById(R.id.edValeur);
                // Ajout de l'évènement lorsque l'on change la valeur
                // evènement d'enregistrement
                edValeur.addTextChangedListener(new TextWatcher() 
    
                    @Override
                    public void onTextChanged(CharSequence s, int start, int before, int count) {
                    }
    
                    @Override
                    public void beforeTextChanged(CharSequence s, int start, int count,
                            int after) {
                    }
    
                    @Override
                    public void afterTextChanged(Editable s) {
                        // This hashmap is a try workaround to the bug
                        // i register all modifications into this hashmap
                        mReponsesActuel.put(
                                idPointVerification,
                                s.toString());
    
                        // SAVE PROCEDURE
                        // REMOVED FOR THE EXAMPLE
                        // BUT I UPDATE MY DATABASE
                    }
                });
            }
            else
            {
                row = convertView;
            }
    
            EditText edValeur = (EditText) row.findViewById(R.id.edValeur);
    
            // update of the text
            // it is the contained in the hashmap
            if (mReponsesActuel.containsKey(idPointVerification)) {
                String valeur = mReponsesActuel.get(idPointVerification);
                edValeur.setText(valeur);
            // otherwhise i will look into the database
            } else if (mReponses != null && mReponses.containsKey(idPointVerification)
                    && mReponses.get(idPointVerification).valeur != null) {
                edValeur.setText(mReponses.get(idPointVerification).valeur);
            }
            else
            {
                edValeur.setText("");
            }
    
            return row;
        }
    }
    
    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;
        }
    
    }
    
    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());
            }
        }
    }