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

我正在尝试使用Picasso Library将URL加载到ImageView,但我无法获取context以正确使用Picasso Library.

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


}
152970 次浏览

创建FeedAdapter的构造函数:

Context context; //global
public FeedAdapter(Context context)
{
this.context = context;
}

以及在活动中

FeedAdapter obj = new FeedAdapter(this);

首先全局声明

Context mContext;

通过修改构造函数来传递上下文。

public FeedAdapter(List<Post> myDataset, Context context) {
mDataset = myDataset;
this.mContext = context;
}

然后在任何需要的地方使用mContext

你有几个选择:

  1. Context作为参数传递给FeedAdapter,并将其保留为类字段
  2. 在需要时,使用依赖注入来注入ABC_0的_。我强烈建议你读一读。有一个伟大的工具-匕首的平方。
  3. 从任何View对象中

    获取它。在你的情况下,这可能对你有用:

    holder.pub_image.getContext()

    作为_,ABC_0是ImageView

首先添加一个全局变量

Context mContext;

然后将构造函数更改为此

public FeedAdapter(Context context, List<Post> myDataset) {
mContext = context;
mDataset = myDataset;
}

在创建适配器时传递您的上下文。

FeedAdapter myAdapter = new FeedAdapter(this,myDataset);

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

原答案:

您可以添加全局变量:

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;
}

快乐的代码:)

您可以使用pub_图像上下文(holder.pub_image.getContext()):

@Override
public void onBindViewHolder(ViewHolder ViewHolder, int position) {


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


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




}

您可以像这样使用View.getContext()

例子

holder.tv_room_name.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {


Toast.makeText(v.getContext(), "", Toast.LENGTH_SHORT).show();




}
});

你可以用这个:

itemView.getContext()

简短回答:

Context context;


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

解释为什么其他答案不是很好:

  1. Context传递给适配器是完全不必要的,因为RecyclerView,您可以从类内部访问它。
  2. ViewHolder级别获取Context意味着每次绑定或创建ViewHolder时都要执行此操作。你重复操作。
  3. 我认为您不必担心任何内存泄漏。如果您的适配器在您的Activity寿命之外徘徊(这将是奇怪的),那么您已经有一个泄漏。

您可以定义:

Context ctx;

且在_上,ABC_0初始化ctx以:

ctx=parent.getContext();

注意:父级是一个ViewGroup.

View mView;
mView.getContext();

如果在布局上使用数据绑定,则可以从holder获取context。下面举个例子。

@Override
public void onBindViewHolder(@NonNull GenericViewHolder holder, int position) {
View currentView = holder.binding.getRoot().findViewById(R.id.cycle_count_manage_location_line_layout);// id of your root layout
currentView.setBackgroundColor(ContextCompat.getColor(holder.binding.getRoot().getContext(), R.color.light_green));
}

解决方案:

使用ViewBinding时使用

holder.binding.productImg.context

否则使用

holder.productImg.context

冷冻药丸:)