একটি পুনর্ব্যবহারযোগ্য ভিউ অ্যাডাপ্টারে কীভাবে প্রসঙ্গ পাবেন


129

আমি চিত্রভিউতে ইউআরএল লোড করতে সক্ষম হতে পিকাসোর লাইব্রেরিটি ব্যবহার করার চেষ্টা করছি, তবে আমি পিকাসোর 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. Contextফিডএডাপ্টারে একটি আর্গুমেন্ট হিসাবে পাস করুন এবং এটি ক্লাস ফিল্ড হিসাবে রাখুন
  2. Contextআপনার প্রয়োজন হলে ইনজেকশন করতে নির্ভরতা ইনজেকশন ব্যবহার করুন । আমি দৃ strongly়ভাবে এটি সম্পর্কে পড়ার পরামর্শ। এর জন্য একটি দুর্দান্ত সরঞ্জাম রয়েছে - স্কেয়ার বাই ডেগার
  3. যে কোনও Viewবস্তু থেকে এটি পান । আপনার ক্ষেত্রে এটি আপনার পক্ষে কাজ করতে পারে:

    holder.pub_image.getContext()

    হিসাবে pub_imageএকটি হল ImageView


64
আমি তৃতীয় বিকল্পটি পছন্দ করি, ভিউ থেকে প্রসঙ্গটি পেয়েছি। এটি সহজ এবং সর্বাধিক সহজ সমাধান solution
ডিক লুকাস

বা আরও ভাল, পিকাসোর উদাহরণটি পাসের পরিবর্তে শ্রেণীর উদাহরণে পিকাসো উদাহরণটি ধরে রাখার এবং এটি অলস-লোড করার চেয়ে বেশি।
এরিক কোচরান

8
প্রতিটি ভিউহোল্ডার আইটেম ভিউয়ের একটি উদাহরণ থাকে যা আপনি কনস্ট্রাক্টরে পাস করেন। এটির মতো এটি ব্যবহার করুন: আইটেমভিউ.জেটকন্টেক্সট ()
আন্দ্রে লুপসা

1
আপনি # 2 করতে পারবেন না, পারবেন কি? আমি চেষ্টা করেছিলাম, তবে এটি আপনার হয়ে শেষ হয়ে যাবে ApplicationContextএবং ক্রিয়াকলাপের সাথে আবদ্ধ হবে না, যা গ্লাইডের মধ্যে থেকে রানটাইম ক্র্যাশ করবে।
বল্টআপ_আইম_কোডিং 5:38

আমি # 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;
}

শুভ কোডিং :)


আমার জন্যও কাজ করেছেন! ধন্যবাদ
কেনি দাবির

21
আমি প্রসঙ্গে প্রসঙ্গে বিশ্বব্যাপী উল্লেখ থাকার বিষয়ে দৃ strongly়ভাবে পরামর্শ দিচ্ছি। এটি ভয়াবহ স্মৃতি ফাঁস সমস্যার দিকে নিয়ে যেতে পারে !!
solidak

1
যদি আপনি ভিউহোল্ডার সাবক্লাস করেন তবে এটি ব্যক্তিগত হতে পারে।
r3dm4n

যদি অ্যাডাপ্টারটি একটি পুনর্ব্যবহারযোগ্য ভিউয়ের সাথে সংযুক্ত থাকে তবে সেই প্রসঙ্গটি যেভাবেই প্রয়োজন হবে তা গ্যারান্টিযুক্ত। যদি আপনি অ্যাডাপ্টারটি আনচ্যাট করতে পারেন তবে এটি ঠিক আছে যদি না কোনও কারণে আপনি এই অ্যাডাপ্টারের আলাদা হওয়ার পরে কোনও দৃ reference় রেফারেন্স ধরে রাখেন, সেক্ষেত্রে আপনার ক্যাশেড প্রসঙ্গটি সাফ করা উচিত, এর মতো পদ্ধতি onDetachedFromRecyclerViewবা অন্য কোনও কিছু রয়েছে।
অ্যান্ড্রয়েডজি

19

সংক্ষিপ্ত উত্তর:

Context context;

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

অন্যান্য উত্তর কেন দুর্দান্ত নয় তা ব্যাখ্যা:

  1. পাসিং Contextঅ্যাডাপ্টারে করা সম্পূর্ণ অপ্রয়োজনীয়, যেহেতুRecyclerView আপনি এটি ক্লাসের ভিতরে থেকে অ্যাক্সেস করতে পারেন
  2. উপগমন ContextViewHolderস্তর উপায়ে আপনি এটি প্রত্যেক সময় আপনি কি বেঁধে বা তৈরি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);


}

6

আপনি সংজ্ঞা দিতে পারেন:

Context ctx; 

এবং onCreateপ্রাথমিকভাবে ctx:

ctx=parent.getContext(); 

দ্রষ্টব্য: পিতামাতার একটি ভিউগ্রুপ।


5

প্রথম বিশ্বব্যাপী ঘোষণা করুন

Context mContext;

কনস্ট্রাক্টরের সাথে প্রসঙ্গটি সংশোধন করে পাস করুন।

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

তারপরে আপনার mContextযেদিকেই প্রয়োজন তা ব্যবহার করুন


5

আপনি এই ভিউয়ের মতো ব্যবহার করতে পারেন।

উদাহরণ

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

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


        }
    });


4

ফিডএডাপ্টারের একটি কনস্ট্রাক্টর তৈরি করুন:

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

এই কোডটি কীভাবে এবং কেন এই সমস্যার সমাধান করে তার ব্যাখ্যা সহ প্রশ্নটি সমাধান করতে পারে যদিও আপনার পোস্টের গুণমান উন্নত করতে সত্যই সহায়তা করবে এবং সম্ভবত আরও বেশি ভোটের ফলাফল হবে। মনে রাখবেন যে আপনি ভবিষ্যতে পাঠকদের জন্য প্রশ্নের উত্তর দিচ্ছেন, কেবল এখনই জিজ্ঞাসা করা ব্যক্তি নয়। দয়া করে সম্পাদনা ব্যাখ্যা যোগ করতে পারেন এবং সীমাবদ্ধতা এবং অনুমানের কি প্রয়োগ একটি ইঙ্গিত দিতে আপনার উত্তর। পর্যালোচনা থেকে
ডাবল-বীপ ২
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.