2016-11-22 3 views
0

Так что я пытаюсь установить другой ресурс макета для моего первого элемента ListItem, используя этот код:Настройка макета первого ListView Пункт

int type; 
@Override 
public int getItemViewType(int position) { 

    if(position==0) { 
     type = R.layout.queue_item_next; 
    } else { 
     type = R.layout.queue_item; 
    } 

    return type; 
} 


@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    if(convertView == null) { 
     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = (View) inflater.inflate(getItemViewType(position), parent, false); 
    } 

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

Что может быть причиной этого?

Спасибо.

+0

Может быть, потому что '' convertView повторно используемый. Удалите условие 'if' и проверьте, работает ли оно? – Sanjeet

+0

Я не уверен на сто процентов, но я думаю, что это связано с переработкой вида. Вы в настоящее время проверяете, является ли convertView равным null, но я думаю, вы также должны проверить текущий тип convertView. Вы можете сохранить это в теге convertView для выполнения этой проверки – 0xDEADC0DE

+0

, но не добавляя проверку для convertView, увеличит объем памяти, когда число элементов, которое будет отображаться, велико, нарушая концепцию просмотра вторсырья. – Swapnil

ответ

0

потому что вы используете if(convertView == null) {} , что означает, что если в памяти используется предыдущий вид, создайте новый. Таким образом, иногда по прокрутке быстро/медленно зависит от доступных ресурсов телефона.

, чтобы решить эту проблему Dont проверить if(convertView == null)

использовать как этот

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = (View) inflater.inflate(getItemViewType(position), parent, false); 
    } 
2

Выпуск грядет из-за getItemViewType() возвращает значение, большее количество типов просмотра. Вы можете использовать следующий код, который отлично работает для меня.

@Override 
    public int getItemViewType(int position) { 

     if(position==0) { 
      return 0; 
     } 
     return 1; 
    } 

    @Override 
    public int getViewTypeCount() { 
     return 2; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     if(convertView == null) { 
      LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      int type = getItemViewType(position); 
     if(type == 0) 
      convertView = (View) inflater.inflate(R.layout.first_layout, parent, false); 
     else 
     convertView = (View) inflater.inflate(R.layout.second_layout, parent, false); 
     } 
} 

Примечания: Если только первый вид отличается, то лучшим вариантом является использование функции headerView с помощью функции listview.addHeaderView() с помощью этого link

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