리사이클 러 뷰 어댑터에서 컨텍스트를 얻는 방법
picasso 라이브러리를 사용하여 imageView에 URL을로드하려고하지만 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();
}
}
여기 몇 가지 옵션이 있습니다.
- 패스
Context
FeedAdapter에 인수로 및 클래스 필드로 유지 Context
필요할 때 주입하려면 의존성 주입을 사용하십시오 . 나는 그것에 대해 읽는 것이 좋습니다. 이를위한 훌륭한 도구가 있습니다 -Dagger by Square모든
View
물건 에서 가져옵니다 . 귀하의 경우 이것이 효과가 있습니다.holder.pub_image.getContext()
으로는
pub_image
입니다ImageView
.
전역 변수를 추가 할 수 있습니다.
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_image 컨텍스트 ( 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);
}
짧은 답변:
Context context;
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
context = recyclerView.getContext();
}
다른 답변이 좋지 않은 이유를 설명하십시오.
- Passing
Context
to the adapter is completely unnecessary, sinceRecyclerView
you can access it from inside the class - Obtaining
Context
atViewHolder
level means that you do it every time you bind or create aViewHolder
. You duplicate operations. - I don't think you need to worry about any memory leak. If your adapter lingers outside your
Activity
lifespan (which would be weird) then you already have a leak.
First globally declare
Context mContext;
pass context with the constructor, by modifying it.
public FeedAdapter(List<Post> myDataset, Context context) {
mDataset = myDataset;
this.mContext = context;
}
then use the mContext
whereever you need it
You can use like this view.getContext()
Example
holder.tv_room_name.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(v.getContext(), "", Toast.LENGTH_SHORT).show();
}
});
Create a constructor of FeedAdapter :
Context context; //global
public FeedAdapter(Context context)
{
this.context = context;
}
and in Activity
FeedAdapter obj = new FeedAdapter(this);
First add a global variable
Context mContext;
Then change your constructor to this
public FeedAdapter(Context context, List<Post> myDataset) {
mContext = context;
mDataset = myDataset;
}
The pass your context when creating the adapter.
FeedAdapter myAdapter = new FeedAdapter(this,myDataset);
you can use this:
itemView.getContext()
You can define:
Context ctx;
And on onCreate
initialise ctx
to:
ctx=parent.getContext();
Note: Parent is a ViewGroup.
참고URL : https://stackoverflow.com/questions/32136973/how-to-get-a-context-in-a-recycler-view-adapter
'development' 카테고리의 다른 글
Rails has_and_belongs_to_many 마이그레이션 (0) | 2020.07.25 |
---|---|
WebAPI 삭제가 작동하지 않습니다-405 메소드가 허용되지 않습니다 (0) | 2020.07.25 |
루비에서 버전을 비교하는 방법? (0) | 2020.07.25 |
Django 모델에 전화 번호를 저장하는 가장 좋은 방법은 무엇입니까 (0) | 2020.07.25 |
파일에서 여러 줄 패턴을 어떻게 검색합니까? (0) | 2020.07.25 |