[java] 리사이클 러 뷰 어댑터에서 컨텍스트를 가져 오는 방법

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

}



답변

여기에 몇 가지 옵션이 있습니다.

  1. 패스 ContextFeedAdapter에 인수로 및 클래스 필드로 유지
  2. Context필요할 때 주입하려면 종속성 주입을 사용하십시오 . 나는 그것에 대해 읽을 것을 강력히 제안합니다. 이를위한 훌륭한 도구가 있습니다 -Dagger by Square
  3. 모든 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;
}

해피 코딩 🙂


답변

짧은 답변:

Context context;

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

다른 답변이 좋지 않은 이유 설명 :

  1. Context어댑터에 전달 하는 RecyclerView것은 클래스 내부에서 액세스 할 수 있으므로 완전히 불필요 합니다.
  2. 레벨 Context에서 획득 ViewHolder한다는 것은 ViewHolder. 작업을 복제합니다.
  3. 메모리 누수에 대해 걱정할 필요가 없다고 생각합니다. 어댑터가 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);


}


답변

다음을 정의 할 수 있습니다.

Context ctx; 

그리고 onCreate초기화 ctx할 때 :

ctx=parent.getContext(); 

참고 : 상위는 ViewGroup입니다.


답변

먼저 전 세계적으로 선언

Context mContext;

생성자와 컨텍스트를 수정하여 전달합니다.

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

그런 다음 mContext필요한 곳에서 사용하십시오.


답변

view.getContext () 처럼 사용할 수 있습니다.

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

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


        }
    });