Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 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.