क्या एडेप्टर से पेरेंट रेसलर व्यू का संदर्भ प्राप्त करने का एक बेहतर तरीका है?


81

मेरे पास एक उपयोग का मामला है जहां मुझे RecyclerViewएडेप्टर के अंदर से माता-पिता के संदर्भ की आवश्यकता है , विशेष रूप से onBindViewHolderविधि के अंदर । अब तक मैं जो कर रहा हूं, वह onCreateViewHolderइस viewGroup parentतरह से arg के साथ गुजरने की विधि में एक निजी वर्ग के सदस्य को सौंप रहा है :

private ViewGroup mParent;

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    // inflater logic.
    mParent = parent;
}

और माता-पिता RecyclerViewको onBindViewHolderइस तरह संदर्भित करना :

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    // binder logic.
    ((RecyclerView)mParent).blahBlahBlah();
}

क्या ऐसा करने का कोई बेहतर तरीका है? शायद RecyclerView.Adapterएक रास्ता है कि मैं याद किया हो सकता है?

जवाबों:


221

वास्तव में एक विशिष्ट विधि है जो कि एडेप्टर के साथ कॉलबैक के साथ है RecyclerView। बस onAttachedToRecylerView(RecyclerView recyclerView)विधि को ओवरराइड करें ।

public class Adapter_RV extends RecyclerView.Adapter<RecyclerView.ViewHolder>{

    RecyclerView mRecyclerView; 


    @Override
    public void onAttachedToRecyclerView(RecyclerView recyclerView) {
        super.onAttachedToRecyclerView(recyclerView);

        mRecyclerView = recyclerView;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return null;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

        mRecyclerView....
    }

1
मैं इस दस्तावेज में कैसे चूक गया! धन्यवाद, यह वही है जो मैं देख रहा था!
नबीर

5
दस्तावेज़ में कहा गया है: "ध्यान रखें कि एक ही एडेप्टर कई RecyclerViews द्वारा देखा जा सकता है।" developer.android.com/reference/android/support/v7/widget/… मुझे सही करें अगर मैं गलत हूं, लेकिन यदि आप एडेप्टर को एक से अधिक RecyclerView में असाइन करते हैं तो यह समस्या पैदा नहीं करेगा?
अनट्रैड

3
@UnTraDe हाँ यह होगा। उपरोक्त कोड पिछले RecyclerView उदाहरण को अधिलेखित कर देगा। एक समाधान संलग्न RecyclerView उदाहरणों की एक सूची को बनाए रखने और onDetachedFromRecyclerView (..) में इंस्टेंस को हटाने के लिए होगा। यदि संभव हो तो, इससे बचने के लिए सबसे अच्छा होगा और प्रत्येक RecyclerView उदाहरण के लिए बस एडाप्टर का एक उदाहरण बनाएं।
मास्टरवॉक

जैसे 200 वाँ मूल्य!
इयूक

3

दूसरा तरीका कंस्ट्रक्टर में एक संदर्भ दे रहा है, जैसे

public final class MyAdapter extends RecyclerView.Adapper {
    private final recyclerView;

    public MyAdapter(@NonNull RecyclerView recyclerView) {
        this.recyclerView = recyclerView;
    }

    ...

    @Override
     public void onBindViewHolder(ViewHolder holder, int position) {
        ...
    }
}

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