web-dev-qa-db-ja.com

リサイクラビューアダプタでコンテキストを取得する方法

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

}
107
Stranger B.

ここにいくつかの選択肢があります。

  1. FeedAdapterの引数としてContextを渡し、それをクラスフィールドとして保持します。
  2. 必要に応じて、依存性注入を使用してContextを注入します。私はそれについて読むことを強く勧めます。そのための素晴らしいツールがあります - Dagger by Square
  3. 任意のViewオブジェクトから取得してください。あなたの場合これはあなたのために働くかもしれません:

    holder.pub_image.getContext()

    pub_imageImageViewです。

212
pelotasplus

グローバル変数を追加することができます。

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

ハッピーコディング:)

24
Farhad ArcxX

Pub_image context(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);


}
15
Ahmad Aghazadeh

短い答え:

Context context;

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

他の答えが良くない理由の説明:

  1. Contextをアダプタに渡すことはまったく不要です。なぜならRecyclerViewはクラスの中からアクセスできるからです。
  2. ContextレベルでViewHolderを取得するということは、ViewHolderをバインドまたは作成するたびに取得するということです。操作が重複しています。
  3. メモリリークについて心配する必要はないと思います。もしあなたのアダプタがあなたのActivityの寿命の外側にとどまっているなら(それは奇妙になるでしょう)、あなたはすでにリークがあります。
10
taurelas

あなたはこのように使用することができますview.getContext()

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

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


        }
    });
5
Arpit Patel

最初に世界的に宣言する

Context mContext;

それを変更することによって、コンストラクタでコンテキストを渡します。

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

その後、必要に応じてmContextを使用します。

5
Blue_Alien

FeedAdapterのコンストラクタを作成します。

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

活動中

FeedAdapter obj = new FeedAdapter(this);
4
blockwala

あなたはこれを使用することができます:

itemView.getContext()
2
张家宝

あなたは定義することができます:

Context ctx; 

そしてonCreateでは、ctxを次のように初期化します。

ctx=parent.getContext(); 

注:親はViewGroupです。

2
Marcos vitouley

まずグローバル変数を追加します

Context mContext;

それでは、コンストラクタをこれに変更してください。

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

アダプタを作成するときにコンテキストを渡します。

FeedAdapter myAdapter = new FeedAdapter(this,myDataset);
2
AKT