0

RecyclerView.Adapterを拡張するCustomAdapterのonBindViewHolder()メソッド内でGoogle Volley ImageRequestを実装する際に問題が発生しました。攻撃ラインには「>>>>>>>>>>」とマークされています。 エラーは発生しません。返されたビットマップをイメージビューに設定することはできません。代わりに何もしません。google volley + recyclerビューでimageView.setBitmap()を実行できない

「$$$ GOOD:...」というログが正しいURLを報告しているため、volleyがビットマップを正常に取得していることが確認されています(または少なくとも考えています) )はnullではありません。ビットマップ

マイアダプタを設定することができるはずですので、また、私は、それを正しくやっている、()などの成功onResponseに青にImageViewの背景を設定するなど、他のアクションを試してみました:

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 Developerチュートリアルでそれを使用しているが、これは問題ではないと思います。

ヒントをいただければ幸いです。ありがとう!

答えて

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

      } 
     }); 

:mImageLoaderは前にinitとあなたのバレーボールのシングルトンに保存され

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

オプション2:

変更NetwrokImageView ImageViewのに

説明:

あなたはNetworkImageViewを使用していますが、そのsetImageUrlメソッドを利用していないあなたのための電話をかけるん。デフォルトまたはエラーイメージを設定することもできます。

By NetworkImageビューにImageUrlを指定しないレイアウトでloadImageIfNecessaryが呼び出されました(これはビットマップを手動で設定したために発生します)、ヌルのデフォルトイメージを設定して何も表示されません。 これで基本的には次のようになりました:

ビットマップ - >ビューを無効にして再度描画 - >設定nullビットマップ

関連する問題