web-dev-qa-db-ger.com

So erhalten Sie einen Kontext in einem Recycler-Ansichtsadapter

Ich versuche, die picasso-Bibliothek zu verwenden, um die URL in imageView laden zu können, aber ich kann die context nicht dazu bringen, die picasso-Bibliothek korrekt zu verwenden.

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

}
99
Stranger B.

Sie haben hier einige Möglichkeiten:

  1. Übergeben Sie Context als Argument an FeedAdapter und behalten Sie es als Klassenfeld bei
  2. Verwenden Sie die Abhängigkeitsinjektion, um Context bei Bedarf zu injizieren. Ich empfehle dringend, darüber zu lesen. Dafür gibt es ein großartiges Werkzeug - Dolch von Square
  3. Holen Sie es sich von jedem View Objekt. In Ihrem Fall könnte dies für Sie funktionieren:

    holder.pub_image.getContext()

    Wie pub_image ist ein ImageView.

223
pelotasplus

Sie können eine globale Variable hinzufügen:

private Context context;

dann weisen Sie den Kontext von hier aus zu:

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

Glückliches Codding :) 

22
Farhad ArcxX

Sie können den pub_image-Kontext (holder.pub_image.getContext()) verwenden:

@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);


}
14
Ahmad Aghazadeh

Kurze Antwort:

Context context;

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

Erklärung warum andere Antworten nicht großartig sind:

  1. Die Übergabe von Context an den Adapter ist völlig überflüssig, da Sie RecyclerView von innerhalb der Klasse aus darauf zugreifen können
  2. Wenn Sie Context auf ViewHolder erhalten, müssen Sie dies jedes Mal tun, wenn Sie eine ViewHolder binden oder erstellen. Sie duplizieren Operationen.
  3. Ich glaube nicht, dass Sie sich um einen Speicherleck sorgen müssen. Wenn sich Ihr Adapter außerhalb Ihrer Activity-Lebensdauer befindet (was seltsam wäre), haben Sie bereits ein Leck.
7
taurelas

Zuerst global deklarieren 

Context mContext; 

übergeben Sie den Kontext mit dem Konstruktor, indem Sie ihn ändern.

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

verwenden Sie dann mContext, wo immer Sie es benötigen

5
Blue_Alien

Sie können wie folgt view.getContext () verwenden

Beispiel

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

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


        }
    });
4
Arpit Patel

Erstellen Sie einen Konstruktor von FeedAdapter:

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

und in Aktivität 

FeedAdapter obj = new FeedAdapter(this);
4
blockwala

sie können dies verwenden:

itemView.getContext()
2
张家宝

Fügen Sie zuerst eine globale Variable hinzu

Context mContext;

Dann ändern Sie Ihren Konstruktor in dieses

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

Übergeben Sie Ihren Kontext, wenn Sie den Adapter erstellen.

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

Sie können definieren:

Context ctx; 

Und bei onCreate initialisieren Sie ctx auf: 

ctx=parent.getContext(); 

Hinweis: Parent ist eine ViewGroup.

0
Marcos vitouley