2016-07-23 2 views
0

У меня 2 viewTypes в моем RecyclerView - A и BДобавление просмотров в RecyclerView динамически

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

Итак, у меня есть 2 ViewHolders (один для A, один для B). Мое требование - показать B только в том случае, если он успешно отобрал все данные с сервера. Итак, изначально я делаю видимость просмотра B в GONE и переуступаю в VISIBLE, когда у него есть данные для показа.

Проблема с этим подходом заключается в том, что разделители (заданные с использованием ItemDecoration) для представлений B отображаются, даже когда контент GONE. Это приводит к большим разрывам в RecyclerView, а B - загрузке. Если они не загружаются, я удаляю B-виды, поэтому эта часть не является проблемой.

Глядя на API ItemDecoration Я не думаю, что есть способ условно показать разделители.

Итак, я ищу способ создания представлений B вне RecyclerView, а затем добавить представление в RecyclerView. Является ли это возможным ? Или есть лучшее решение моей проблемы?

Возможным обходным путем является падение ItemDecoration и вместо этого добавление полей к точкам A и B и сброс поля B с 0 до более высокого значения при получении данных. Я не тестировал этот подход, но я бы хотел его избежать, потому что у меня слишком много типов viewTypes (A и B - всего лишь два из них), и большинство из них - это пользовательские представления, макет которых мне придется изменить.

ответ

0

Я хотел бы предложить вам общий список, из которого вы заполните свой RecyclerView. Поэтому, когда элементы B завершены с их служебными вызовами, они будут вставлены в этот общий список соответственно, и изменения в списке могут легко вступить в силу, вызвав notifyDatasetChanged на адаптер.

Итак, вот общий класс, который я хотел бы предложить.

public class CommonClass { 
    public ClassA; 
    public ClassB; 
    public ClassC; 

    // .... You can put other classes here as you need to populate all the items in a single list 

    // You can set this tag like "A" to specify this object is a A type object. 
    // This is necessary when you'll populate the items in your list. 
    // You'll check the tag first in your `getView` method and will take actions accordingly after checking the tag. 
    public String tag; 
} 

Теперь возьмите список CommonClass, а затем заполнить пункты. Когда вызовы веб-службы завершены, вы можете повторно заполнить данные в этом списке, а затем позвонить notifyDatasetChanged в свой Adapter.

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