我有一个ListView,其中每个项目都包含多个EditTexts。我正在定义一个标度,因此其中一个EditTexts依赖于上面项中的EditText。在下面的示例中,B在编辑A时被设置为与A相同的值。因此,用户实际上没有使用正确的列。
我能够收听A中的事件,更新B并相应地调用notifyDataSetChanged(),但是当ListView被重新绘制时,我失去了EditText的焦点。

总之,我想要的是:
编辑字段A,然后点击字段C__,我希望A__的值应用于B,并希望焦点转到CE 223_。
这是我遇到麻烦的“聚焦到C”的部分。
附注:实际上行上还有另一个EditText,所以焦点并不总是指向具有A和C的列。
编辑:这是我的适配器的getItemId()方法,以帮助回答@aniv的评论。
@Override
public Object getItem(int arg0) {
return arg0;
}EDIT_2:在重写hasStableIds()以返回true之后,当我从A转到另一项中的第三列时,它工作得很好,但是当我从A到C时,就不起作用了。我认为我的onFocusChange覆盖会搞砸一些事情,因为只有在更改该列中的焦点时(在该列中共享相同的onFocusChange方法),它的行为才会奇怪。这是我的定制onFocusChangeListener。
private class MyFocusChangeListener implements View.OnFocusChangeListener{
private EditText et;
private ScaleItem item;
private Integer pos;
private MyFocusChangeListener(ScaleItem item, Integer pos){
this.item = item;
this.pos = pos;
}
@Override
public void onFocusChange(View v, boolean hasFocus){
if(!hasFocus){
et = (EditText) v;
Activity_EditCourseGPA a = (Activity_EditCourseGPA) activity;
a.updateMaxOnTextChange(item, pos, et.getText().toString());
} else {
}
}
}它在我的活动中引用的函数(使用EditText字段更新底层数据).
public void updateMaxOnTextChange(ScaleItem item, Integer pos, String str){
if(pos < scaleItems.size()){
scaleItems.get(pos + 1).setMax(Double.valueOf(str));
scaleListAdapter.notifyDataSetChanged();
}
}我使用EditText位置和内容更新同一位置的基础数据。以下是我在同一专栏中更改焦点时所发生的事情。很奇怪。

发布于 2015-03-25 11:09:43
首先,您需要一个自定义类Grade。
public class GradeInfo {
boolean enabled;
String gpa, perc1, perc2;
}您需要创建一个List<GradeInfo>对象,它将包含GradeInfo对象的列表,每个对象代表一行。您可以在listview的适配器中使用此列表。适配器将如下所示:
private class GradeAdap extends BaseAdapter {
@Override
public int getCount() {
return gradeList.getSize();
}
@Override
public Object getItem(int position) {
return gradeList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
if(convertView == null)
convertView = getLayoutInflater().inflate(R.layout.row_grade, null);
return loadGradeRow(convertView, position);
}
}是的,适配器的getView方法调用另一个方法loadGradeRow
private View loadGradeRow(final View rowView, final int position) {
CheckBox chk= (CheckBox ) rowView.findViewById(R.id.chk);
...// Declare and initialize other views
listIsRefreshing = true; // Explained below
chk.setChecked(gradeList.get(position).enabled);
...// set views accordingly
listIsRefreshing = false;
txtGpa.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) {
if(listIsRefreshing) //JUST REFRESHING, DON'T MIND
return;
gradeList.get(position).perc1 = s.toString();
if(position == gradeList.size()-1) //Dont assign if its the last row
return;
gradeList.get(position+1).perc2 = s.toString();
loadGradeRow(listview.getChildAt(position+1), position+1);
}
});
}listIsRefreshing是一个布尔值,需要在您的活动中声明。它需要确保只有当用户手动输入值时才将值分配给perc2。
https://stackoverflow.com/questions/26456496
复制相似问题