自定义的ListView适配器。 TextChangedListener呼吁错误的EditTex

2019-08-01 01:29发布

我有什么由两个EditText上与自定义适配器的旅客名单 - edtFirstName和edtLastName。 我想,当用户输入文本时,将更改保存到列表中,当单击下一步按钮,发送名单到另一个活动。

我的代码:

public class TravellersAdapter extends BaseAdapter {

  private List<Traveler> itemsList;
  private LayoutInflater inflater;
  private Activity context;

  public TravellersAdapter(Activity context, List<Traveler> itemsList) {
    super();
    this.itemsList = itemsList;
    this.context = context;
    inflater = LayoutInflater.from(context);
  }

  public int getCount() { return itemsList.size();  }

  public Object getItem(int i) {  return itemsList.get(i);  }

  public View getView(final int position, View view, ViewGroup viewGroup) {
    if (view == null) {
      view = inflater.inflate(R.layout.traveller_item, null);
    }
    Traveler currentItem = (Traveler) getItem(position);

    EditText firstNameView = (EditText) view.findViewById(R.id.edtFirstName);
    firstNameView.addTextChangedListener(new TextWatcher() {

      public void afterTextChanged(Editable editable) {
        currentItem.setFirstName(editable.toString());
      }

    });

    return view;
  }
}

对于为例名单itemsList由5个项目。 当我编辑2-4元都可以,但是当我编辑列表分配给所有元素第一个或最后一个元素编辑值。 在dubugger我看到法afterTextChanged用不同的值调用5次position 。 如何解决呢?

Answer 1:

getView方法,参数位置给新创建的childView,而不是点击childView的位置的位置。

用这个来得到正确的位置:

final int actual_position = myList.getPositionForView((View) v.getParent());

onClick(View v);onClickListener任何视图。 在你的情况下,你必须为实现的EditText onTextChangedListener。

这里:

myList中的ListView控件

v是你点击查看,在这种情况下,家长(myList中)的childView。



Answer 2:

这个问题是因为视图是可重复使用的(即通过在Android的API设计)。 所以最终你可以分配超过1组文本的专家以同样的文本视图。 而且所有的分配观察家当文本视图中的文本改变被解雇。

速战速决(如果该列表是很长的,比方说,1000个+的项目非最佳),将有地图Traweller -> TextWatcher

然后getView()里面,你可以做到这一点(伪代码):

  • 查地图,如果有一个TextWatcher这个Traweller
  • 如果地图没有任何,然后创建一个新TextWatcher ,放在地图和分配到EditText
  • 否则拆下TextWatcherEditText和从地图中删除
  • 创建一个新的TextWatcher ,放在地图和分配到EditText


Answer 3:

再创建一个EditText在与名隐形屏幕invivisbleEt 。 然后执行以下操作的事情在addTextChangedListener

firstNameView.addTextChangedListener(new TextWatcher() {

    @Override
    public void afterTextChanged(Editable editable) {
        if(!firstNameView.isFocused())
            currentItem.setFirstName(editable.toString());
    }

});

另外,在添加此代码onCreate用于方法ListView对象。

lv.setOnScrollListener(new AbsListView.OnScrollListener() {

    //public boolean scrolling;

    @Override
    public void onScrollStateChanged(AbsListView absListView, int scrollState) {
        invivisbleEt.requestFocus();
    }

    @Override
    public void onScroll(AbsListView absListView, int i, int i1, int i2) {
    }
});


文章来源: Custom ListView adapter. TextChangedListener calls for wrong EditText