2016-09-26 13 views
0

Volley.newRequestQueue()の中でどのパラメータを渡すべきですか? 私はRecyclerViewAdapterクラスでこれを使用しています。以下のコードを参照してくださいonBindViewHolder()AndroidのRecyclerViewAdapter内のvolleyの画像を読み込み中

これは私が知っているどんな活動にもかかわらず、thisが渡されました。

RecyclerViewAdapter.java

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.RecyclerViewHolder> { 
    List<ListModel> myArrayList = new ArrayList<>(); 

    public RecyclerViewAdapter(ArrayList<ListModel> myArrayList) { 
     this.myArrayList = myArrayList; 
    } 

    @Override 
    public RecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.single_row, parent, false); 
     RecyclerViewHolder recyclerViewHolder = new RecyclerViewHolder(view); 

     return recyclerViewHolder; 
    } 

    @Override 
    public void onBindViewHolder(final RecyclerViewHolder holder, int position) { 
     ListModel listModel = myArrayList.get(position); 

     holder.videoID.setText(listModel.getVideoID()); 
     holder.title.setText(listModel.getTitle()); 
     holder.dateAdded.setText(listModel.getDateAdded()); 

     // 

     String url = "http://img.youtube.com/vi/"+listModel.getVideoID()+"/0.jpg"; 
     if (url != null) { 
      RequestQueue queue = Volley.newRequestQueue(); 

      // Retrieves an image specified by the URL, displays it in the UI. 
      ImageRequest request = new ImageRequest(url, 
        new Response.Listener<Bitmap>() { 
         @Override 
         public void onResponse(Bitmap bitmap) { 
          //imageView.setImageBitmap(bitmap); 
          holder.thumbnail.setImageBitmap(bitmap); 
         } 
        }, 0, 0, null, 
        new Response.ErrorListener() { 
         public void onErrorResponse(VolleyError error) { 
          //imageView.setImageResource(R.mipmap.ic_launcher); 
         } 
        }); 

      queue.add(request); 
     } 
     // 
    } 

    @Override 
    public int getItemCount() { 
     return myArrayList.size(); 
    } 

    public static class RecyclerViewHolder extends RecyclerView.ViewHolder { 
     TextView videoID, title, dateAdded; 
     ImageView thumbnail; 

     public RecyclerViewHolder(View itemView) { 
      super(itemView); 
      videoID = (TextView) itemView.findViewById(R.id.tvVideoID); 
      title = (TextView) itemView.findViewById(R.id.tvTitle); 
      dateAdded = (TextView) itemView.findViewById(R.id.tvDateAdded); 
      thumbnail = (ImageView) itemView.findViewById(R.id.ivThumbnail); 
     } 
    } 
} 

答えて

0

あなたはそれがonBindViewHolderを呼び出すことになると、ネットワークからイメージをロードする必要はありません。

パフォーマンスベースのアプローチあなたが必要とするすべてのイメージをダウンロードし、キャッシュされた場所にイメージを保存し、すべてがダウンロードされたら、AsyncTaskを使用して、リサイクルビュー用のアダプタを設定する必要があります。この時点で、onBindViewHolderはイメージをロードする必要があります。

また、知恵の言葉として、onBindViewHolderでイメージを設定する前に、イメージソースをnullに設定してから、実際のイメージを設定します。これにより、リサイクルされたビュー・ホルダ内のイメージのロード・プロセスが最適化されます。 (ユーザーの印象はすべてであることを覚えておいてください。スムーズなスクロール体験を提供するためにすべてをあなたの力で行います)。

+0

私は画像をロードするためにバレーボールライブラリを使用しています。私はすでにバックグラウンドスレッドでロード作業をしていると思います。したがって、ここではユーザーエクスペリエンスには効果がありません。 私が間違っている場合は私を修正してください。 – akkk

+1

まあ、私はあなたを訂正します。笑!私が強調しようとしているのは、AndroidシステムがRecyclerViewAdapterを作成する前に、イメージをダウンロードする必要があるということです。ここであなたのコードが異なるのは、onBindViewHolderが呼び出されたときにのみ、どのイメージが必要かを判断し、ダウンロードする作業を行うためです。アダプタが作成される前に、これらのイメージが必要であり、ダウンロードする必要があります(真にすぐに使用できるようにするため)。 – apelsoczi

+0

以前の例ではPicassoライブラリを使用していますが、例として、NetworkPolicy.OFFLINEを85行目に指定しています。https://github.com/apelsoczi/Popular_Movies/blob/master/app /src/main/java/com/pelsoczi/popularmovies/ui/Adapter.java。 https://github.com/apelsoczi/Popular_Movies/blob/master/app/src/main/java/com/pelsoczi/popularmovies/ui/MovieFragment.javaから180行目を表示することもできます。ここではデータをダウンロードしていますAsyncTaskとonPostExecuteが1回発生すると、私はrecyclerviewを更新します – apelsoczi

0

MainActivityからgetApplicationContext()を渡し、RecyclerViewAdapterコンストラクタのコンテキストを初期化しました。 @apelsociz

MainActivity.java

recyclerViewAdapter = new RecyclerViewAdapter(myArrayList, getApplicationContext());

RecyclerViewAdapter.java

public RecyclerViewAdapter(ArrayList<ListModel> myArrayList, Context context) { 
    this.myArrayList = myArrayList; 
    this.context = context; 
} 
関連する問題