Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在我的onFocusChangedListener中调用notifyDataSetChanged会导致焦点在我的ListView中失控_Android_Listview_Android Listview_Android Edittext_Android View - Fatal编程技术网

Android 在我的onFocusChangedListener中调用notifyDataSetChanged会导致焦点在我的ListView中失控

Android 在我的onFocusChangedListener中调用notifyDataSetChanged会导致焦点在我的ListView中失控,android,listview,android-listview,android-edittext,android-view,Android,Listview,Android Listview,Android Edittext,Android View,我有一个列表视图,每个项目有多个编辑文本。当我更改一个项目上的EditText时,我希望它影响下一个项目上的文本。我使用的是onFocusChanged监听器,我可以成功地更新底层数据,但我的实际焦点丢失了,光标落在了奇怪的地方。请查看我的代码并提供任何见解。这件事我绞尽脑汁已经有一段时间了 注: 我不会用支架回收物品,因为这会让我行为古怪,我的表现也不会受到影响。每次我尝试重新启用回收,事情就会变得更混乱。 我已经覆盖HassTableId以返回true,但这似乎没有任何区别。 分配侦听器:

我有一个列表视图,每个项目有多个编辑文本。当我更改一个项目上的EditText时,我希望它影响下一个项目上的文本。我使用的是onFocusChanged监听器,我可以成功地更新底层数据,但我的实际焦点丢失了,光标落在了奇怪的地方。请查看我的代码并提供任何见解。这件事我绞尽脑汁已经有一段时间了

注:

我不会用支架回收物品,因为这会让我行为古怪,我的表现也不会受到影响。每次我尝试重新启用回收,事情就会变得更混乱。 我已经覆盖HassTableId以返回true,但这似乎没有任何区别。 分配侦听器:

MyFocusChangeListener myFocusListener = new MyFocusChangeListener(myItem, position);
holder.et_min.setOnFocusChangeListener(myFocusListener);
定义侦听器:

private class MyFocusChangeListener implements View.OnFocusChangeListener{
  private EditText et;
  private EditText curView;
  private ScaleItem item;
  private Integer pos;

  public MyFocusChangeListener(ScaleItem item, Integer pos){
      this.item = item;
      this.pos = pos;
  }

  @Override
  public void onFocusChange(View v, boolean hasFocus){
      if(!hasFocus){ 
          et = (EditText) v;

          System.out.println("EditText lost focus on row:  " + et.getText().toString() + "   et id: " + et.getId()); 
          if(pos < data.size()){
            data.get(pos + 1).setMax(Double.valueOf(et.getText().toString()));
            notifyDataSetChanged();
            System.out.println("Updated dataset and called notifyDataSetChanged()");
          } 
      } else {
          et = (EditText) v;
          if(et != null)
              System.out.println("EditText just RECEIVED focus on row : " + et.getText().toString() + "   et id: " + et.getId());
    }
 }
}

这是我得到的控制台输出,如果我输入活动,请单击字段A,然后单击字段B

注意:

每一个EditText,不管是哪一行,都有相同的ID,我想这是意料之中的 我所做的唯一更改是对底层数据的更改。事实上,如果我只调用notifyDataSetChanged而不做任何更改,我也会遇到同样的问题。 目标区域失去焦点,我不知道为什么。 TL;在我的onFocusChangedListener中调用notifyDataSetChanged会导致我的ListView中的焦点崩溃

看到了吗?光标喝醉了。

如果在ListView中聚焦EditText,则获取位置值,更新ListView后,重新绘制并自动选择最后一个位置

步骤1:

if (_Curserposition == position) {
    holder.textViewStake.setFocusableInTouchMode(true);
    //holder.textViewStake.clearFocus();
    holder.textViewStake.requestFocus();
    holder.textViewStake.setSelection(holder.textViewStake.getText().toString().length());
}
步骤2:

holder.textViewStake.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        _Curserposition = position;
        Log.d(">>>", "setOnFocusChangeListener" + _Curserposition);
        /*  
        //showVirtualKeyboard(con_text, v);
        // holder.textViewStake.requestFocus();
        InputMethodManager imm = (InputMethodManager) activityContext.getSystemService(Context.INPUT_METHOD_SERVICE);
        if (hasFocus) {
            imm.showSoftInput(holder.textViewStake, InputMethodManager.SHOW_FORCED);
        } else {
            imm.hideSoftInputFromWindow(holder.textViewStake.getWindowToken(), 0);
        }*/
    }
});
步骤3:

holder.textViewStake.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) {
        betlist_view.setFocusable(false);
        if (s.length() > 0) {
            try {
                if (Integer.parseInt(holder.textViewStake.getText().toString()) > 0) {
                    int _Stackamt = Integer.parseInt(holder.textViewStake.getText().toString());
                    int _picknumber = arrayDailyGameDrawList.get(position).getID();
                    //Log.d(">>>", "_picknumber" + position + "-" + arrayDailyGameDrawList.get(position).getBetNumberID() + "-" + Common.DrawId + "-" + _Stackamt + "-" + arrayDailyGameDrawList.get(position).getBetNumberID());
                    AddUpdateDailyGameNumberIntoList(
                        position, 
                        2, 
                        arrayDailyGameDrawList.get(position).getBetNumberID(), 
                        Common.DrawId, 
                        _Stackamt, 
                        arrayDailyGameDrawList.get(position).getBetNumberID()
                    );

                    /*  new Handler().postDelayed(new Runnable() {
                        @Override
                        public void run() {
                        }
                    }, 3000);*/
                }
            } catch (Exception e) {
            }
        } else {
            holder.textViewStake.setText("0");
        }
    }

    @Override
    public void afterTextChanged(Editable s) {

    }
});

为什么您需要更改数据?如果数据位于同一布局/项目内,则直接检索和/或设置数据。要使整行无效,请使用getAdapter getView和相应的如果可见的行视图ListView getFirstVisiblePosition。。。当一行中的操作修改另一行中的数据时,getChildAt等。虽然可能不起作用:当EditText更改时,我会在同一行中设置TextView和数据。您可以发布您的适配器代码吗?@Deucalion,您使用getFirstVisiblePosition和getChildAt是绝对正确的。我最终完全放弃了ListView,但如果您发布如何更新视图的答案,我将接受它。