Удаление элемента ListView изменяет высоту элемента

У меня есть ListView, элементы которого можно удалять, проводя по ним пальцем. Когда элемент считывается, его строка базы данных удаляется, а также его объект в наборе данных адаптера, а также вызывается notifyDataSetChanged(). Проблема в том, что эти элементы имеют разную высоту — один может быть однострочным, второй может состоять из четырех строк. Итак, когда у меня есть некоторые элементы в списке, скажем:

1.Одна линия

2. Две линии

3.Три линии

4.Одна линия

А второй удаляется, третий идет на свое место (как и положено), но обрезается до двух строк. И когда третий элемент удаляется, высота четвертого элемента увеличивается, чтобы соответствовать удаленному элементу.

Я нашел способ исправить это, однако, вероятно, он неправильный - он создает новое представление, даже если convertView не равен нулю.

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

Текущий код адаптера:

public class CounterItemAdapter extends BaseAdapter{
    private Activity activity;
    private ArrayList<CounterItem> data;
    private SQLiteOpenHelper helper;
    private static LayoutInflater inflater = null;

    public CounterItemAdapter(Activity activity, ArrayList<CounterItem> data, SQLiteOpenHelper helper) {
        this.activity = activity;
        this.data = data;
        this.helper = helper;
        inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public int getCount() {
        return data.size();
    }


    @Override
    public CounterItem getItem(int position) {
        return data.get(position);
    }
    @Override
    public long getItemId(int position) {
        return getItem(position).getId();
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = convertView;
        //if(convertView == null)
            view = inflater.inflate(R.layout.counter_list_item, null);
        TextView nameView = (TextView)view.findViewById(R.id.nameView);

        //other, unrelated views were here

        final CounterItem counterItem;
        counterItem = getItem(position);

        nameView.setText(counterItem.getName());

        return view;
    }
}

person Jakub Kozłowski    schedule 28.07.2013    source источник


Ответы (1)


Хорошо, я нашел решение.

Добавлено int lastValidPosition = -1; в адаптере, затем adapter.lastValidPosition = position-1 в методе обратного вызова удаления, перед adapter.notifyDataSetChanged(); и в методе getView() адаптера, который я изменил

//if(convertView == null)
    view = inflater.inflate(R.layout.counter_list_item, null);

to

if(lastValidPosition < position | convertView == null){
    view = inflater.inflate(R.layout.counter_list_item, null);
    lastValidPosition = position;
}

и это работает отлично.

person Jakub Kozłowski    schedule 28.07.2013