2013-04-08 2 views
5

Есть ли способ получить идентификатор ресурсов (например, R.layout.viewtoInflate) макета, из которого было завышено представление?Получить идентификатор ресурса, из которого было завышено представление

Я пытаюсь реализовать представление списка, которое использует 2 настраиваемых макета для элементов списка. Какой макет элемента используется, основан на поле в объектах, используемых для заполнения списка.

Что мне не хватает в моем адаптере - это способ узнать, какой ресурс «convertView», который я получаю в getView(), был завышен. Если бы я мог получить эту информацию, я мог бы сравнить и определить, могу ли я повторно использовать представление конвертации как есть, или если мне нужно заменить его соответствующим макетом для текущего элемента.

Так в идеале было бы что-то вроде этого: виды

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

    JSONObject currItem = mItems.getJSONObject(position); 

    int layoutType; 

    if (currItem.getBoolean("alternate")) 
     layoutType = R.layout.list_item_b; 
    else 
     layoutType = R.layout.list_item_a; 

    if (convertView == null || <convertView.resourceID> != layoutType) { 
     convertView = inflater.inflate(layoutType, null); 

     //Finish setting up new View and its holder 
    } 
    else { 
     //Get view holder for view reuse 
    } 

    //populate view with the required content 

    return convertView; 
} 

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

ответ

5

Существует официальный способ использования нескольких макетов, просто переопределить getViewTypeCount() и getItemViewType(). Эти методы информируют Адаптер о ожидании нескольких макетов, и convertView всегда будет подходящим макетом (поэтому не нужно проверять идентификатор ресурса.) Для примера кода см. this example.

Но если вы хотите выяснить, какой макет есть, просто проверьте уникальную характеристику. Например, вы можете использовать findViewById() в представлении, который существует только в одном макете, а затем проверить, возвращает ли он null или нет.

+0

Я не понимаю, как я пропустил эту многофункциональную функциональность, но спасибо. Также спасибо за предложение найти тип макета, который больше не нужен, но хорошо знать в любом случае. Тем не менее мне кажется странным, что нет официального способа получить макет завышенного взгляда. – RobertoCuba

3

Вид списка поддерживает несколько макетов - вам нужно вернуть количество макетов, используемых в getViewTypeCount(), и исправить тип макета для строки в getItemViewType().

И если вы хотите узнать, с какого макета он был завышен, вы можете прикрепить любую информацию к виду с помощью setTag() и получить его позже, используя getTag() - это может быть ваш layoutId или что-то еще.

-1

Если вы запрашиваете получение идентификаторов предметов из макета, который вы надули. Это выглядит следующим образом: -

//Suppose you have an TextView in the inflated layout of id textView1. Here you go 

convertView = inflater.inflate(layoutType, null); 
TextView tv = (TextView)convertview.findViewById(R.id.textView1); 
+0

Как приведенный выше код возвращает идентификатор раздутого элемента. findviewbyid возвращает только представление, а не идентификатор –

1

Что я могу сделать, это сохранить сырьевую Id накачанное зрение в держателе вида при создании вида. Это позволяет мне получить идентификатор ресурса макета, когда я заполняю представления.

Надеюсь, это поможет.

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