Androidはlistviewの各項目にedittextコントロールを追加する方法


Listviewの各項目にはedittextがあり、そのedittextの入力をリアルタイムで傍受し、listviewの外部で変更する必要があります(例えば、ユーザーが単価を変更し、外部の総価格を変更する必要があります).
リスナーのコードを追加するには、次の手順に従います.
public View getView(final int position, View arg1, ViewGroup arg2) {
		if (arg1 == null) {
			arg1 = inflater.inflate(R.layout.main_layout, null);
			final ViewHolder holder = new ViewHolder();
			holder.position = position;
			holder.et_price.addTextChangedListener(new TextWatcher() {
				@Override
				public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
				}

				@Override
				public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
				}

				@Override
				public void afterTextChanged(Editable arg0) {

					//do something use holder.position
				}
			});
			arg1.setTag(holder);
		}
		final ViewHolder holder = (ViewHolder) arg1.getTag();
		holder.position = position;
		return arg1;
	}
これにより、edittext毎のtextwocherが複数回追加されず、listviewがスライドするときも正しく動作することが保証される
また、textwacherではholderを使用する必要があることに注意してください.positionは、現在のedittextの位置を表し、holderのpositioinを更新する必要がある
このとき、listviewとgridviewのgetviewは、listviewの高さがwrap_である場合、複数回呼び出される可能性があります.contentの場合、listviewは計算サブviewの高さを呼び出し、最後にlistviewの全体の高さを計算するので、何度も呼び出されます.
詳しく説明する
実際には通常の角度から言えば、複数回のgetviewメソッドを呼び出すのは間違いありません.前のgetviewメソッドで返されるviewはlistviewに追加されず、計算高さとして使用されるだけですが、listviewに追加されたedittextのtextwocherは何度もコールバックされ、コールバック内容がおかしいのが不思議です.原因不明なので、解決策はtextwacherのコールバックメソッドを修正することです
if (!holder.et_price.getRootView().getClass().toString().contains("DecorView")
	|| holder.et_price.getParent().getParent().getParent().getParent().getParent() == null)
	return;
if (holder.et_price.getParent().getParent() == null) 
	return;

2つの関数のうちの1つがedittextの親viewがlistviewに追加されたviewかどうかを識別し、しばらくこの解決策を考えていたが、具体的な原因も分からず、出会ったことを弟に話した.
もう1つは、listviewがlistviewをネストし、内層listviewのonmeasureメソッドを書き換えると、中のlistviewはすべての項目のgetviewメソッドを一度に呼び出すので、画面の移動に伴ってconvertviewを動的に多重化することはありません.そのため、内層listviewのedittextはedittext入力内容が現れず、画面の外を引っ張って、これを引き戻した後、このedittextが前回入力した内容が保存されていない場合.しかしlistview+edittextが単独で発生する場合、mapを定義して各edittextの入力値を保存するのが最善の方法です.