1

その行を削除する必要がある2つのテキストビューと1つのボタンを備えたカスタムアダプターがあります。

public class ListViewAdapter extends ArrayAdapter<OneRowListView> implements OnClickListener {
private ArrayList<OneRowListView> items;
private ContactsActivity ca;
private int position;
private OneRowListView o;

public ListViewAdapter(Context context, int textViewResourceId, ArrayList<OneRowListView> items) {
    super(context, textViewResourceId, items);
    this.items = items;
    ca = (ContactsActivity) context;
}   
@Override
public View getView(int pos, View convertView, ViewGroup parent) {
        View v = convertView;
        position = pos;
        if (v == null) {
            LayoutInflater vi = (LayoutInflater)ca.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = vi.inflate(R.layout.one_item_contacts_list, null);
        }
        o = items.get(position);
        if (o != null) {
                TextView name = (TextView) v.findViewById(R.id.name);
                TextView surname = (TextView) v.findViewById(R.id.surname);
                TextView phoneNumber = (TextView) v.findViewById(R.id.phonenumber);
                Button deleteButton = (Button) v.findViewById(R.id.deleteButton);
                deleteButton.setOnClickListener(this);
        // ...
        }
        return v;
 }

@Override
public void onClick(View v) {
    switch(v.getId()){
    case R.id.deleteButton:
        remove(items.remove(position));
        notifyDataSetChanged();
        break;
    }       
}
 }

問題は、いずれかのボタンを押すと、現在の行ではなく常に最後の行が削除されることです。変数の位置は常に最後の行を指します。問題はどこだ ?

4

1 に答える 1

2

問題はposition = pos;、「位置」変数をオーバーライドし続けることです (ListView をスクロールしているときに各行に対して getView() が呼び出されるため)。

簡単な修正として、'position' 変数を使用する代わりにdeleteButton、行の位置を含むタグを保存できます。たとえば、 getView() メソッドで次のようにします。

deleteButton.setTag(pos);

次に、 onClick() メソッドで次のことができます。

int position = (int) v.getTag();
...
于 2013-02-08T23:23:01.660 に答える