2016-03-31 2 views
2

У меня есть в основном все в одном макете, в котором есть все необходимое для основного фида моего приложения. Все переменные элементы (изображения, видеоролики и т. Д.) Сначала устанавливаются на GONE и устанавливаются на VISIBLE, когда это необходимо.Android - RecyclerView с одним макетом, несколько setVisibility

Проблема, возможно, связана с поведением утилизации RecyclerView, элемент, который предположительно должен быть GONE, является VISIBLE в неправильных местах.

Пример:

товара нет 1 не содержит текст

товара нет 2 не содержит Изображение

товара нет 3 не содержит изображение

Я держать прокрутки вниз к пункту не х, затем прокрутите резервную копию и вот что я получаю:

Артикул № 1 не содержит изображения из пункта нет х, иногда пункт нет 3

Пункт № 2 содержит Изображение

товара нет 3 не содержит Изображение

Я использую пользовательский ViewHolder который extends RecyclerView.ViewHolder , Цель CustomViewHolder - это объявление и инициализация макета.

ProgressBar progressBar; 
    View viewDimmer; 
    RelativeLayout postListWrapper; 

    ... 

    public ObjectViewHolder(View v) { 
     super(v); 
     progressBar = (ProgressBar)v.findViewById(R.id.post_inscroll_progressBar); 
     viewDimmer = (View)v.findViewById(R.id.post_inscroll_viewDimmer); 
     postListWrapper = (RelativeLayout)v.findViewById(R.id.post_inscroll_postListWrapper); 
    } 

Пример того, как я загрузить изображение:

Picasso.with(context) 
    .load(youtubeThumbnailUrl) 
    .fit() 
    .centerCrop() 
    .into(
     ((ObjectViewHolder) holder).userPostYoutubeImage 
    ); 

Я установил каждую видимость GONE, если URL не получается с сервера

((ObjectViewHolder) holder).userPostImageWrapper.setVisibility(View.GONE); 
((ObjectViewHolder) holder).userPostYoutubeImageWrapper.setVisibility(View.GONE); 

Но почему-то изображение по-прежнему используется повторно для предыдущих элементов (да, не только для элемента № 1). Иногда изображение также ошибочно ImageView. Изображение D должно быть в ImageView D, но оно находится в ImageView A вместо.

Любое руководство по настройке RecyclerView хорошо и хорошо?

Если я пропустил что-нибудь, или нужно предоставить больше кода, пожалуйста, сообщите мне: D

ответ

6

Вам нужно поставить условие else тоже. Как пример ниже.

// if no url is found from server 
if(url == null){ 
    ((ObjectViewHolder) holder).userPostImageWrapper.setVisibility(View.GONE); 
    ((ObjectViewHolder) holder).userPostYoutubeImageWrapper.setVisibility(View.GONE); 

} else { 
    // Some url has found 
    ((ObjectViewHolder) holder).userPostImageWrapper.setVisibility(View.VISIBLE); 
    ((ObjectViewHolder) holder).userPostYoutubeImageWrapper.setVisibility(View.VISIBLE); 
} 

ли это для каждого из элементов, которые вы получили там как элемент списка в случае вы устанавливаете их обзорность во время выполнения.

+3

Возможно, стоит сказать, почему это важно. Причина в том, что держатели используются повторно. – Knossos

+0

Я только что получил удар. Спасибо Reaz за то, что он сказал мне использовать еще и спасибо @ Knossos за то, что он сказал мне, что держатели снова используются! Таким образом, видимость внутри номера держателя. 3, например, все еще существует, даже если мы перейдем к держателю номер 1? –

+0

@ Knossos Большое спасибо за ваше дополнение. Да, это стоит того. –