10

我的应用程序中有一个列表视图,基本上是一个问卷,因此用户需要填写一些 EditText。我遇到了以下问题:

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

  2. 可以想象,我需要将用户输入的值存储在这些 EditText 中。我遇到的问题是,在我在一些 EditTexts 中输入一些文本并向下滚动后,当我返回时,文本就消失了。您可以在我的代码中看到我试图阻止这种情况,我应该提到它与复选框完美配合。

  3. 一开始我遇到了失去焦点的问题,但我通过查看其他问题解决了它(在 ListView 和 windowSoftInputMode="adjustPan" 中添加了 descendantFocusablity="beforeDescendants")。工作正常,除了当 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;
    }
    
4

5 回答 5

19

问题 #3 的解决方案:

  1. 在列表视图中设置descendantFocusablity="beforeDescendants"

  2. windowSoftInputMode="adjustPan"在清单中设置

  3. listview.setItemsCanFocus(true)

于 2014-04-24T15:11:44.807 回答
4

要扩展aaRBiyecH的上述答案,这里有一个解决方案和对您的问题 #1 和 #3 的更深入解释(来源):

您需要将 ListView 的DescendantFocusability属性设置为“afterDescendants”。

您可以像这样在 XML 中执行此操作:

android:descendantFocusability="afterDescendants"

或在这样的代码中:

listview.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS)

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

您可以在这样的代码中执行此操作 listview.setItemsCanFocus(true)

此外,您需要指定显示软键盘时 Activity 的主窗口发生的情况。这是通过更改WindowSoftInputMode属性来完成的。您可能希望将其设置为 AdjustPan 以便您的列表视图不会调整大小,因此不会再次调用 GetView。这可能是现在隐藏键盘时发生的情况,再次调用 GetView 并重置 EditText 中的原始值。

您可以使用android:windowSoftInputMode="adjustPan"主要活动类的 XML 上的属性或以getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_ADJUST_PAN)编程方式执行此操作。

于 2015-01-06T03:18:00.770 回答
0

由于问题 2,您可以与此帖子相关联 滚动列表中的 EditText 项目在滚动离开屏幕时会丢失它们的更改, 因此当您向下滚动时似乎没有简单的解决方案来保留编辑文本

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

EditText 在 ListView 中滚动时丢失内容

或者只是与右侧的相关帖子有关

于 2013-06-30T00:30:50.657 回答
0

它为我工作....请检查这个

listview.setItemsCanFocus(true);
于 2017-04-03T07:59:57.080 回答
0

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

我的适配器占据了不同的位置,而不是我的选择:

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));
     }});

一个 Edittext 选择:

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;
        }
    });

只拿我想要的东西,它对我有用。

于 2017-09-25T09:30:16.277 回答