एक पुनर्नवीनीकरण दृश्य एडाप्टर में एक संदर्भ कैसे प्राप्त करें


129

मैं पिक्चर के लिए 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();
    }

}

जवाबों:


290

आपके पास यहां कुछ विकल्प हैं:

  1. ContextFeedAdapter के तर्क के रूप में पास करें और इसे क्लास फ़ील्ड के रूप में रखें
  2. Contextजरूरत पड़ने पर इंजेक्शन लगाने के लिए निर्भरता इंजेक्शन का उपयोग करें । मैं दृढ़ता से इसके बारे में पढ़ने का सुझाव देता हूं। इसके लिए एक महान उपकरण है - डैगर बाय स्क्वायर
  3. इसे किसी भी Viewवस्तु से प्राप्त करें । आपके मामले में यह आपके लिए काम कर सकता है:

    holder.pub_image.getContext()

    जैसा pub_imageकि ए है ImageView


64
मैं तीसरे विकल्प को पसंद करता हूं, यह देखने से संदर्भ प्राप्त करता है। यह सबसे सरल और सबसे सरल उपाय है।
डिक लुकास

या, कहीं बेहतर है, पिकासो उदाहरण में पास करें, बजाय क्लास उदाहरण पर पिकासो उदाहरण रखने और इसे आलसी-लोड करने के।
एरिक कोचरन

8
प्रत्येक ViewHolder में आइटम का एक उदाहरण होता है जिसे आप कंस्ट्रक्टर में पास करते हैं। इस तरह का उपयोग करें: itemView.getContext ()
आंद्रेई लुपसा

1
आप # 2 नहीं कर सकते, क्या आप कर सकते हैं? मैंने कोशिश की कि, लेकिन यह आपके समाप्त होने ApplicationContextऔर गतिविधि से बंधे नहीं होने के कारण, ग्लाइड के भीतर से एक रनटाइम दुर्घटना के लिए अग्रणी होगा।
१up को boltup_im_coding

मैं # 2 का उपयोग करने के मामले में एडॉप्टर के घटक ऑब्जेक्ट को कैसे पास करूं?
एजियो

32

आप वैश्विक चर जोड़ सकते हैं:

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

हैप्पी कोडिंग :)


मेरे लिए भी काम किया! धन्यवाद
केनी Dabiri

21
मैं दृढ़ता से सुझाव देता हूं कि कॉन्टेक्ट के वैश्विक संदर्भ हैं। यह भयानक स्मृति रिसाव मुद्दों को जन्म दे सकता है !!
सॉलिडैक

1
यदि आप देखने वाले को उपवर्ग में रखते हैं, तो यह निजी हो सकता है।
r3dm4n

यदि एडेप्टर एक RecyclerView से जुड़ा है, तो उस संदर्भ को वैसे भी आवश्यक होने की गारंटी है। यदि आप एडेप्टर को अनअटैच कर सकते हैं, तो यह तब तक ठीक है जब तक कि किसी कारण से आप अलग होने के बाद इस एडेप्टर के लिए एक मजबूत संदर्भ नहीं रखते हैं, इस स्थिति में आपको कैश्ड संदर्भ को साफ करना चाहिए, जैसे कोई तरीका है onDetachedFromRecyclerViewया कुछ और है।
androidguy

19

संक्षिप्त जवाब:

Context context;

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

स्पष्टीकरण क्यों अन्य उत्तर महान नहीं हैं:

  1. पासिंग Contextएडाप्टर के लिए पूरी तरह से अनावश्यक है, के बाद से RecyclerViewआप यह वर्ग के अंदर से एक्सेस कर सकते हैं
  2. स्तर Contextपर प्राप्त करने का ViewHolderमतलब है कि आप इसे हर बार करते हैं जब आप बांधते हैं या बनाते हैं ViewHolder। आप कार्रवाई डुप्लिकेट।
  3. मुझे नहीं लगता कि आपको किसी स्मृति रिसाव के बारे में चिंता करने की आवश्यकता है। यदि आपका अडैप्टर आपके Activityजीवनकाल के बाहर टिका है (जो अजीब होगा) तो आपके पास पहले से ही एक रिसाव है।

इस मामले में, क्या हम onDetachedFromRecyclerView()संदर्भ को लागू करेंगे और जारी करेंगे ?
जॉन पैंग

@ जॉनपंग वास्तव में तब तक नहीं जब तक आप बेहद रक्षात्मक नहीं होना चाहते। यदि आप गतिविधि के भीतर एडेप्टर संदर्भ रखते हैं, तो आप सुरक्षित हैं।
मैकीज बेमसिक

17

आप 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);


}


5

पहले विश्व स्तर पर घोषणा

Context mContext;

इसे संशोधित करके, निर्माणकर्ता के साथ संदर्भ दें।

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

फिर mContextआपको जहां भी इसकी आवश्यकता हो, उसका उपयोग करें


5

आप इस view.getContext () का उपयोग कर सकते हैं

उदाहरण

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

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


        }
    });


4

FeedAdapter का एक निर्माता बनाएँ:

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

और गतिविधि में

FeedAdapter obj = new FeedAdapter(this);

2

सबसे पहले एक वैश्विक चर जोड़ें

Context mContext;

फिर अपने कंस्ट्रक्टर को इसमें बदलें

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

एडेप्टर बनाते समय अपना संदर्भ पास करें।

FeedAdapter myAdapter = new FeedAdapter(this,myDataset);

1
View mView;
mView.getContext();

हालांकि यह कोड प्रश्न को हल कर सकता है, जिसमें यह भी बताया गया है कि यह समस्या कैसे और क्यों हल करती है, इससे वास्तव में आपके पोस्ट की गुणवत्ता को बेहतर बनाने में मदद मिलेगी, और संभवत: अधिक वोट मिले। याद रखें कि आप भविष्य में पाठकों के लिए प्रश्न का उत्तर दे रहे हैं, न कि केवल उस व्यक्ति से जो अब पूछ रहा है। स्पष्टीकरण जोड़ने के लिए कृपया अपना उत्तर संपादित करें और संकेत दें कि क्या सीमाएँ और मान्यताएँ लागू होती हैं। समीक्षा से
डबल-बीप
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.