НЕ МОЖЕТ СДЕЛАТЬ imageView.setBitmap () с просмотром google volley + recycler

Возникла проблема с реализацией Google Volley ImageRequest в методе onBindViewHolder () CustomAdapter, который расширяет RecyclerView.Adapter. Линия наступления обозначена: «>>>>>>>>>>». Он не вызывает никаких ошибок, он просто не делает того, что должен делать (устанавливает возвращаемое растровое изображение в изображение) ... и вместо этого ничего не делает.

Я подтвердил, что залп успешно получает растровое изображение (или, по крайней мере, он так думает), потому что мои журналы, в которых говорится «$$$ ХОРОШО: ...», сообщают правильный URL-адрес, а bitmap.toString ( ) не равно нулю. Также я пробовал другие действия, такие как установка синего цвета фона изображения в успешном onResponse (), что он сделал правильно, поэтому он должен иметь возможность установить растровое изображение

Мой адаптер:

package com.tba.herpderp;

import android.graphics.Bitmap;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.ImageRequest;
import com.android.volley.toolbox.NetworkImageView;

import java.util.ArrayList;


public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.ViewHolder> {
private static final String TAG = "CustomAdapter";

private ArrayList<person> ourlist;


public static class ViewHolder extends RecyclerView.ViewHolder {
    private final NetworkImageView imageView;
    private final TextView name;
    private final TextView bio;
    private final TextView distance;
    private final TextView exp;

    public ViewHolder(View v) {
        super(v);
        // Define click listener for the ViewHolder's View.
        v.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {


                // do something on item click

            }
        });

        imageView = (NetworkImageView) v.findViewById(R.id.imageView);
        name = (TextView) v.findViewById(R.id.Nickname);
        bio = (TextView) v.findViewById(R.id.Bio);
        exp = (TextView) v.findViewById(R.id.Experience);
        distance = (TextView) v.findViewById(R.id.Distance);

    }

    public NetworkImageView getImageView() {
        return imageView;
    }
    public TextView getName() {
        return name;
    }
    public TextView getBio() {
        return bio;
    }
    public TextView getDistance() {
        return distance;
    }
    public TextView getExp() {
        return exp;
    }
}
// END_INCLUDE(recyclerViewSampleViewHolder)


public CustomAdapter(ArrayList<person> list) {
    ourlist = list;
}

// BEGIN_INCLUDE(recyclerViewOnCreateViewHolder)
// Create new views (invoked by the layout manager)
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
    // Create a new view.
    View v = LayoutInflater.from(viewGroup.getContext())
            .inflate(R.layout.single_list_item, viewGroup, false);

    return new ViewHolder(v);
}
// END_INCLUDE(recyclerViewOnCreateViewHolder)

// BEGIN_INCLUDE(recyclerViewOnBindViewHolder)
// Replace the contents of a view (invoked by the layout manager)
@Override
public void onBindViewHolder(final ViewHolder viewHolder, final int position) {

    // Get element from your dataset at this position and replace the contents of the view
    // with that element


    final person temp = ourlist.get(position);

    // GET IMAGE USING VOLLEY

    ImageRequest request = new ImageRequest(MainActivity.DB_HOST + "/" + temp.getPhoto(),
            new Response.Listener<Bitmap>() {
                @Override
                public void onResponse(Bitmap bitmap) {
         >>>>>>>>>> viewHolder.getImageView().setImageBitmap(bitmap);
                    Log.i(TAG, "$$$ GOOD: " + MainActivity.DB_HOST + "/" + temp.getPhoto());
                    Log.i(TAG, "$$$ GOOD: " + bitmap.toString());


                }
            }, 0, 0, null,
            new Response.ErrorListener() {
                public void onErrorResponse(VolleyError error) {

                    // you could set an error bitmap into the imageview here if you want
                    Log.i(TAG, "$$$ BAD: " + MainActivity.DB_HOST + "/" + temp.getPhoto());

                }
            });

    // Access the RequestQueue through your singleton class.
    Z_VolleySingleton.getInstance().getRequestQueue().add(request);

    viewHolder.getName().setText(temp.getNick());
    viewHolder.getBio().setText(temp.getBio());
    viewHolder.getDistance().setText(temp.getDistance().toString());
    viewHolder.getExp().setText(temp.getExperience());
}
// END_INCLUDE(recyclerViewOnBindViewHolder)

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

Я заметил, что новый конструктор ImageRequest (), который я использовал, не работает, но я не думаю, что это проблема, после того, как они все еще используют его в руководствах для разработчиков Android.

Любые советы будут оценены. Спасибо!


person Nerdy Bunz    schedule 23.05.2016    source источник


Ответы (1)


Ответ:

Измените это:

  ImageRequest request = new ImageRequest(MainActivity.DB_HOST + "/" + temp.getPhoto(),
        new Response.Listener<Bitmap>() {
            @Override
            public void onResponse(Bitmap bitmap) {
     >>>>>>>>>> viewHolder.getImageView().setImageBitmap(bitmap);
                Log.i(TAG, "$$$ GOOD: " + MainActivity.DB_HOST + "/" + temp.getPhoto());
                Log.i(TAG, "$$$ GOOD: " + bitmap.toString());


            }
        }, 0, 0, null,
        new Response.ErrorListener() {
            public void onErrorResponse(VolleyError error) {

                // you could set an error bitmap into the imageview here if you want
                Log.i(TAG, "$$$ BAD: " + MainActivity.DB_HOST + "/" + temp.getPhoto());

            }
        });

К этому:

viewHolder.getImageView().setImageUrl(MainActivity.DB_HOST + "/" + temp.getPhoto(), mImageLoader);

Где mImageLoader инициализируется раньше и сохраняется в синглтоне Volley.

Вариант 2:

Измените NetwrokImageView на ImageView

Объяснение:

Вы используете NetworkImageView, но не пользуетесь его setImageUrl методом, который звонит за вас. Вы также можете установить изображение по умолчанию или изображение ошибки.

Не предоставляя ImageUrl для представления NetworkImage, loadImageIfNeeded вызывается в макете (что вызвано настройкой растрового изображения вручную) и устанавливает изображение по умолчанию, которое также имеет значение NULL, поэтому ничего не отображается. Итак, теперь у вас есть:

вы устанавливаете растровое изображение изображения-> просмотр делает недействительным и снова рисует-> устанавливает нулевое растровое изображение

person kalin    schedule 23.05.2016