首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在不丢失列表项中的ListView焦点的情况下更新EditText?(Android)

如何在不丢失列表项中的ListView焦点的情况下更新EditText?(Android)
EN

Stack Overflow用户
提问于 2014-10-19 23:22:37
回答 1查看 1.9K关注 0票数 3

我有一个ListView,其中每个项目都包含多个EditTexts。我正在定义一个标度,因此其中一个EditTexts依赖于上面项中的EditText。在下面的示例中,B在编辑A时被设置为与A相同的值。因此,用户实际上没有使用正确的列。

我能够收听A中的事件,更新B并相应地调用notifyDataSetChanged(),但是当ListView被重新绘制时,我失去了EditText的焦点。

总之,我想要的是:

编辑字段A,然后点击字段C__,我希望A__的值应用于B,并希望焦点转到CE 223_。

这是我遇到麻烦的“聚焦到C”的部分。

附注:实际上行上还有另一个EditText,所以焦点并不总是指向具有A和C的列。

编辑:这是我的适配器的getItemId()方法,以帮助回答@aniv的评论。

代码语言:javascript
复制
@Override
    public Object getItem(int arg0) {
        return arg0;
    }

EDIT_2:在重写hasStableIds()以返回true之后,当我从A转到另一项中的第三列时,它工作得很好,但是当我从A到C时,就不起作用了。我认为我的onFocusChange覆盖会搞砸一些事情,因为只有在更改该列中的焦点时(在该列中共享相同的onFocusChange方法),它的行为才会奇怪。这是我的定制onFocusChangeListener。

代码语言:javascript
复制
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字段更新底层数据).

代码语言:javascript
复制
public void updateMaxOnTextChange(ScaleItem item, Integer pos, String str){
    if(pos < scaleItems.size()){
        scaleItems.get(pos + 1).setMax(Double.valueOf(str));
        scaleListAdapter.notifyDataSetChanged();
    }
}

我使用EditText位置和内容更新同一位置的基础数据。以下是我在同一专栏中更改焦点时所发生的事情。很奇怪。

EN

回答 1

Stack Overflow用户

发布于 2015-03-25 11:09:43

首先,您需要一个自定义类Grade

代码语言:javascript
复制
public class GradeInfo {
  boolean enabled;
  String gpa, perc1, perc2;
}

您需要创建一个List<GradeInfo>对象,它将包含GradeInfo对象的列表,每个对象代表一行。您可以在listview的适配器中使用此列表。适配器将如下所示:

代码语言:javascript
复制
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

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26456496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档