2015-05-15 6 views
0

im работает над раскладкой чата, и мне нужно два «разных» макета для отправки & полученных сообщений. 2 макета почти одинаковы, поэтому можно было бы иметь только одно и динамически менять свой фон и некоторые его свойства силы тяжести/поля/заполнения.Самый эффективный способ иметь два разных макета в Android RecyclerView

После работы с RecyclerView у меня есть сомнения в эффективности. Для достижения своей цели я вижу два подхода:

  1. Используйте 1 вид и изменить его в onBindViewHolder программно()
  2. Используйте 2 типа просмотра.
  3. ¿Более эффективный способ?

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

PD: Фоны - это 9-кратные изображения, а в сценарии 1 - загрузка их с использованием методов getResources() и setBackground(). На старых устройствах прокрутка немного медленная.

+0

У вас были какие-либо проблемы с производительностью с RecyclerView раньше? если нет, то зачем волноваться? – pskink

+0

Свиток чувствует себя немного медленным на старых устройствах. PD: Фоны - это 9-кратные изображения, им не известно, как медленно их динамически устанавливать, вот почему я спрашиваю! – GuillermoMP

+0

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

ответ

0

Эта функциональность фактически встроена в RecyclerView. Вы заметите, что подпись метода для createViewHolder равна createViewHolder(ViewGroup parent, int viewType). viewType - это то, что вам нужно. Для этого вы переопределяете getItemViewType, чтобы в зависимости от позиции он возвращал другое целое число для отправленных или полученных сообщений. Это позволит вам в createViewHolder создать простой оператор switch, чтобы выбрать соответствующий тип вида.

@Override 
public int getItemViewType(int position) { 
     if(listOfMessages.get(position).isSentMessage()) 
      return 1; 
     else 
      return 2; 
} 

@Override 
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType){ 
     if(viewType == 1) 
      //inflate sent message layout 
     else if(viewType == 2) 
      //inflate received message layout. 
} 
+0

Я считаю, что OP знает, что: см. его подход № 2 «Использовать 2 вида вида». – pskink

+0

Да, я уже знаю, что мой вопрос в том, является ли это правильным/эффективным способом сделать это! Спасибо за код в любом случае. – GuillermoMP

+0

Это самый эффективный способ сделать это. –

0

Прежде всего, измерьте и убедитесь, что это критическая сессия.

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

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