如何在回收器视图适配器中获取上下文

新手上路,请多包涵

我正在尝试使用 picasso 库将 url 加载到 imageView,但我无法获得 context 以正确使用 picasso 库。

 public class FeedAdapter extends RecyclerView.Adapter<FeedAdapter.ViewHolder> {
    private List<Post> mDataset;

    // Provide a reference to the views for each data item
    // Complex data items may need more than one view per item, and
    // you provide access to all the views for a data item in a view holder
    public class ViewHolder extends RecyclerView.ViewHolder {
        // each data item is just a string in this case
        public TextView txtHeader;
        public ImageView pub_image;
        public ViewHolder(View v) {
            super(v);
            txtHeader = (TextView) v.findViewById(R.id.firstline);
            pub_image = (ImageView) v.findViewById(R.id.imageView);

        }
    }

    // Provide a suitable constructor (depends on the kind of dataset)
    public FeedAdapter(List<Post> myDataset) {
        mDataset = myDataset;
    }

    // Create new views (invoked by the layout manager)
    @Override
    public FeedAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
                                                   int viewType) {
        // create a new view
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.feedholder, parent, false);
        // set the view's size, margins, paddings and layout parameters
        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 your dataset at this position
        // - replace the contents of the view with that element

        holder.txtHeader.setText(mDataset.get(position).getPost_text());

        Picasso.with(this.context).load("http://i.imgur.com/DvpvklR.png").into(holder.pub_image);

    }

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

}

原文由 Stranger B. 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 307
2 个回答

您在这里有几个选择:

  1. Context 作为参数传递给 FeedAdapter 并将其保留为类字段
  2. 使用依赖注入在需要的时候注入 Context 。我强烈建议阅读它。有一个很棒的工具——Square 的 Dagger
  3. 从任何 View 对象获取它。在您的情况下,这可能对您有用:

holder.pub_image.getContext()

作为 pub_imageImageView

原文由 pelotasplus 发布,翻译遵循 CC BY-SA 3.0 许可协议

编辑 正如 solidak评论部分 所说,原来的答案可能会导致内存泄漏问题,使用这种方法是一种不好的做法,所以最好使用另一种方法来访问上下文。

原答案:

您可以添加一个全局变量:

 private Context context;

然后从这里分配上下文:

 @Override
public FeedAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,int viewType) {
    // create a new view
    View v=LayoutInflater.from(parent.getContext()).inflate(R.layout.feedholder, parent, false);
    // set the view's size, margins, paddings and layout parameters
    ViewHolder vh = new ViewHolder(v);
    // set the Context here
    context = parent.getContext();
    return vh;
}

快乐编码:)

原文由 Farhad Navayazdan 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题