如何使用Pilasso从RecyclerAdapter加载图像?

时间:2022-12-14 00:28:43

I'm trying to load thumbnail images in a ImageView contained in a RecyclerAdapter Picasso.with(context).load(stringUrl).into(imageView); but this requires a Context. From the RecyclerAdapter is it possible to get the Context of my app's MainActivity? Do I want to do this, or should I be loading the image elsewhere?

我正在尝试在包含在RecyclerAdapter Picasso.with(context).load(stringUrl).into(imageView)中的ImageView中加载缩略图图像。但这需要一个Context。从RecyclerAdapter可以获得我的应用程序的MainActivity的上下文?我想要这样做,还是应该将图像加载到别处?

These are my classes. The RecyclerAdapater doesn't compile, of course, but it represents what I'm trying to do.

这些是我的课程。当然,RecyclerAdapater不会编译,但它代表了我正在尝试做的事情。

MainActivity:

public class MainActivity extends AppCompatActivity implements MainScreenContract.View {

    ArrayList<String> list;

    // Objects for RecyclerView
    private RecyclerView recyclerView;
    private RecyclerView.Adapter recyclerAdapter;
    private RecyclerView.LayoutManager recyclerLayoutManager;

    @Inject
    MainScreenPresenter mainPresenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Timber.plant(new Timber.DebugTree() {
            // Add the line number to the tag
            @Override
            protected String createStackElementTag(StackTraceElement element) {
                return super.createStackElementTag(element) + ':' + element.getLineNumber();
            }
        });

        // RecyclerView implementation
        recyclerView = (RecyclerView) findViewById(R.id.my_list);
        // set to true because all images will be the same size
        recyclerView.setHasFixedSize(true);

        recyclerLayoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(recyclerLayoutManager);


        DaggerMainScreenComponent.builder()
                .netComponent(((App) getApplicationContext()).getNetComponent())
                .mainScreenModule(new MainScreenModule(this))
                .build().inject(this);

        //Call the method in MainPresenter to make Network Request
        mainPresenter.loadVideo();
    }

    @Override
    public void showVideos(Video video){
        // Loop through the posts, get the title of the post, and add it to our list object
        // TODO: Simplify these references with a variable?
        for(int i = 0; i < video.getResults().size(); i++){
            // TODO: add second for loop, or simplyfy and get rid of Video object
            list.add(video.getResults().get(i).getSiteDetailUrl());
            //list.add(video.get(i).getSiteDetailUrl());
            Timber.d("List item " + i + " = " + list.get(i));
        }

        // RecyclerView implementation
        recyclerAdapter = new MainScreenRecyclerAdapter(list);
        recyclerView.setAdapter(recyclerAdapter);
    }

    @Override
    public void showError(String message){
        // Show error message text as a Toast message
        Toast.makeText(getApplicationContext(), "Error" + message, Toast.LENGTH_SHORT).show();
        Timber.e("Error: " + message);
    }

    @Override
    public void showComplete(){
        // Show completed Toast message
        Toast.makeText(getApplicationContext(), "Complete", Toast.LENGTH_SHORT).show();
    }
}

RecyclerAdapter:

public class MainScreenRecyclerAdapter extends RecyclerView.Adapter<MainScreenRecyclerAdapter.ViewHolder> {

    private List<String> dataset;

    public static class ViewHolder extends RecyclerView.ViewHolder {
        public ImageView imageView;
        public ViewHolder(ImageView v) {
            super(v);
            imageView = v;
        }
    }

    // TODO: Should I make the list contain Video/Result objects and pull the data from that?
    public MainScreenRecyclerAdapter(List<String> dataset) {
        dataset = dataset;
    }

    // Create new views
    @Override
    public MainScreenRecyclerAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        // create a new view
        ImageView v = (ImageView) LayoutInflater.from(parent.getContext())
                .inflate(R.layout.thumbnail_view, parent, false);

        ViewHolder vh = new ViewHolder(v);
        return vh;
    }

    // Replace the contents of a view (invoked by the layout manager)
    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        // - get element from dataset at this position
        // - replace the contents of hte view with that element
        // TODO: Call to picasso to load image into holder.imageView

        String imageUrl = dataset.get(position);
        Timber.d("Image URL: " + imageUrl);

        ImageView view = holder.imageView;

        Picasso.with(MainActivity.context).load(imageUrl).into(view);
    }

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

Thanks!

1 个解决方案

#1


1  

you need to pass the context as a constructor argument and then use this context

您需要将上下文作为构造函数参数传递,然后使用此上下文

private Context mContext;
public MainScreenRecyclerAdapter (Context context) {
    mContext = context;
}


@Override 
    public void onBindViewHolder(ViewHolder holder, int position) {    
        String imageUrl = dataset.get(position);
        Timber.d("Image URL: " + imageUrl);

        ImageView view = holder.imageView;

        Picasso.with(MainActivity.context).load(imageUrl).into(view);
    } 

#1


1  

you need to pass the context as a constructor argument and then use this context

您需要将上下文作为构造函数参数传递,然后使用此上下文

private Context mContext;
public MainScreenRecyclerAdapter (Context context) {
    mContext = context;
}


@Override 
    public void onBindViewHolder(ViewHolder holder, int position) {    
        String imageUrl = dataset.get(position);
        Timber.d("Image URL: " + imageUrl);

        ImageView view = holder.imageView;

        Picasso.with(MainActivity.context).load(imageUrl).into(view);
    }