Поддержка RecyclerView ничего не показывает, пока не коснется

Я использую поддержку RecyclerView в своем приложении, и я вижу самую причудливую вещь. Он не отображает никаких элементов, пока я не коснусь прокрутки. Затем, внезапно, RecyclerView заполняет себя. Я подтвердил, что список, поддерживающий адаптер, заполнен, и что onCreatViewHolder и onBindViewHolder никогда не вызываются до события касания.

Вот как я настроил recyclerview:

@Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { Drawable divider = new ColorDrawable(ProfileInfo.getCurrentProfileColor()); mInboxList.addItemDecoration(new DividerItemDecoration(getActivity(), divider, false)); mInboxList.setLayoutManager(new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false)); mInboxList.setAdapter(new InboxAdapter(getActivity(), new ArrayList<Conversation>())); new AsyncTask<Void, Void, List<Conversation>{ public List<Conversation> doInBackground(...){ //load the conversations return conversations; } public void onPostExecute(List<Conversation> conversations){ ((InboxAdapter) mInboxList.getAdapter()).clear(false); ((InboxAdapter) mInboxList.getAdapter()).addAll(conversations); } }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } 

Вот суть моего адаптера:

 public class InboxAdapter extends RecyclerView.Adapter<InboxAdapter.ViewHolder> { List<Conversation> mConversations; //initialized in contructor @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View v = mInflater.inflate(R.layout.inbox_item, parent, false); ViewHolder holder = new ViewHolder(v); Log.d(LOG_TAG, "oncreateviewholder : " + viewType); //never called when I first bind the adapter return holder; } @Override public void onBindViewHolder(final ViewHolder holder, int position) { final Conversation item = mConversations.get(position); Log.d(LOG_TAG, "binding " + position); ... } @Override public int getItemCount() { Log.d(LOG_TAG, "item count: " + mConversations.size()); return mConversations.size(); } /** * Empties out the whole and optionally notifies */ public void clear(boolean notify) { mConversations.clear(); if (notify) { notifyDataSetChanged(); } } public void addAll(List<Conversation> conversations) { mConversations.addAll(conversations); notifyDataSetChanged(); } } 

Вот файл макета:

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingTop="?attr/actionBarSize"> <android.support.v7.widget.RecyclerView android:id="@+id/lv_inbox" android:layout_width="match_parent" android:layout_height="match_parent" ></android.support.v7.widget.RecyclerView> </RelativeLayout> 

Я использую recyclerview-v7: 21.0.3, работающий на Moto X с версией 4.4.4.

EDIT: гладкая прокрутка в конце onPostExecute, похоже, решает проблему:

 if (mInboxList.getAdapter().getItemCount() > 0) { mInboxList.smoothScrollToPosition(0); } 

Solutions Collecting From Web of "Поддержка RecyclerView ничего не показывает, пока не коснется"

Если кто-то еще сталкивается с этой проблемой с помощью RxJava и Retrofit, я решил эту проблему, добавив в мою цепочку методов до того, как подписал подписку .observeOn(AndroidSchedulers.mainThread()) . Я читал, что по умолчанию позаботился, и, следовательно, он явно не нужен, но, я думаю, нет. Надеюсь это поможет.

Пример:

 public void loadPhotos() { mTestPhotoService.mServiceAPI.getPhotos() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(photoList -> mRecyclerActivity.OnPhotosLoaded(photoList)); } 

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

Скорее всего, потому, что вы не вызываете правильные методы уведомления RecyclerView.Adapter. У вас для этого гораздо более гранулярный интерфейс, чем в ListAdapters. Например, в addAll () вы должны вызвать notifyItemRangeInserted(oldConversationsSize, conversations.size()) вместо notifyDataSetChanged