Получить идентификатор ресурса, из которого было завышено представление

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

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

То, что мне не хватает в моем пользовательском адаптере, – это способ узнать, из какого ресурса «конвертируемый», который я получаю в 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; } 

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

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

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

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

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

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

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

Если вы запрашиваете получение элементов идентификатора из макета, который вы надули. Это происходит так:

 //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);