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