2013-07-28 4 views
4

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

1.One линия

2.Two линии

3.Three линии

4.One линия

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

Я нашел способ исправить это, однако это, вероятно, неверный - он создает новый вид, даже если 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; 
    } 
} 

ответ

0

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

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

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

в

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

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

Смежные вопросы