0

Haben Sie ein Problem bei der Implementierung einer Google Volley ImageRequest innerhalb der OnBindViewHolder() -Methode eines CustomAdapter, der RecyclerView.Adapter erweitert. Die offensive Linie ist markiert: ">>>>>>>>>>". Es verursacht keine Fehler, es tut einfach nicht das, was es tun soll (setze die zurückgegebene Bitmap in die Bildansicht) ... und stattdessen tut es nichts.Kann imageVIEW.setBitmap() mit Google Volley + Recycler nicht anzeigen

Ich habe verifiziert, dass Volley das Bitmap erfolgreich bekommt (oder zumindest denkt es das), weil meine Logs sagen "$$$ GOOD: ..." melden die richtige URL und bitmap.toString () ist nicht null. Auch habe ich versucht, andere Aktionen wie die Imageview Hintergrund blau in einem erfolgreichen onResponse Einstellung(), die es richtig gemacht, so sollte es die Bitmap

Mein Adapter festlegen, um:

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(); 
} 
} 

Ich habe festgestellt, dass der neue ImageRequest() -Konstruktor, den ich verwendet habe, veraltet ist, aber ich glaube nicht, dass dies das Problem ist, nachdem sie noch in den Android Developer-Tutorials verwendet werden.

Alle Tipps würden wir uns freuen. Vielen Dank!

Antwort

1

Antwort:

ändern diese:

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()); 

      } 
     }); 

Um dies:

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

Wo mImageLoader vor init ist und in Ihre Volley Singleton gespeichert.

Option 2:

ändern NetwrokImageView zu Image

Erläuterung:

Sie verwenden NetworkImageView aber Sie nicht die Vorteile seiner setImageUrl Methode, die den Anruf für Sie macht . Sie können auch ein Standard- oder ein Fehlerbild festlegen.

Durch die Bereitstellung von ImageUrl für die NetworkImage-Ansicht wird loadImageIfNecessary für ein Layout aufgerufen (das durch das manuelle Festlegen einer Bitmap verursacht wird) und das Standardbild, das ebenfalls null ist, wird angezeigt. Also im Grunde haben Sie jetzt:

Sie ein Bild gesetzt bitmap-> Ansicht Ungültigmachungseinträge und zieht wieder-> setzt null Bitmap

Verwandte Themen