Удаление элементов из ListView с помощью настраиваемого BaseAdapter

Я использую настраиваемый BaseAdapter для отображения элементов в ListView. Элементы - это просто строки, хранящиеся в ArrayList.

На элементах списка есть кнопка удаления (большой красный крестик), и я бы хотел удалить элемент из ArrayList и уведомить ListView о необходимости обновления.

Однако все реализации, которые я пробовал получает таинственные номера позиций, присвоенные ему, поэтому, например, нажатие кнопки удаления элемента 2 удалит элемент 5. Это кажется почти полностью случайным.

Следует отметить, что элементы могут повторяться, но должны сохраняться в том же порядке. Например, я могу дважды использовать «ирландский» в качестве элементов 3 и 7.

Мой код приведен ниже:

private static class ViewHolder {
        TextView lang;
        int position;
}

public View getView(final int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.language_link_row, null);
        holder = new ViewHolder();
        holder.lang = (TextView)convertView.findViewById(R.id.language_link_text);
        holder.position = position;

        final ImageView deleteButton = (ImageView) 
                convertView.findViewById(R.id.language_link_cross_delete);
        deleteButton.setOnClickListener(this);

        convertView.setTag(holder);
        deleteButton.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    holder.lang.setText(mLanguages.get(position));

    return convertView;
}

Позже я пытаюсь получить позицию удаленного элемента, захватив тег, но это всегда неправильная позиция в список. В данной позиции нет заметного рисунка, она всегда кажется случайной.

// The delete button's listener
public void onClick(View v) {

    ViewHolder deleteHolder = (ViewHolder) v.getTag();
    int pos = deleteHolder.position;

    ...
    ...
    ...
}

Я был бы счастлив просто удалить элемент из ArrayList и обновить сам ListView, но позиция, которую я получаю, неверна, поэтому я не могу этого сделать.

Обратите внимание, что я это сделал, на сначала поместите deleteButton clickListener внутри метода getView и используйте 'position' для удаления значения, но у меня была та же проблема.

Любые предложения приветствуются, это меня действительно раздражает.

8
задан Brian Tompsett - 汤莱恩 14 July 2015 в 21:37
поделиться