Как заставить RecyclerView обновить его макет?
У меня есть RecyclerView
с кучей пользовательских представлений, которые могут меняться через какое-то время, потому что они содержат ImageView
, которые загружают их изображение асинхронно. RecyclerView
не выбирает это изменение макета, хотя я вызываю forceLayout
в ImageView
, а RecyclerView
инициализируется setHasFixedSize(false)
. Все контейнеры-родители ImageView
установили android:layout_height="wrap_content"
.
Как я могу сделать RecyclerView
обновить его макет? С good'ol ListView
это не было проблемой.
Ответы
Ответ 1
Google окончательно установил это в библиотеке поддержки v23.2. Проблема исправлена путем обновления этой строки в build.gradle
после обновления вашего репозитория поддержки с помощью диспетчера SDK:
compile 'com.android.support:recyclerview-v7:23.2.0'
Ответ 2
Вы можете использовать notifyDataSetChanged
в Adapter
для RecyclerView
, если все ваши изображения будут меняться в одно и то же время или notifyItemChanged(int position)
, если изменился только один из элементов. Это скажет RecyclerView
, чтобы переустановить конкретный View
.
Ответ 3
Вызвать методы notifyDataSetChanged()
или notifyItemChanged(int position)
RecyclerView.Adapter
из ОСНОВНОЙ НИТЬ. Вызов его из AsyncTask
может привести к тому, что основной поток не обновит ImageView
s. Наиболее удобно использовать метод обратного вызова в работе/фрагменте как слушатель и вызывать его AsyncTask
в onPostExecute()
Ответ 4
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 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);
Этот код работает для меня.
Ответ 5
У меня была такая же проблема, я просто установил ширину и высоту исправления для ImageView. Попробуйте это и посмотрите, где вы. Вы также можете использовать lib для этого, я использую Square Picasso, и я получил его работу с RecyclerView.