Comportamento estranho de imagens no RecyclerView

Estou usando android.support.v7.widget.RecyclerView para mostrar itens simples que contêm texto e, em alguns casos, também imagens. Basicamente, eu segui o tutorial daquihttps://developer.android.com/training/material/lists-cards.html e apenas alterei o tipo de mDataset de String [] para JSONArray e o xml do ViewHolder. Meu RecyclerView está localizado em um fragmento simples:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin">

<!-- A RecyclerView with some commonly used attributes -->
<android.support.v7.widget.RecyclerView
    android:id="@+id/my_hopps_recycler_view"
    android:scrollbars="vertical"
    android:layout_centerInParent="true"
    android:layout_width="200dp"
    android:layout_height="wrap_content"/>

</RelativeLayout>

Neste fragmento, estou carregando todas as informações de um servidor da web. Depois de receber as informações, inicializo os itens no RecyclerView. Eu uso um LinearLayoutManager que é definido no método onCreate do meu fragmento. Depois de adicionar o adaptador, chamo o método setHasFixedSize (true) no meu RecyclerView. Minha classe do adaptador é assim:

import android.graphics.BitmapFactory;
import android.support.v7.widget.RecyclerView;
import android.util.Base64;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import org.apache.commons.lang3.StringEscapeUtils;
import org.json.JSONArray;
import org.json.JSONObject;

import saruul.julian.MyFragment;
import saruul.julian.R;

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {

/**
* Fragment holding the RecyclerView.
*/
private MyFragment myFragment;
/**
* The data to display.
*/
private JSONArray mDataset;

public static class ViewHolder extends RecyclerView.ViewHolder {

    public TextView text;
    ImageView image;

    public ViewHolder(View v) {
        super(v);
        text = (TextView) v.findViewById(R.id.my_view_text);
        image = (ImageView) v.findViewById(R.id.my_view_image);
    }
}

public MyAdapter(MyFragment callingFragment, JSONArray myDataset) {
    myFragment = callingFragment;
    mDataset = myDataset;
}

@Override
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
                                               int viewType) {
    View v = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.my_view, parent, false);
    ViewHolder vh = new ViewHolder(v);
    return vh;
}

// Replace the contents of a view (invoked by the layout manager)
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    try {
        JSONObject object = mDataset.getJSONObject(position);
        if ( object.has("image") ){
            if ( !hopp.getString("image").equals("") ){
                try {
                    byte[] decodedString = Base64.decode(StringEscapeUtils.unescapeJson(object.getString("image")), Base64.DEFAULT);
                    holder.image.setImageBitmap(BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length));
                    holder.image.setVisibility(View.VISIBLE);
                } catch ( Exception e ){
                    e.printStackTrace();
                }
            } 
        }
        if ( object.has("text") ){
            holder.text.setText(object.getString("text"));
        }
    } catch ( Exception e ){
        e.printStackTrace();
    }
}

// Return the size of your dataset (invoked by the layout manager)
@Override
public int getItemCount() {
    return mDataset.length();
}
}

E meu xml para uma visão dentro do meu RecyclerView:

<android.support.v7.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:id="@+id/card_view"
android:layout_gravity="center"
android:layout_width="match_parent"
android:layout_height="wrap_content"
card_view:cardCornerRadius="4dp">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:orientation="vertical"
    android:padding="@dimen/activity_horizontal_margin">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:id="@+id/my_hopp_people_reached"/>

    <ImageView
        android:id="@+id/my_hopp_image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="gone"
        android:adjustViewBounds="true"/>

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:id="@+id/my_hopp_text"/>

    <ImageButton
        android:id="@+id/my_hopp_delete"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@null"
        android:src="@drawable/ic_action_discard"
        />

</LinearLayout>

</android.support.v7.widget.CardView>

Então agora, aqui está o meu problema: tudo funciona bem. Texto e imagem são mostrados corretamente no meu RecyclerView. No entanto, se eu chegar ao final da lista rolando para baixo e rolando para cima novamente, as imagens serão mostradas em itens que não devem conter figuras. No momento, tenho nove itens. Os dois últimos contêm uma imagem. Então eu deslizo para baixo e apenas vejo o texto nos sete primeiros itens. Chegar ao final da lista mostra duas fotos como esperado. Mas se eu rolar para cima novamente, essas imagens aparecerão em outros itens.

Rolar para cima e para baixo altera as imagens sempre na mesma ordem:

A primeira rolagem para cima (depois de descer uma vez) cria uma imagem no segundo item.Rolar para baixo cria uma imagem no 7º item.A rolagem para cima cria uma imagem no primeiro item.Rolar para baixo não cria nada.A rolagem para cima cria uma imagem no terceiro item e a imagem no segundo item foi substituída pela outra imagem.A rolagem para baixo cria uma figura no 6º item e permite que a figura no 7º item desapareça.E assim por diante ...

Eu já descobri que o método onBindViewHolder (titular do ViewHolder, posição int) é chamado toda vez que um item aparece novamente na tela. Eu verifiquei a posição e as informações fornecidas no meu mDataset. Tudo funciona bem aqui: a posição está correta e as informações fornecidas também. O texto em todos os itens não muda e é sempre mostrado corretamente. Alguém tem algum tipo desse problema e conhece alguma solução?

questionAnswers(3)

yourAnswerToTheQuestion