0

カスタムクラスで満たされたlistViewがありますBaseAdapterを拡張します

 private List<Bundle> allTipologiaInsetti = ....;
 listView.setAdapter(new CustumAdapter(getBaseContext(), allTipologiaInsetti, this));

それから私のアダプターで..

public class CustumAdapter extends BaseAdapter {

public CustumAdapter (Context context, List<Bundle> items, RaccoltaDatiQuestions activity) {
    // TODO Auto-generated constructor stub
    this.context = context;
    this.items = items;
    //update
    map = new HashMap<Number, String>();

}
...
public View getView(final int position, View convertView, ViewGroup parent) {
    Bundle myObj = items.get(position);
    ViewHolder holder;
    view = convertView;
    if (view == null ) {
        holder = new ViewHolder();
        view = inflater.inflate(R.layout.tipologia_insetti_item, null);
        holder.campoNum = (EditText) view.findViewById(R.id.numField);
        view.setTag(holder);
    } else {
        holder = (ViewHolder) view.getTag();
    }
    //UPDATE
    String num = map.get(position);
    if(num!=null && !num.equals("")){
        holder.campoNum.setText(num + "");
    }else {
        holder.campoNum.setText(myObj.getInt("num") + "");
    }


    holder.campoNum.addTextChangedListener(new GenericTextWatcher(holder.campoNum, position));

}

        public GenericTextWatcher(EditText campNum, int position) {
        this.position = position;
        this.campoNum = campNum;
    }

    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { }

    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {  }

    public void afterTextChanged(Editable s) {
        if (campoNum.getText().length() > 0) {
            if (campoNum.getText().hashCode() == s.hashCode()) {
                Bundle myObj = items.get(position);
                myObj.putInt("num", Integer.parseInt(s.toString()));
               //UPDATE
                map.put(position, s.toString());

            }
        }

    }
}

「campoNum」は編集テキストです:

リストの最初のアイテムで「campoNum」の値を変更します(そしてそれはうまくいきます)が、下にスクロールすると、リストの他のいくつかのアイテムは最初のアイテムと同じ値を保持します....

私はそれを分析しようとしましたが、次のことがわかりました。

リストに 3 つのアイテムが表示されていて、最初のアイテムを変更すると、5 番目は最初と同じ値になり、最初のアイテムを変更すると 4 つのアイテムが表示されると、6 番目も変更されます... など。

「if (view == null )」を削除して、毎回ビューを膨らませるようにすると、問題は解決します!

私がよく理解している場合:リストの1つのアイテムが非表示になるたびに(最初のアイテム)、新しく表示されるアイテム(5番目のアイテム)に使用され、5番目のアイテムに渡されたconvertVIewは最初のアイテムと同じです

助言がありますか?

4

2 に答える 2

2

ええ、それがリストビューの仕組みです。上下にスクロールすると、アイテムが元のレイアウトとデータに再印刷されます。アイテムのアイコンの色を変更すると、まったく同じ問題が発生しました。

myText= ""回避策は、すべてのリストビュー項目に対して配列などの配列項目を使用することです。配列アイテムの位置は、リストビュー内のアイテムの位置と同じです。

editText にテキストを追加するときに getView でそれを配列の myText に保存します。

あなたがする必要があるのは、再びgetViewで言うことです

if myText is not emptyadd myText to the items editText。これはすべてコードで行います。

上下にスクロールすると、アイテム editText のテキストが格納されたテキスト (myText など) で埋められます。

このメソッドは、リストビュー内の項目を変更したい場合に使用します。アイコン、テキストなど

したがって、アイテムの状態またはデータの変更を表すために配列に何かを格納し、スクロールするときにそれを設定します。

これはすべて内部で行われますgetView

于 2015-10-16T09:30:15.107 に答える