android - नेस्टेड स्क्रॉल वीव के अंदर रीसाइक्लियर देखें, सभी तत्वों को बढ़ने के लिए रीसाइक्लर दृश्य देखें




xml android-recyclerview (2)

मुझे नेस्टेड स्क्रोल वीव के अंदर एक रीसायकल विव को रखने के साथ एक समस्या हो रही है, जो रीसाइक्लेअर के एडएप्टर के सभी तत्वों को प्रस्तुत करने का कारण बनता है।

यह एक बहुत बड़ी समस्या है, क्योंकि सूचियों में रीसाइक्लेरव्यू दिखा रहा है जिसमें कई सौ तत्व शामिल हो सकते हैं

यह क्षण में बहुत अधिक अंतराल पैदा कर रहा है (जाहिर है) क्योंकि उसे एक ही बार में सभी विचार प्रस्तुत करना पड़ता है, और सामान्य रूप से रीसाइक्लेयर दृश्य के रूप में पहले से फुलाए गए दृश्यों का पुन: उपयोग नहीं किया जा सकता है।

यह मेरा वर्तमान एक्सएमएल है (इसे कम करने के लिए कुछ ब्लोटा हटाया गया है):

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.NestedScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fillViewport="true"
    android:overScrollMode="never">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="90dp">

            <!-- Some content -->

        </RelativeLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <!-- Some more content -->

        </LinearLayout>

        <!-- Product list -->
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <TextView
                android:id="@+id/title"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:padding="12dp"/>

            <android.support.v7.widget.RecyclerView
                android:id="@+id/recyclerview"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:overScrollMode="never"/>

        </LinearLayout>

    </LinearLayout>

</android.support.v4.widget.NestedScrollView>

यह मेरा ऑन क्रेटिव्यू () फ्रैग्मेंट से है जो नेस्टेड स्क्रॉल वीव और रीसाइक्लाइजर दृश्य वाले दृश्य को बढ़ा रहा है:

@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View root = inflater.inflate(R.layout.category_content_fragment, container, false);
    ButterKnife.bind(this, root);

    List<Product> products = new ArrayList<>(); //This is populated by other means, not relevant to the issue

    productsRecyclerView.setNestedScrollingEnabled(false);
    productsRecyclerView.setHasFixedSize(true);
    productsRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));

    ProductsContentAdapter productsContentAdapter = new ProductsContentAdapter(products);
    productsRecyclerView.setAdapter(productsContentAdapter);

    return root;
}

मैंने इस पोस्ट को इस मुद्दे के बारे में देखा है:
कैसे NestedScrollView के अंदर RecyclerView डाल करने के लिए?

लेकिन यह दुखद रूप से इस मुद्दे पर अंतिम निर्णय का उल्लेख नहीं करता है।

स्पष्ट करने के लिए: रीसाइक्लेयर वीव स्क्रॉल पूरी तरह से, यह सही समय पर दिखाता है, लेकिन समस्या यह है कि वह अपने सभी बच्चों को तुरन्त प्रदान करती है, जिसका अर्थ संभवतः कई सैकड़ों तत्व हैं, हालांकि स्क्रीन केवल अधिकतम समय पर 5-6

अधिक जानकारी की आवश्यकता है, तो कृपया प्रश्न पूछने के लिए स्वतंत्र महसूस करें।

------- संपादित करें -------
अन्य समाधानों के कई असफल प्रयासों के बाद, मैंने जीवा नन्धन के समाधान का उपयोग कर समाप्त कर दिया।
यह सवाल पूछने से पहले मुझे पता था कि यह एक संभावित समाधान था, लेकिन मुझे 11 अलग-अलग संभावित विचारों की आवश्यकता थी जो कि रिसायकल विव में फिट होने के लिए आवश्यक थे, इसलिए मैं इसे से बचने के लिए पसंद करता था।
अलग व्यू-टाईप्स का उपयोग करने के बाद, यह पूरी तरह से काम करता है मुझे डर था कि यह अत्यधिक व्यय प्रकार की वजह से बहुत ही अक्षम हो जाएगा, लेकिन यह कोमलता चिकनी है


मुझे भी इस मुद्दे पर आया है ... यह इसलिए है क्योंकि scrollview और RecyclerView दोनों डेटा लोड करने में अलग-अलग हैं, क्योंकि ScrollView इस मामले में अभिभावक के रूप में कार्य करता है और हम अपने कोड में नीचे पंक्ति का उपयोग कर रहे हैं।

setNestedScrollingEnabled(false);

यह स्क्रॉल धीमा कर देगा और Recyclerview डेटा के आधार पर समस्या को Recyclerview

इस समस्या को हल करने के लिए मैंने जिस तरह से उपयोग किया है, वह Recyclerview हेडर को जोड़ रहा है ..

यहां मैं इसे स्पष्ट रूप से समझाऊंगा

मान लें कि यह recyclerview हमारी गतिविधि में है

<android.support.v7.widget.RecyclerView
                android:id="@+id/recyclerview"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                />

अनुकूलक वर्ग ऐसा होगा, जहां हम शीर्ष लेख जोड़ देंगे

public class SampleAdapter extends RecyclerView.Adapter {


    private final int BODY = 1;
    private final int HEADER = 2;

    private List<String> data = null;

    SampleAdapter(List<String> data) {
        this.data = data;
    }


    @Override
    public int getItemViewType(int position) {

        if (position == 0) {
            return HEADER;
        }

        return BODY;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view;
        switch (viewType) {

            case HEADER:
                view = LayoutInflater.from(parent.getContext()).inflate(R.layout.inflate_header_layout, parent, false);
                return new HeaderViewHolder(view);

            default:
                //Setting the Body view...
                view = LayoutInflater.from(parent.getContext()).inflate(R.layout.inflate_details, parent, false);
                return new BodyViewHolder(view);
        }
    }

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

        if (holder instanceof BodyViewHolder) {
            //Set the body content....
            if (data != null && data.size() > 0) {
                /** Since we have added one cell for header,
                 * we need to decrement the position and render the body view.
                 *
                 */
                int bodyPosition = position - 1;

            }
        } else if (holder instanceof HeaderViewHolder) {
            //Set the header content...
        }
    }

    @Override
    public int getItemCount() {
        //Sice we are going to add header, we are supposed increase the count by one...
        return data.size() + 1;
    }
}

इसके द्वारा NestedScrollView लिए कोई ज़रूरत नहीं है और सभी दृश्य RecyclerView व्यू व्यवहार में काम करेंगे ...

आशा है कि यह उपयोगी है :)


यदि आपके पास बड़ी मात्रा में डेटा प्रदर्शित करने के लिए है, तो अगले डेटा प्राप्त करने के लिए स्क्रॉल उपयोग लोड से अधिक कुछ डेटा पहले बार दिखाएं।





nestedscrollview