2017-02-27 4 views
0

ListViewのカスタムアダプタを使用して各リスト項目のレイアウトを拡張しています。各リスト項目には、ユーザーがリストビューから項目を削除できるボタンがレイアウト内にあります。また、ユーザー入力用の編集テキストもあります。私は、編集テキストがいっぱいになったときにユーザーがそのアイテムを削除すると、その値がその下のリスト項目の編集テキストに移動するという問題が発生しています。たとえば、リストビューの1位の編集テキストの値が '25'の場合、ユーザーはアイテムをクリックして削除すると、値25が1の新しいアイテムに移動します。カスタマーアダプタを利用したListViewは、削除された項目から次の項目へのテキスト値の編集を行います。

アダプタのクラス

public class PartOrderAddPartAdapter extends ArrayAdapter<Part> { 
private static final int layoutResourceId = R.layout.part_information_list_item; 
private List<Part> partList; 
private final Context context; 

public PartOrderAddPartAdapter(Context context, List<Part> partList) { 
    super(context, layoutResourceId, partList); 
    this.context = context; 
    this.partList = partList; 
} 

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    View view = convertView; 

    if (view == null) { 
     LayoutInflater inflater = LayoutInflater.from(context); 
     view = inflater.inflate(layoutResourceId, null); 
    } 

    Part p = getItem(position); 

    TextView partNumber = (TextView) view.findViewById(R.id.part_number); 
    TextView partDescription = (TextView) view.findViewById(R.id.part_description); 
    EditText quantity = (EditText) view.findViewById(R.id.quantity); 
    Button removePartButton = (Button) view.findViewById(R.id.remove_part_button); 

    partNumber.setText(p.getPartNumber()); 
    partDescription.setText(p.getDescription()); 

    removePartButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      partList.remove(position); 
      notifyDataSetChanged(); 
     } 
    }); 

    return view; 
} 

@Override 
public Part getItem(int position) { 
    return partList.get(position); 
} 
} 

答えて

1

行のビューが再利用されることを覚えておく必要があります。 未使用の場合は新しいものを作成しません。あなたは自分のコードで見ることができるように、再充填のためにconvertViewでそれを受け取ります。

したがって、以前の値があった場合でもそれはまだ存在します。 それをクリアするのはあなた次第です。

簡単に言えば、行のすべてのフィールドの値を設定する必要があります。そこにある価値について何も仮定することはできません。

0

ビューを再利用すると、ビューを変更したときに再利用されたとき(つまり、リストをスクロールまたはリフレッシュするとき)にビューに加えられた変更が表示されます。あなたのケースでは、リストからアイテムを削除していますが、ビューからテキストをクリアしません。 notifyDataSetChanged()を呼び出すと、ビューが上に移動し、テキストは引き続き表示されます。

あなたがする必要があるのは、notifyDataSetChanged()を呼び出す前にその位置のビューからテキストを消去することです。

もう1つ注目すべきことは、リストアダプタでビューを再利用する場合の条件文の使用です。要するに、elseをifに続けて、ステートメントがfalseと評価されたときにビューがデフォルト状態にリセットされるようにします。

関連する問題