2014-11-21 2 views
8

У меня есть RecyclerView, который не отображает никаких элементов. Первоначально он пуст, но позже я добавляю элементы и вызываю notifyDatasetChanged(). getItemCount() вызывается и возвращает 25, onBindViewHolder вызывается 3 раза и правильно настраивает представление.RecyclerView не отображает

public AlbumListAdapter(FacebookActivity activity, long pageId, OnItemClickListener listener){ 
    this.listener = listener; 
    this.inflater = LayoutInflater.from(activity); 
    this.service = new PagedGraphService<Album>(String.format("https://graph.facebook.com/%d/albums", pageId), 
      new PagedGraphService.ServiceUpdateListener() { 
     @Override 
     public void dataUpdated() { 
      notifyDataSetChanged(); 
     } 

     @Override 
     public void endReached() { 

     } 
    }, 
    new TypeToken<PagedGraphService.GraphResponse<Album>>(){}.getType()); 
} 

@Override 
public AlbumHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 
    return new AlbumHolder(inflater.inflate(R.layout.photo_album_list_card, viewGroup, false)); 
} 

@Override 
public void onBindViewHolder(AlbumHolder viewHolder, int i) { 
    viewHolder.setAlbum(service.get(i)); 
} 

@Override 
public int getItemCount() { 
    return service.getLoadedCount(); 
} 

Суть его. Служба содержит список альбомов и уведомляет адаптер об изменениях, вызывая dataUpdated() и endReached().

Подробнее Код:

@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    RecyclerView view = (RecyclerView) inflater.inflate(R.layout.recycler, container, false); 
    view.setLayoutManager(new LinearLayoutManager(activity, LinearLayoutManager.VERTICAL, false)); 
    view.setHasFixedSize(false); 
    AlbumListAdapter adapter = new AlbumListAdapter(activity, FacebookActivity.PSM_PAGE_ID, this); 
    view.setAdapter(adapter); 
    return view; 
} 

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v7.widget.RecyclerView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

</android.support.v7.widget.RecyclerView> 

Еще код:

Активность раскладка

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" android:layout_height="match_parent"> 

<include layout="@layout/toolbar"/> 

<FrameLayout 
    android:id="@+id/content" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"/> 

</LinearLayout> 

Элемент списка расположение:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v7.widget.CardView 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:layout_width="match_parent" 
android:layout_height="wrap_content"> 

<TextView 
    android:id="@+id/album_list_title" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"/> 

</android.support.v7.widget.CardView> 

раскладка Список:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v7.widget.RecyclerView 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 

</android.support.v7.widget.RecyclerView> 

Я тыкать код в течение нескольких часов, и я понятия не имею, почему он не работает

+0

a) Вы должны показать нам свой код; b) Вызов 'notifyDatasetChanged()' в RecyclerView неэффективен и, следовательно, не крут. – reVerse

+0

Атрибут notifyDataSetChanged адаптера вызывается, когда я получаю данные. – DariusL

+0

Это в основном то, что я считаю - цитирование [Документы] (https://developer.android.com/reference/android/support/v7/widget/RecyclerView.Adapter.html#notifyDataSetChanged%28%29): 'Если вы при написании адаптера всегда будет более эффективно использовать более конкретные события изменений, если сможете. Положитесь на notifyDataSetChanged() в качестве последнего средства. ' – reVerse

ответ

21

Я идиот.

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" android:layout_height="match_parent"> 

<include layout="@layout/toolbar"/> 

<FrameLayout 
    android:id="@+id/content" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"/> 

</LinearLayout> 

Ориентация по умолчанию для LinearLayout горизонтально, а ширина панели инструментов является match_parent, так что мое содержание было за пределами экрана. Вероятно, это одна из самых популярных ошибок на Android, поэтому вы получаете предупреждение, но include, должно быть, скрыл ее.

+1

Я люблю тебя. Я потратил на это час. Я даже закончил тем, что сделал чашку чая, Лол. –

+0

Ориентация по горизонтали LinearLayout по умолчанию. Довольно легко поверить, что макет вертикальный, добавить к нему несколько дочерних элементов и удивляться, почему видна только первый ребенок (когда последующие дети выходят за пределы экрана справа). Это правило lint помогает выявить эту проблему, предупреждая всякий раз, когда LinearLayout используется с неявной ориентацией и несколькими дочерними элементами. Он также проверяет наличие пустых LinearLayouts без атрибута ориентации, который также определяет атрибут id. Это захватывает сценарии, в которых дети будут динамически добавляться в LinearLayout. –

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