如何在RecyclerView中使用自定义Adapter和Picasso。

5

我正在使用 RecyclerView 显示从网络加载的图片。我已经在适配器中使用 AsyncTask 加载了图片。但是,由于我需要使用 Picasso 进行实现,因此需要帮助。目前的代码如下:

    public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.MovieViewHolder>
{
    Bitmap mBitmap;
    int pos;
    public static class MovieViewHolder extends RecyclerView.ViewHolder
    {
         CardView cv;
        TextView MovieName;
         ImageView MoviePhoto;

        MovieViewHolder(View itemView) {
            super(itemView);
            cv = (CardView)itemView.findViewById(R.id.cv);
            MovieName = (TextView)itemView.findViewById(R.id.movie_name);
            MoviePhoto = (ImageView)itemView.findViewById(R.id.movie_photo);
        }
    }

    List<Post> mpost;

    CustomAdapter(List<Post> mpost){
        this.mpost = mpost;
    }

    @Override
    public void onAttachedToRecyclerView(RecyclerView recyclerView) {
        super.onAttachedToRecyclerView(recyclerView);
    }

    @Override
    public MovieViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item, viewGroup, false);
        MovieViewHolder pvh = new MovieViewHolder(v);
        return pvh;
    }

    @Override
    public void onBindViewHolder(MovieViewHolder movieViewHolder, int i)
    {
        pos=i;
        movieViewHolder.MovieName.setText(mpost.get(i).getTitle());

        if(mpost.get(pos).getPoster_path()!=null)
        {
            new AsyncTask<Void, Void, Void>() {
                @Override
                protected Void doInBackground(Void... params) {
                    try {
                        URL url = new URL("http://image.tmdb.org/t/p/w154"+mpost.get(pos).getPoster_path());
                        mBitmap = BitmapFactory.decodeStream(url.openConnection().getInputStream());

                    } catch (MalformedURLException e) {

                    } catch (IOException e) {

                    }
                    return null;
                }
            }.execute();




            movieViewHolder.MoviePhoto.setImageBitmap(mBitmap);

        }




    }

    @Override
    public int getItemCount()
    {
        if(mpost!=null)
        {
            return mpost.size();
        }
        else
        {
            return 0;
        }
    }

}

我需要替换这个:

 new AsyncTask<Void, Void, Void>() {
            @Override
            protected Void doInBackground(Void... params) {
                try {
                    URL url = new URL("http://image.tmdb.org/t/p/w154"+mpost.get(pos).getPoster_path());
                    mBitmap = BitmapFactory.decodeStream(url.openConnection().getInputStream());

                } catch (MalformedURLException e) {

                } catch (IOException e) {

                }
                return null;
            }
        }.execute();




        movieViewHolder.MoviePhoto.setImageBitmap(mBitmap);

使用Picasso:

Picasso.with(this)
                .load("http://image.tmdb.org/t/p/w154" + mpost.get(pos).getPoster_path())
                .into(MoviePhoto);

然而,似乎在这样做时出现了错误,最好的修复方法是什么?

请检查我的解决方案,并让我知道是否有任何疑虑。 - Ravindra Kushwaha
你不能使用 Picasso.with(this),你需要将你的活动上下文传递给适配器,并使用 Picasso.with(mContext)。你可以通过适配器构造函数传递活动上下文。 - PunitD
4个回答

3
@Override
public void onBindViewHolder(MovieViewHolder movieViewHolder, int i){
    pos=i;
    movieViewHolder.MovieName.setText(mpost.get(i).getTitle());
    if(mpost.get(pos).getPoster_path()!=null){
        Picasso.with(getContext()).load("http://image.tmdb.org/t/p/w154" + mpost.get(pos).getPoster_path()).into(movieViewHolder.MoviePhoto)
    }
}

1
 public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.MovieViewHolder>
{
Bitmap mBitmap;
int pos;
Context context;
public static class MovieViewHolder extends RecyclerView.ViewHolder
{
     CardView cv;
    TextView MovieName;
     ImageView MoviePhoto;

    MovieViewHolder(View itemView) {
        super(itemView);
        cv = (CardView)itemView.findViewById(R.id.cv);
        MovieName = (TextView)itemView.findViewById(R.id.movie_name);
        MoviePhoto = (ImageView)itemView.findViewById(R.id.movie_photo);
    }
}

List<Post> mpost;

CustomAdapter(Context context,List<Post> mpost){
    this.mpost = mpost;
    this.context=context;
}

@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
    super.onAttachedToRecyclerView(recyclerView);
}

@Override
public MovieViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item, viewGroup, false);
    MovieViewHolder pvh = new MovieViewHolder(v);
    return pvh;
}

@Override
public void onBindViewHolder(MovieViewHolder movieViewHolder, int i)
{
    pos=i;
    movieViewHolder.MovieName.setText(mpost.get(i).getTitle());

    if(mpost.get(pos).getPoster_path()!=null)
    {
        new AsyncTask<Void, Void, Void>() {
            @Override
            protected Void doInBackground(Void... params) {
                try {
                    URL url = new URL("http://image.tmdb.org/t/p/w154"+mpost.get(pos).getPoster_path());
                    mBitmap = BitmapFactory.decodeStream(url.openConnection().getInputStream());

                } catch (MalformedURLException e) {

                } catch (IOException e) {

                }
                return null;
            }
        }.execute();




        movieViewHolder.MoviePhoto.setImageBitmap(mBitmap);

    }




}

@Override
public int getItemCount()
{
    if(mpost!=null)
    {
        return mpost.size();
    }
    else
    {
        return 0;
    }
}

}

使用此代码并将活动上下文传递给CustomAdapter。
CustomAdater customAdapter= new CustomAdapter(this,post);

使用上下文而不是this与你的picasso代码。


0
你可以在 RecyclerView.Adapter 的 onBindViewHolder 方法中使用以下代码来使用 Picasso。
@Override
public void onBindViewHolder(MovieViewHolder movieViewHolder, int position){


    Post model = mpost.get(position);    

    movieViewHolder.MovieName.setText(model.getTitle());
    Picasso.with(getContext()).load("http://image.tmdb.org/t/p/w154" + model.getPoster_path()).into(movieViewHolder.MoviePhoto)

}

谢谢,无法解析符号“getContext()”,原因是什么? :/ - OBX
你可以将"getContex()"替换为你的活动名称,例如"MY_ACTIVITY.THIS"。 - Ravindra Kushwaha
我在发布的问题中唯一遇到的问题是上下文,它并没有解决这个问题。 - OBX
@oblivion...很高兴能帮忙,兄弟... :) - Ravindra Kushwaha
1
我看不出为什么要使用自定义目标而不是 .into(MoviePhoto)。 - P1x
显示剩余2条评论

0
在方法 onBindViewHolder 中,为加载图像到图像视图设置 Picasso。
onBindViewHolder(MovieViewHolder movieViewHolder, int position)
Picasso.with(context)
            .load("http://image.tmdb.org/t/p/w154" + mpost.get(position).getPoster_path())
            .into(movieViewHolder.MoviePhoto);`

就是这么简单。:)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接