Как заставить RecyclerView обновлять макет?

У меня есть RecyclerView с кучей пользовательских представлений, которые через некоторое время могут изменить высоту, потому что они содержат ImageView которые загружают их изображение асинхронно. RecyclerView не подбирает это изменение макета, хотя я вызываю forceLayout в ImageView , а RecyclerView инициализируется с помощью setHasFixedSize(false) . Все контейнеры-родители ImageView установили android:layout_height="wrap_content" .

Как я могу сделать RecyclerView обновить его макет? С good'ol ListView это не проблема.

Solutions Collecting From Web of "Как заставить RecyclerView обновлять макет?"

Вы можете использовать notifyDataSetChanged в Adapter для RecyclerView если все ваши изображения будут меняться в одно и то же время или notifyItemChanged(int position) если изменился только один из элементов. Это скажет RecyclerView чтобы переустановить конкретный View .

Наконец, Google установил это в библиотеке поддержки v23.2 . Проблема исправлена ​​путем обновления этой строки в build.gradle после обновления вашего репозитория поддержки с помощью диспетчера SDK:

 compile 'com.android.support:recyclerview-v7:23.2.0' 

Вызовите notifyDataSetChanged() или notifyItemChanged(int position) для RecyclerView.Adapter из ОСНОВНОЙ НИТИ . Вызов его из AsyncTask может привести к тому, что основной поток не AsyncTask ImageView . Наиболее удобно использовать метод обратного вызова в работе / фрагменте как слушатель и вызывать его в AsyncTask в onPostExecute()

 int wantedPosition = 25; // Whatever position you're looking for int firstPosition = linearLayoutManager.findFirstVisibleItemPosition(); // This is the same as child #0 int wantedChild = wantedPosition - firstPosition; if (wantedChild < 0 || wantedChild >= linearLayoutManager.getChildCount()) { Log.w(TAG, "Unable to get view for desired position, because it's not being displayed on screen."); return; } View wantedView = linearLayoutManager.getChildAt(wantedChild); mlayoutOver =(LinearLayout)wantedView.findViewById(R.id.layout_over); mlayoutPopup = (LinearLayout)wantedView.findViewById(R.id.layout_popup); mlayoutOver.setVisibility(View.INVISIBLE); mlayoutPopup.setVisibility(View.VISIBLE); 

Этот код работает для меня.

У меня была та же проблема, я просто установил ширину и высоту исправления для ImageView. Попробуйте это и посмотрите, где вы. Вы также можете использовать lib для этого, я использую Square Picasso, и я получил его работу с RecyclerView.