Java Android:ListView问题中的EditText

Java Android:ListView问题中的EditText,java,android,Java,Android,我的应用程序中有一个listview,它基本上是一个问卷,因此用户需要填写一些编辑文本。我遇到了以下问题: 一些EditText需要数字输入,因此我将相应xml类型中的inputType设置为numeric,但是,当我单击EditText时,数字键盘会显示,但几乎立即消失,并显示常规键盘 可以想象,我需要将用户输入的值存储在这些编辑文本中。我的问题是,当我在一些编辑文本中输入一些文本并向下滚动后,返回时文本就消失了。您可以在我的代码中看到,我试图阻止这种情况,我应该提到,它可以很好地使用复选框

我的应用程序中有一个listview,它基本上是一个问卷,因此用户需要填写一些编辑文本。我遇到了以下问题:

  • 一些EditText需要数字输入,因此我将相应xml类型中的inputType设置为numeric,但是,当我单击EditText时,数字键盘会显示,但几乎立即消失,并显示常规键盘

  • 可以想象,我需要将用户输入的值存储在这些编辑文本中。我的问题是,当我在一些编辑文本中输入一些文本并向下滚动后,返回时文本就消失了。您可以在我的代码中看到,我试图阻止这种情况,我应该提到,它可以很好地使用复选框

  • 开始时,我遇到了失去焦点的问题,但我通过查看其他问题解决了这个问题(在ListView和WindowsofInputMode=“adjustPan”中添加了DegenantFocusablety=“BeforeDegenders”)。工作正常,只是当EditText位于屏幕的一半以下时,我一开始输入它就会失去焦点。 列表适配器的getView方法:

    public View getView(final int position,View result,ViewGroup parent)
    {
    final ViewHolder vh;
    final Question question = values.get(position);
    if(holders[position]==null)
        vh = new ViewHolder();
    else
        vh = holders[position];
    
    LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    if(question.getQuestionType().equals(Question.TYPE_CLOSED))
    {
        result = inflater.inflate(R.layout.closed_question_list_item, null);
        vh.cb  = (CheckBox)result.findViewById(R.id.checkbox);
        vh.cb.setOnCheckedChangeListener(new OnCheckedChangeListener() 
        {
    
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) 
            {
                vh.isChecked      = isChecked;
                holders[position] = vh;
            }
        });
        vh.cb.setChecked(vh.isChecked);
    }
    
    else
    {
        result = inflater.inflate(R.layout.numeric_question_list_item, null);
        vh.et  = (EditText)result.findViewById(R.id.question_et);
        vh.et.addTextChangedListener(new TextWatcher()
        {
            @Override
            public void afterTextChanged(Editable s) 
            {
                vh.tvValue = s.toString();
                holders[position] = vh;
                Log.i(TAG,"Entered afterTextChanged for "+ question.getText());
            }
    
            @Override
            public void beforeTextChanged(CharSequence s, int start,int count, int after) 
            {   
            }
    
            @Override
            public void onTextChanged(CharSequence s, int start,int before, int count) 
            {
            }
        });
        vh.et.setText(vh.tvValue);
    }
    vh.tv = (TextView)result.findViewById(R.id.question_text);
    
    vh.tv.setText(question.getText());
    
    holders[position] = vh;
    result.setTag(vh);
    return result;
    }
    

  • 由于问题2,你可以联系到这篇文章 因此,当你向下滚动时,似乎没有简单的方法来保存编辑文本

    是的,你的权利,你可以试试

    或者直接联系右侧的相关帖子

    问题解决方案#3:

  • 在listview中设置子体Focusablety=“BeforeMedians”

  • 在清单中设置
    windowSoftInputMode=“adjustPan”

  • 设置listview.setItemsCanFocus(true)

  • 下面是一个解决方案,并对您的问题进行了更深入的解释#1和#3():

    您需要将ListView的属性设置为“After子孙”

    您可以在XML中这样做:

    android:genderantfocusability=“aftersenders”

    或者用这样的代码:

    listview.setDescendantFocusability(ViewGroup.FOCUS在子体之后)

    您还需要将项目设置为可聚焦

    您可以在如下代码中执行此操作:
    listview.setItemsCanFocus(true)

    此外,您还需要指定在显示软键盘时活动的主窗口发生了什么。这是通过更改属性来完成的。您可能希望将其设置为AdjustPan,以便不会调整listview的大小,从而不会再次调用GetView。这可能就是现在隐藏键盘时发生的情况,再次调用GetView并重置EditText中的原始值


    您可以使用主活动类的XML上的属性
    android:windowSoftInputMode=“adjustPan”
    getWindow().setSoftInputMode(LayoutParams.SOFT\u INPUT\u ADJUST\u PAN)
    以编程方式执行此操作。

    这对我来说很有用。。。。请检查这个

    listview.setItemsCanFocus(true);
    

    我有一个带有Edittext的listview,当我在其中输入文本时,如果在此之前,我滚动listview,适配器会占据一些位置,而不是选定的位置

    我的适配器采用不同的位置,而不是我的选择:

    etCantidad.addTextChangedListener(new TextWatcher() {
         @Override
         public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
         @Override
         public void onTextChanged(CharSequence s, int start, int before, int count) {}
    
         @Override
         public void afterTextChanged(Editable s) {
             String cantidadTMP = etCantidad.getText().toString();
             int cantidad;
             try {
                  cantidad = Integer.parseInt(cantidadTMP);
                  item.setCantidad(cantidad);
                  Log.i("Name",""+item.getNombre());
                 }catch (Exception e){
                        cantidad = 0;
                 }
             Log.i("QuantityArrayAdapter",String.valueOf(cantidad));
         }});
    
    09-25 09:22:10.458 12719-12719/? I/QuantityArrayAdapter: 1
    09-25 09:22:10.458 12719-12719/? I/QuantityArrayAdapter: 1
    09-25 09:22:10.458 12719-12719/? I/QuantityArrayAdapter: 1
    
    一个编辑文本选择:

    etCantidad.addTextChangedListener(new TextWatcher() {
         @Override
         public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
         @Override
         public void onTextChanged(CharSequence s, int start, int before, int count) {}
    
         @Override
         public void afterTextChanged(Editable s) {
             String cantidadTMP = etCantidad.getText().toString();
             int cantidad;
             try {
                  cantidad = Integer.parseInt(cantidadTMP);
                  item.setCantidad(cantidad);
                  Log.i("Name",""+item.getNombre());
                 }catch (Exception e){
                        cantidad = 0;
                 }
             Log.i("QuantityArrayAdapter",String.valueOf(cantidad));
         }});
    
    09-25 09:22:10.458 12719-12719/? I/QuantityArrayAdapter: 1
    09-25 09:22:10.458 12719-12719/? I/QuantityArrayAdapter: 1
    09-25 09:22:10.458 12719-12719/? I/QuantityArrayAdapter: 1
    
    因此,我将此方法添加到onTouchListener中,以仅获取选择位置:

    etCantidad.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                etCantidad.addTextChangedListener(new TextWatcher() {
                    @Override
                    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    
                    }
    
                    @Override
                    public void onTextChanged(CharSequence s, int start, int before, int count) {
                    }
    
                    @Override
                    public void afterTextChanged(Editable s) {
                        String cantidadTMP = etCantidad.getText().toString();
                        int cantidad;
                        try {
                            cantidad = Integer.parseInt(cantidadTMP);
                            item.setCantidad(cantidad);
                            Log.i("Name",""+item.getNombre());
                        }catch (Exception e){
                            cantidad = 0;
                        }
                        Log.i("QuantityArrayAdapter",String.valueOf(cantidad));
                    }
                });
                return false;
            }
        });
    

    只拿我想要的东西,这样对我很有用。

    谢谢,但答案只是告诉你自己回收行,但它没有解释如何有效地回收行,这正是我想知道的。你知道我在哪里能找到那样的东西吗?谢谢,我去看看。总之,我设法解决了这个问题,结果发现使用vh局部变量和holders数组有点冗余,所以我尝试消除所有冗余,效果很好。也许这可以帮助您解决问题#3?如果解决了,请张贴答案谢谢。1.android:genderantfocusability=“aftergenders”。2.将输入的文本按如下方式保存:或此处:。效果良好。谢谢:)