1

2つの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。それを修正する方法は?

4

3 に答える 3

3

getViewメソッドでは、パラメーターpositionは、クリックされたchildViewの位置ではなく、新しく作成されたchildViewの位置を示します。

これを使用して正しい位置を取得します。

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

任意のビューのonClick(View v);onClickListenerこの場合、そのEditTextに対してonTextChangedListenerを実装する必要があります

ここ:

myListはListViewです

vはクリックしたビューで、この場合は親(myList)のchildViewです。

于 2012-10-01T10:02:07.750 に答える
2

この問題は、ビューが再利用可能であるために発生します(つまり、Android APIの設計によるものです)。したがって、最終的には、同じテキストビューに複数のテキストウォッチャーを割り当てることができます。また、テキストビュー内のテキストが変更されると、割り当てられたすべてのウォッチャーが起動されます。

簡単な修正(リストが本当に長い場合、たとえば1000以上のアイテムの場合は最適ではありません)は、のマップを作成することですTraweller -> TextWatcher

次に、getView()内でこれを行うことができます(擬似コード):

  • TextWatcherこれのためにあるかどうか地図をチェックしてくださいTraweller
  • マップに何もない場合は、新しいを作成TextWatcherし、マップに配置して、に割り当てますEditText
  • TextWatcherそれ以外の場合は、をから切り離してEditTextマップから削除します
  • 新しいを作成TextWatcherし、マップに配置して、に割り当てますEditText
于 2012-10-01T10:11:04.593 に答える
0

EditText名前が表示されていない画面にもう1つ作成します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) {
    }
});
于 2016-05-13T13:59:10.480 に答える