리사이클러 보기 어댑터에서 컨텍스트를 가져오는 방법
imageView에 url을 로드할 수 있도록 피카소 라이브러리를 사용하려고 하는데, imageView에 url을 로드할 수 없어서context
피카소 도서관을 올바르게 사용하기 위해서.
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
네가 필요할 때 말이야나는 그것에 대해 읽기를 강력히 추천한다.그것을 위한 훌륭한 도구가 있다 - 사각형별 단검 아무에게서나 받아라.
View
이의를 제기하다이 방법이 귀하에게 효과적일 수 있는 경우:holder.pub_image.getContext()
로서
pub_image
a이다ImageView
.
댓글 섹션에 나온 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;
}
해피 코딩 :)
단답:
Context context;
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
context = recyclerView.getContext();
}
다른 답변이 좋지 않은 이유 설명:
- 패스
Context
어댑터에는 완전히 불필요하다.RecyclerView
당신은 클래스 안에서 그것에 접근할 수 있다. - 얻기
Context
에서ViewHolder
수준(level)은 바인딩 또는 작성 시마다 수행됨을 의미함ViewHolder
자네들은 작전을 복제하는군 - 메모리 누수는 걱정하지 않아도 될 것 같아.어댑터가 외부에 남아 있는 경우
Activity
수명은 (이상할 거야) 그러면 이미 누수가 있는 거야.
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);
}
다음을 사용할 수 있다.
itemView.getContext()
이 보기처럼 사용할 수 있다.getContext()
예
holder.tv_room_name.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(v.getContext(), "", Toast.LENGTH_SHORT).show();
}
});
다음을 정의할 수 있다.
Context ctx;
그리고 계속onCreate
초기화하다ctx
다음으로:
ctx=parent.getContext();
참고: 상위 그룹은 ViewGroup.
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
필요할 때마다
View mView;
mView.getContext();
먼저 전역 변수 추가
Context mContext;
그런 다음 생성자를 다음으로 변경하십시오.
public FeedAdapter(Context context, List<Post> myDataset) {
mContext = context;
mDataset = myDataset;
}
어댑터를 만들 때 컨텍스트를 통과하십시오.
FeedAdapter myAdapter = new FeedAdapter(this,myDataset);
데이터 바인딩을 레이아웃에 사용하는 경우context
로부터holder
아래 예시.
@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));
}
해결책:
뷰 바인딩 사용 시
holder.binding.productImg.context
그렇지 않으면 사용
holder.productImg.context
감기약 :)
참조URL: https://stackoverflow.com/questions/32136973/how-to-get-a-context-in-a-recycler-view-adapter
'IT이야기' 카테고리의 다른 글
Intel C++ 컴파일러에서 NaN - NaN == 0.0인 이유 (0) | 2022.05.26 |
---|---|
구성요소 렌더 함수에 무한 업데이트 루프가 있을 수 있음 (0) | 2022.05.26 |
Vuelidate 날짜 입력 필드 (0) | 2022.05.26 |
Java: Unix 타임스탬프의 날짜 (0) | 2022.05.26 |
VueJS 두 매개 변수를 Vuex 작업에 전달하는 방법 (0) | 2022.05.26 |