নেস্টেডস্ক্রোলভিউয়ের মধ্যে কীভাবে রিসাইক্লারভিউ ব্যবহার করবেন?


210

কিভাবে RecyclerViewভিতরে ব্যবহার করবেন NestedScrollView? RecyclerViewঅ্যাডাপ্টার সেট করার পরে সামগ্রীটি দৃশ্যমান নয়।

আপডেট আপডেট লেআউট কোড আপডেট করা হয়েছে।

<android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

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

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="@dimen/keyline_1">

    </RelativeLayout>

    <View
        android:id="@+id/separator"
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="#e5e5e5" />

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

</LinearLayout>

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


@ ম্যাসিড একটি স্ক্রোলভিউ (বা নেস্টেডস্ক্রোলভিউ) এর মধ্যে একটি পুনর্ব্যবহারযোগ্য ভিউ ব্যবহার করার কোনও কারণ নেই।
গ্যাব্রিয়েল মেরিওটি

2
@ ম্যাসিড আপনি অন্য স্ক্রোলযোগ্য দৃশ্যের ভিতরে কখনও স্ক্রোলযোগ্য ভিউ স্থাপন করা উচিত নয় ec এটি অ্যান্ড্রয়েডের একটি সাধারণ নিয়ম।
গ্যাব্রিয়েল মেরিওটি

6
@ গ্যাব্রিলেমারিওটি ​​আমি এই নিয়মটি জানি, তবে নেস্টেডস্ক্রোলভিউ এই সমস্যাটি সমাধানের জন্য বিকাশ করেছে।
মকিদ

1
এটা সঠিক নয়. নেস্টেডস্ক্রোলভিউ হ'ল স্ক্রোলভিউয়ের মতো, তবে এটি নেস্টেড স্ক্রোলিং পিতা বা মাতা এবং সন্তানের উভয়েরই অভিনয়কে সমর্থন করে। আপনার ক্ষেত্রে আপনাকে নিজের স্ক্রোলিং আচরণটি নির্ধারণ করতে হবে।
গ্যাব্রিয়েল মেরিওটি

উত্তর:


216

আপনার পুনর্ব্যবহারযোগ্য ভিউ এর সাথে প্রতিস্থাপন করুন,

<android.support.v7.widget.RecyclerView
    android:id="@+id/conversation"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

এখানে,

app:layout_behavior="@string/appbar_scrolling_view_behavior"

বাকি জিনিস পরিচালনা করবে।

আর একটি জিনিস, আপনার পুনর্ব্যবহারযোগ্য ভিউ নেস্টডস্ক্রোলভিউয়ের মধ্যে রাখার দরকার নেই


33
আমি বুঝতে পারি না কেন এই সমাধানটি সর্বাধিক ভোট দেয় না। এটি দিয়ে অর্জন করা হয়নি NestedScrollViewতবে কেবল সাথে app:layout_behavior="@string/appbar_scrolling_view_behavior"। এই কী!
হাতা

3
@ রাহুলউপাধ্যায় এটি আমার পক্ষে কাজ করেছে, তবে আমি মনে করি আপনার শেষ লাইনটি ভুল, রিসাইক্লার ভিউ কোনও নেস্টডস্ক্রোলভিউয়ের অভ্যন্তরে থাকলে তা মোটেও দেখায় না। তবে, আপনি একজন সুপারস্টার: ডি
লিওন

3
এটি কাজ করে! 'রিসাইক্লারভিউ লাইব্রেরি সংকলন' com.android.support:recyclerview-v7:+ 'কেবল আপডেট করুন
ফ্যাবিও গুয়েরা

28
এই সমাধানটি ব্যবহার করা CoordinatorLayout, AppBarLayoutএবং layout_scrollFlagsচাইল্ড ভিউ (গুলি) এর সাথে উপযুক্তভাবে সেট করার উদ্দেশ্যে যা এর সাথে স্ক্রোল করা উচিত RecyclerView। কেন এটি উত্তর থেকে বাদ দেওয়া হয়েছিল তা নিশ্চিত নয়। অন্যথায়, এটি একটি দুর্দান্ত এবং সহজ সমাধান।
সানভিওয়েল

9
আমি মনে করি এটি বোঝার জন্য এটি খুব গুরুত্বপূর্ণ যে এখানে রিসাইক্লারভিউয়ের রিসাইক্লিং কাজ করবে না। ফলস্বরূপ, আপনার আইটেমগুলির একটি দীর্ঘ তালিকা থাকলে এটি একটি লক্ষণীয় UI হিমায়িত প্রদর্শিত হবে।
গেকেট

121

আপডেট 1

অ্যান্ড্রয়েড সমর্থন লাইব্রেরি ২৩.২.০ লেআউট ম্যানেজারগুলির setAutoMeasureEnabled(true)জন্য যুক্ত পদ্ধতি ছিল । এটি এর বিষয়বস্তু মোড়ানোর জন্য এটি রিসাইক্লারভিউকে তোলে এবং একটি কবজির মতো কাজ করে।
http://android-developers.blogspot.ru/2016/02/android-support-library-232.html

সুতরাং এই জাতীয় কিছু যুক্ত করুন:

    LayoutManager layoutManager = new LinearLayoutManager(this);
    layoutManager.setAutoMeasureEnabled(true);
    recyclerView.setLayoutManager(layoutManager);
    recyclerView.setNestedScrollingEnabled(false);


আপডেট 2

27.1.0 থেকে setAutoMeasureEnabled অবচিত করা হয়েছে, তাই আপনার ওভাররাইড পদ্ধতিতে কাস্টম প্রয়োগ করা উচিতisAutoMeasureEnabled()

তবে রিসাইক্লার ভিউ ব্যবহারের বেশ কয়েকটি ক্ষেত্রে আমি দৃ .়ভাবে এটি মোড়ানো মোডে ব্যবহার না করার পরামর্শ দিচ্ছি , কারণ এটি এটির উদ্দেশ্যে নয়। বেশ কয়েকটি আইটেমের প্রকারের সাথে সাধারণ একক পুনর্ব্যবহারযোগ্য ভিউ ব্যবহার করে আপনার লেআউটটি পুরো রিফ্যাক্টর করার চেষ্টা করুন। বা লিনিয়ারলআউটের সাথে দৃষ্টিভঙ্গি ব্যবহার করুন যা আমি নীচে সর্বশেষ উপায় হিসাবে বর্ণনা করেছি


পুরানো উত্তর (প্রস্তাবিত নয়)

আপনি RecyclerViewভিতরে ব্যবহার করতে পারেন NestedScrollView। সবার আগে আপনার নিজের কাস্টমটি প্রয়োগ করা উচিত LinearLayoutManager, এটি RecyclerViewআপনাকে এর সামগ্রীতে মোড়ানো করতে সহায়তা করে। উদাহরণ স্বরূপ:

public class WrappingLinearLayoutManager extends LinearLayoutManager
{

    public WrappingLinearLayoutManager(Context context) {
        super(context);
    }

    private int[] mMeasuredDimension = new int[2];

    @Override
    public boolean canScrollVertically() {
        return false;
    }

    @Override
    public void onMeasure(RecyclerView.Recycler recycler, RecyclerView.State state,
            int widthSpec, int heightSpec) {
        final int widthMode = View.MeasureSpec.getMode(widthSpec);
        final int heightMode = View.MeasureSpec.getMode(heightSpec);

        final int widthSize = View.MeasureSpec.getSize(widthSpec);
        final int heightSize = View.MeasureSpec.getSize(heightSpec);

        int width = 0;
        int height = 0;
        for (int i = 0; i < getItemCount(); i++) {
            if (getOrientation() == HORIZONTAL) {
                measureScrapChild(recycler, i,
                        View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
                        heightSpec,
                        mMeasuredDimension);

                width = width + mMeasuredDimension[0];
                if (i == 0) {
                    height = mMeasuredDimension[1];
                }
            } else {
                measureScrapChild(recycler, i,
                        widthSpec,
                        View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
                        mMeasuredDimension);

                height = height + mMeasuredDimension[1];
                if (i == 0) {
                    width = mMeasuredDimension[0];
                }
            }
        }

        switch (widthMode) {
            case View.MeasureSpec.EXACTLY:
                width = widthSize;
            case View.MeasureSpec.AT_MOST:
            case View.MeasureSpec.UNSPECIFIED:
        }

        switch (heightMode) {
            case View.MeasureSpec.EXACTLY:
                height = heightSize;
            case View.MeasureSpec.AT_MOST:
            case View.MeasureSpec.UNSPECIFIED:
        }

        setMeasuredDimension(width, height);
    }

    private void measureScrapChild(RecyclerView.Recycler recycler, int position, int widthSpec,
            int heightSpec, int[] measuredDimension) {

        View view = recycler.getViewForPosition(position);
        if (view.getVisibility() == View.GONE) {
            measuredDimension[0] = 0;
            measuredDimension[1] = 0;
            return;
        }
        // For adding Item Decor Insets to view
        super.measureChildWithMargins(view, 0, 0);
        RecyclerView.LayoutParams p = (RecyclerView.LayoutParams) view.getLayoutParams();
        int childWidthSpec = ViewGroup.getChildMeasureSpec(
                widthSpec,
                getPaddingLeft() + getPaddingRight() + getDecoratedLeft(view) + getDecoratedRight(view),
                p.width);
        int childHeightSpec = ViewGroup.getChildMeasureSpec(
                heightSpec,
                getPaddingTop() + getPaddingBottom() + getDecoratedTop(view) + getDecoratedBottom(view),
                p.height);
        view.measure(childWidthSpec, childHeightSpec);

        // Get decorated measurements
        measuredDimension[0] = getDecoratedMeasuredWidth(view) + p.leftMargin + p.rightMargin;
        measuredDimension[1] = getDecoratedMeasuredHeight(view) + p.bottomMargin + p.topMargin;
        recycler.recycleView(view);
    }
}

এর পরে এটি LayoutManagerআপনার জন্য ব্যবহার করুনRecyclerView

recyclerView.setLayoutManager(new WrappingLinearLayoutManager(getContext()));

তবে আপনার সেই দুটি পদ্ধতিরও কল করা উচিত:

recyclerView.setNestedScrollingEnabled(false);
recyclerView.setHasFixedSize(false);

এখানে এর setNestedScrollingEnabled(false)জন্য স্ক্রোলিং অক্ষম করুন RecyclerView, যাতে এটি থেকে স্ক্রোলিং ইভেন্টটি বাধা দেয় না NestedScrollView। এবং setHasFixedSize(false)নির্ধারণ করুন যে অ্যাডাপ্টারের সামগ্রীতে পরিবর্তনগুলি এর আকার পরিবর্তন করতে পারেRecyclerView

গুরুত্বপূর্ণ দ্রষ্টব্য: এই সমাধানটি কিছু ক্ষেত্রে সামান্য বগী এবং পারফরম্যান্স নিয়ে সমস্যা রয়েছে, তাই আপনার যদি প্রচুর আইটেম থাকে তবে RecyclerViewআমি LinearLayoutতালিকা দর্শনের কাস্টম ভিত্তিক প্রয়োগ ব্যবহার করার পরামর্শ দিচ্ছি , এটির জন্য অ্যাডাপ্টারের অ্যানালগ তৈরি করে এটি তৈরি করুন মত আচরণ করা ListViewবাRecyclerView


19
সতর্ক করা! আপনার যদি প্রচুর আইটেম থাকে তবে এটি ব্যবহার করবেন না RecyclerView
ব্রেইস গাবিন

1
ব্রাইসগ্যাবিন, আপনি ঠিক বলেছেন: সেটহ্যাসফিক্সডসাইজ (ভুয়া) রিসাইক্লার ভিউয়ের একাধিক সতেজতা সৃষ্টি করে, সুতরাং এতে যদি প্রচুর আইটেম থাকে তবে এটি খুব ধীর গতিতে কাজ করবে। সেই ক্ষেত্রে আমি এটির সাথে
তালিকাগুলির

1
অনেক ধন্যবাদ! আমার ঘন্টা বাঁচিয়েছে যাইহোক, শেষ আইটেম সজ্জাটি এই লেআউট ম্যানেজারের সাথে প্রদর্শিত হবে না (এবং কেবল এটির সাথে), সম্ভাব্য বাগ?
জাং

2
সেটআউটমিজারএনেবল এপিআই স্তরের 27.1.0 বিকাশকারী
ডিকা

2
এর পরিবর্তে ওভাররাইড বুলিয়ানটি অটোমিজার এনেবল () রয়েছে। এটি লেআউটটির পরিমাপক পাসটি রিসাইক্লিউউয়ের অটোমিজার প্রক্রিয়াটি ব্যবহার করা উচিত কিনা বা এটি লেআউটম্যানেজারের অন-মেজার প্রয়োগের মাধ্যমে করা উচিত কিনা তা পুনরুদ্ধার করে (রিসাইক্লার, স্টেট, ইনট, ইনট)। এই পদ্ধতিটি ডিফল্ট হিসাবে মিথ্যা প্রত্যাবর্তন করে (এটি প্রকৃতপক্ষে অবমূল্যায়িত সেটআউটমিজারএএনবেবলড (বুলিয়ান) এ দেওয়া মানটি ফেরত দেয় এবং যদি কোনও লেআউটম্যানেজার রিসাইক্লারভিউ দ্বারা স্বয়ংক্রিয়ভাবে মাপতে চায় তবে সত্যটিতে ফিরে যেতে হবে। এই পদ্ধতিটি সত্যটিতে ফিরে যেতে যদি ওভাররাইড করা হয় তবে onMeasure (Recycler, State, int, int) ওভাররাইড করা উচিত নয়।
পিটারস্টেভ উরেমেগবা

100

1) আপনার উপরে 23.2.0 সমর্থন লাইব্রেরি (বা) ব্যবহার করা উচিত

2) এবং RecyclerViewউচ্চতা হবেwrap_content

3) recyclerView.setNestedScrollingEnabled(false)

তবে এটি করে পুনর্ব্যবহারযোগ্য প্যাটার্নটি কাজ করে না । (অর্থাত্ সমস্ত দর্শন একবারে লোড হবে কারণ wrap_contentসম্পূর্ণ উচ্চতার প্রয়োজন RecyclerViewতাই এটি সমস্ত শিশু Views at once. No view will be recycled). Try not to use this pattern unless it is really required. Try to useভিউ টাইপ and add all other views that need to scroll toরিসাইক্লারভিউ rather than usingরিসাইক্লারভিউ inস্ক্রোলভিউ আঁকবে The পারফরম্যান্সের প্রভাব খুব বেশি হবে।

এটিকে সহজ করার জন্য "এটি কেবলমাত্র LinearLayoutসমস্ত শিশু দর্শন হিসাবে কাজ করে "


6
ধন্যবাদ @ আশোক সেটিং recyclerView.setNestedScrollingEnabled(false)আমাকে একটি মসৃণ স্ক্রোল পেতে সহায়তা করেছিল।
শুভ্রাল

3
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত! এটি এটিকে ভালভাবে উল্লেখ করুন যে কোনও দর্শন পুনর্ব্যবহারযোগ্য হবে না এবং সমস্ত দৃশ্য একবারে আঁকানো হবে।
মুহাম্মাদ

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

@ অ্যালানতাবাবু স্ক্রোলভিউতে পুনর্ব্যবহারযোগ্য ব্যবহারের পরিবর্তে। স্ক্রোলভিউয়ের সমস্ত আইটেমকে পুনর্ব্যবহারযোগ্য দৃশ্যে আইটেমগুলিতে রূপান্তর করুন। আপনি পুনর্ব্যবহারযোগ্য ভিউ টাইপ এবং বিভিন্ন ধরণের লেআউট আঁকতে পারেন। এগুলি হ্যান্ডেল করার জন্য কয়েকটি ভাল গ্রন্থাগার রয়েছে (আপনার যদি সত্যিকারের জটিল কাঠামো থাকে এবং আপনি যদি পুনরায় ব্যবহারযোগ্য উপাদানগুলি চান তবে গ্রন্থাগারগুলি ব্যবহার করুন)।
অশোক ভার্মা

1
@ আশোক ভার্মায় পুনর্ব্যবহারকারী আচরণের সমস্যার কোনও সমাধান আছে? আমি চাই না যে একটি শটটিতে সমস্ত বাচ্চাদের আঁকতে পুনর্ব্যবহারযোগ্য দর্শন।
andro-girl

36

আপনি ব্যবহার করতে পারেন android:fillViewport="true"করতে NestedScrollViewপরিমাপ RecyclerViewRecyclerViewঅবশিষ্ট উচ্চতা পূর্ণ করে দিব। তাই যদি আপনি স্ক্রল করতে চান NestScrollView, আপনি সেট করতে পারেন RecyclerViewএর minHeight


14
আপনার যদি 200 আইটেমগুলির একটি পুনর্ব্যবহারযোগ্য পর্যালোচনা থাকে এবং আপনি এটি করেন তবে নেস্টডস্ক্রোলভিউ পুরো 200 আইটেমগুলিকে পূরণ করার জন্য প্রসারিত হবে!
আরজেফারেস

1
পুনঃটুইট আমি একটি ডেমো চেষ্টা করি এবং লেআউটটি পরিদর্শনকারীটিকে লেআউটটি পরিদর্শন করতে ব্যবহার করি, এটি কেবল ভাল কাজ করে। আপনি কি আপনার পুনর্ব্যবহারযোগ্য সংস্করণের সংস্করণ সরবরাহ করতে পারেন?
জায়ন

26

আমার জন্য কাজ করার recyclerView.setNestedScrollingEnabled(false);আগে কেবল যোগ করা adding setAdapterআমি app:layout_behavior="@string/appbar_scrolling_view_behavior"কোথাও যুক্ত করিনি এবং কোনও কাস্টম বিন্যাস পরিচালক সেট করিনি

<android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/white"
        android:orientation="vertical">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="15dp"
            android:layout_marginRight="15dp"
            android:orientation="vertical">

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:textColor="@color/white"
                android:text="Some Text..."
                android:padding="15dp" />

        </LinearLayout>

        <LinearLayout
            android:orientation="vertical"
            android:padding="15dp"
            android:layout_marginTop="10dp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="Quick Links"
                android:textColor="@color/black"
                android:textStyle="bold"
                android:textAllCaps="true"
                android:paddingLeft="20dp"
                android:drawableLeft="@drawable/ic_trending_up_black_24dp"
                android:drawablePadding="10dp"
                android:layout_marginBottom="10dp"
                android:textSize="16sp"/>

            <View
                android:layout_width="fill_parent"
                android:layout_height="1dp"
                android:background="#efefef"/>

            <android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
                android:id="@+id/recyclerview"
                android:layout_width="match_parent"
                android:layout_height="match_parent" />
        </LinearLayout>

    </LinearLayout>

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

10
কিন্তু এখন এটি আর দেখার মতামত পুনরায় ব্যবহার করে না?
মার্ক বুকেমা 13

না, তা রিসাইকেল করবে, তাই না?
বিগনেশ সুন্দর

6
না এটি হয় না, আমি 200 আইটেমগুলির সাথে খুব জটিল লেআউট দিয়ে চেষ্টা করেছি নেস্টডস্ক্রোলভিউটি কেবলমাত্র তার বাচ্চাদের আকারে প্রসারিত হবে যাতে এটি প্রসারিত হবে, সুতরাং কোনও পুনর্ব্যবহার ঘটবে না @ মারকবুইকামায় আপনি কি আরও ভাল সমাধান আবিষ্কার করার ব্যবস্থা করেছিলেন?
আরজেফারেস

20

এটিই আমার পক্ষে কাজ করছে

<android.support.v4.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fillViewport="true"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/rv_recycler_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
</android.support.v4.widget.NestedScrollView>

4
আপনি দ্বিতীয় অ্যাপটি মুছে ফেলতে পারেন : লেআউট_বৌচ্য = "@ স্ট্রিং / অ্যাপবার_স্ক্রোলিং_ভিউ_বিহেভিয়ার" আচরণটি কেবল সমন্বয়কারী লেআউট সরাসরি শিশুদের জন্য কাজ করে।
পেপস্টার

2
এছাড়াও, এটি উল্লেখ করা গুরুত্বপূর্ণ যে আপনার মূল বিন্যাস হিসাবে আপনার সমন্বয়কারী লেআউট হওয়া উচিত । এটা সবসময় সত্য হয় না।
গেকেট

10

আপনি যাচাই করতে পারেন এমন একটি সহজ এবং পরীক্ষামূলক কোড রয়েছে

<android.support.v4.widget.NestedScrollView
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:fillViewport="true"
     app:layout_behavior="@string/appbar_scrolling_view_behavior">
    <android.support.v7.widget.RecyclerView
           android:layout_width="match_parent"
           android:layout_height="match_parent"/>
   </android.support.v4.widget.NestedScrollView>

9

কারণ androidxএটি বলা হয় androidx.core.widget.NestedScrollView- এবং এটি বৈশিষ্ট্য isScrollContainerএবং measureAllChildrenসক্ষম সহ একই মাখনকেও স্ক্রোল করে :

<!-- Scrolling Content -->
<androidx.core.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"

    android:isScrollContainer="true"
    android:measureAllChildren="true"

    app:layout_behavior="@string/appbar_scrolling_view_behavior">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fastScrollEnabled="true"
        android:scrollbarStyle="insideInset"
        android:scrollbars="vertical"
        android:splitMotionEvents="false"
        android:verticalScrollbarPosition="right"/>

</androidx.core.widget.NestedScrollView>

7

এই লাইব্রেরিটি ব্যবহার করার চেষ্টা করুন - https://github.com/sero/android-linear-layout-manager

লাইব্রেরির লেআউটম্যানেজারটি পুনর্ব্যবহারযোগ্য ভিউয়ের সামগ্রীগুলিকে আবৃত করে। এক্ষেত্রে রিসাইক্লারভিউ "অভ্যন্তরীণ দর্শনগুলির মতো বড়" হবে, সুতরাং এতে কোনও স্ক্রোলবার থাকবে না এবং ব্যবহারকারী নেস্টডস্ক্রোলভিউয়ের স্ক্রোলিং ক্ষমতা ব্যবহার করবে। সুতরাং এটি "স্ক্রোলযোগ্য ভিতরে স্ক্রোলযোগ্য" এর মতো অস্পষ্ট হবে না।



6

স্ক্রোলিংয়ের সমস্যাগুলি এড়াতে আমি এখানে কোডটি ব্যবহার করছি:

mRecyclerView = (RecyclerView) view.findViewById(android.R.id.list);
mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
mRecyclerView.getLayoutManager().setAutoMeasureEnabled(true);
mRecyclerView.setNestedScrollingEnabled(false);
mRecyclerView.setHasFixedSize(false);

6

আমি ব্যবহৃত RecyclerView একটি ভিতরে NestedScrollView এবং এটা আমার জন্য কাজ করেন। আমার মনে রাখতে হবে যে কেবল নেচেষ্টস্ক্রোলভিউ কেবলমাত্র একটি শিশু দৃষ্টিভঙ্গি নেয়। সুতরাং আমার ক্ষেত্রে আমি লিনিয়ারলআউট ভিউগ্রুপটি ব্যবহার করেছি যা আমার রিসাইক্লারভিউ প্লাসের সাথে আমার প্রয়োজনীয় অন্যান্য সংখ্যক ভিউগুলিকে আবাসন করছিল।

আমার পুনর্ব্যবহারযোগ্য ভিউটিকে নেস্টডস্ক্রোলভিউয়ের মধ্যে রাখার জন্য আমি একটি সমস্যা অনুভব করছি। আমি বুঝতে পেরেছি যে আমার রিসাইক্লারভিউয়ের সামগ্রীটি স্থির হয়ে গেছে।

আমি পরে বুঝতে পারি যে আমার রিসাইক্লারভিউ স্ক্রোলিং ইভেন্টটি গ্রহণ করছে এবং তাই নেস্টেডস্ক্রোলভিউয়ের স্ক্রোলিং আচরণের সাথে সাংঘর্ষিক।

সুতরাং এই সমস্যাটি সমাধান করার জন্য, আমাকে এই পদ্ধতির সাহায্যে আমার পুনর্ব্যক্তিকল্পের স্ক্রোল কার্যকারিতাটি অক্ষম করতে হয়েছিল movieListNewRecyclerView.setNestedScrollingEnabled(false);

আমি আসলে কী করেছি তার একটি সংক্ষিপ্ত ভিডিওর জন্য আপনি আমার ইনস্টাগ্রামটি চেকআউট করতে পারেন। এটি আমার ইনস্টাগ্রাম হ্যান্ডেল অফেলিক্স03

আমি কি করেছি তা দেখতে এই চিত্রটিতে ক্লিক করুন


5

নেস্টেডস্ক্রোলভিউয়ের ভিতরে আমার ভিউপেজার এবং রিসাইক্লারভিউ রয়েছে। লাইন নীচে যুক্ত করার পরে

recyclerView.setNestedScrollingEnabled(false);
recyclerView.setHasFixedSize(false);

আমি ধীর স্ক্রোল এবং স্ক্রোল ল্যাগ ইস্যুটি সমাধান করেছি।


3
মানে না recyclerView.setHasFixedSize(true);?
কেনো ক্লেটন

3

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


8
যেহেতু RecyclerViewপ্রয়োগগুলি NestedScrollingChild, এর RecyclerViewমাধ্যমে স্ক্রোল করা উচিত NestedScrollView
বেনিয়ামিন

আমি কেবল প্রত্যাখ্যান করার পক্ষে ভোট দিয়েছি স্ট্যাকওভারফ্লো.com/review/suggested-edits/9907622 কে সম্পূর্ণরূপে ইংরেজী ভুলগুলির ভিত্তিতে দিয়েছি, তবে সেখানে মূল্যমানের বিষয়বস্তু থাকতে পারে - যে বিষয়টির জ্ঞানের সাথে পাশ দিয়ে যে কেউ প্রবেশ করা উচিত তাদের একবার দেখে নেওয়া উচিত এবং এটি পরিষ্কার করতে পারেন। যদি সেখানে কার্যকর কিছু না থাকে তবে মোডগুলি মুছে ফেলার জন্য আমার এই মন্তব্যটিকে পতাকাঙ্কিত করুন।
মার্ক অ্যামেরি

3

আপনি যদি ব্যবহার করছেন RecyclerView-23.2.1বা পরে নিম্নলিখিত সমাধানটি ঠিক কাজ করবে:

আপনার বিন্যাসে পুনর্ব্যবহারযোগ্য ভিউ যুক্ত করুন:

<android.support.v7.widget.RecyclerView
        android:id="@+id/review_list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:scrollbars="vertical" />

এবং আপনার জাভা ফাইলটিতে:

RecyclerView mRecyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);
LinearLayoutManager layoutManager=new LinearLayoutManager(getContext());
layoutManager.setAutoMeasureEnabled(true);
mRecyclerView.setLayoutManager(layoutManager);
mRecyclerView.setHasFixedSize(true);
mRecyclerView.setAdapter(new YourListAdapter(getContext()));

এখানে layoutManager.setAutoMeasureEnabled(true); কৌশলটি করবে।

চেক আউট এই সমস্যা এবং এই বিকাশকারীর ব্লগ আরও তথ্যের জন্য।


"MRecyclerView.setHasFixedSize (সত্য)" ব্যবহার করে সতর্ক থাকুন; যদিও। আপনি রানটাইমের সময় পুনর্ব্যবহারযোগ্য ভিউ থেকে আইটেমগুলি যুক্ত বা সরিয়ে না রাখলে আপনি কেবল এটি ব্যবহার করতে পারেন।
গেকেট

2

পুনর্ব্যবহারযোগ্য বৈশিষ্ট্যের পুনর্ব্যবহারযোগ্য বৈশিষ্ট্য বজায় রাখার একটি সমাধান এবং আপনার সমস্ত ডেটা লোড করার জন্য পুনর্ব্যবহারযোগ্যতা এড়ানো এগুলি পুনর্ব্যবহারের মধ্যেই একটি স্থির উচ্চতা নির্ধারণ করছে। এটি করার মাধ্যমে পুনর্ব্যবহারযোগ্যতাটি কেবল তার লোডের মধ্যেই সীমাবদ্ধ থাকে যতক্ষণ না আপনি নীচে / শীর্ষে স্ক্রোল করেন যদি ব্যবহারকারী তার উপাদানটিকে পুনরায় পুনর্ব্যবহার করতে পারে।


2

অনেক ভাল উত্তর আছে। কীটি আপনাকে অবশ্যই সেট nestedScrollingEnabledকরতে হবে false। উপরে বর্ণিত হিসাবে আপনি এটি জাভা কোডে করতে পারেন:

mRecyclerView.setNestedScrollingEnabled(false);

তবে আপনার কাছে একই সম্পত্তিটি এক্সএমএল কোডে সেট করার সুযোগ রয়েছে ( android:nestedScrollingEnabled="false"):

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

2

যদি আপনি নেস্টেডস্ক্রোলভিউয়ের অভ্যন্তরে পুনর্ব্যবহারযোগ্য স্ক্রোললিস্টনার ব্যবহার করছেন , addOnScrollListener শ্রোতা সঠিকভাবে কাজ করছে না যদি আপনি উভয় ব্যবহার করা হয়।

এই কোড ব্যবহার করুন।

recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
            super.onScrollStateChanged(recyclerView, newState); 
              ......
        }
    });

এই কোড কাজ জরিমানা RecyclerView ScrollListener ভিতরে NestedScrollView

ধন্যবাদ


1

আমাকে টুলবার স্ক্রোলিংয়ের সাথে সমন্বয়কারী লেআউট বাস্তবায়ন করতে হয়েছিল এবং এটি আমাকে পুরো দিন গণ্ডগোল করে নিয়েছে। নেস্টেডস্ক্রোলভিউ মোটেও মুছে ফেলার মাধ্যমে আমি এটি কাজ করে চলেছি। সুতরাং আমি মূলে কেবল রিলেটিভলআউট ব্যবহার করছি।

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

        <android.support.v7.widget.RecyclerView
            android:id="@+id/rv_nearby"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior" />

</RelativeLayout>

1

নেস্টেডস্ক্রোলভিউয়ের মধ্যে পুনর্ব্যবহারযোগ্য ভিউ ব্যবহার করবেন না। এটি ক্যাসকেডিং সমস্যা হতে পারে! আমি একাধিক ধরণের দর্শন পরিচালনা করার জন্য পুনরায় ব্যবহারকারীর আইটেমভিউটাইপগুলি ব্যবহার করার পরামর্শ দিই। পিতা-মাতার প্রস্থ এবং উচ্চতা সহ কেবল একটি পুনর্ব্যবহারযোগ্য ভিউ যুক্ত করুন। তারপরে আপনার রিসাইক্লারভিউ অ্যাডাপ্টারে ওভাররাইড গেট আইটেম ভিউ টাইপ এবং কোন লেআউটটি স্ফীত হতে হবে তা পরিচালনা করার জন্য অবস্থান ব্যবহার করুন। এরপরে আপনি অনবিন্দ ভিউহোল্ডার পদ্ধতিটি ব্যবহার করে আপনার ভিউ ধারককে পরিচালনা করতে পারেন।


1
nestedScrollView.setNestedScrollingEnabled(true);

mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
            //...
        }
    });


<androidx.core.widget.NestedScrollView
    android:id="@+id/nested"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fillViewport="true"
    android:layout_below="@id/appBarLayout_orders"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"> 

    <androidx.constraintlayout.widget.ConstraintLayout ...

        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recycler"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"/>

0

আমি এই দারুণ এক্সটেনশনটি ব্যবহার করেছি (কোটলিনে লেখা কিন্তু জাভাতেও ব্যবহার করা যেতে পারে)

https://github.com/Widgetlabs/expedition-nestedscrollview

মূলত আপনি যে NestedRecyclerViewকোনও প্যাকেজটির অভ্যন্তর পান আপনার প্রকল্পে ইউটিস বলতে দেয়, তারপরে আপনার পুনর্ব্যবহারযোগ্য মতটি তৈরি করুন

 <com.your_package.utils.NestedRecyclerView
      android:id="@+id/rv_test"
      android:layout_width="match_parent"
      android:layout_height="match_parent" />

মার্ক নাউপের দুর্দান্ত এই নিবন্ধটি দেখুন

https://medium.com/widgetlabs-engineering/scrollable-nestedscrollviews-inside-recyclerview-ca65050d828a


0

সমস্ত পুনর্ব্যবহারযোগ্য ভিউ শিশুকে একবারে নেস্টেড স্ক্রোল ভিউয়ের ভিতরে না লোড করার জন্য সমাধান

Benfits:

  1. নেস্টেড স্ক্রোল ভিউটি ব্যবহার করার সময়, সমস্ত শিশুকে একবার লোড করবেন না।
  2. আপনি আরও ভাল পারফরম্যান্সের জন্য রিসাইকেলভিউ.সেটহ্যাসফিক্সডসাইজ (সত্য) ব্যবহার করতে পারেন
  3. ওয়েবসার্চিসমূহ একবারে সমস্ত ডেটা প্রেরণে প্রতিরোধ করে, পৃষ্ঠাগুলি প্রত্যাশা অনুযায়ী কাজ করে
  4. বৃহত সংখ্যক ডেটা সেটের জন্য ভাল।
  5. লো মেমোরি ডিভাইসের জন্য ভাল
  6. নেস্টেড স্ক্রোলিং ব্যবহার চালিয়ে যেতে পারেন
  7. যখন আপনার পুনর্ব্যবহারযোগ্য আইটেমটি জটিল হয় এবং প্রচুর সংস্থান প্রয়োজন হয় তখন খুব সহায়ক।

স্থির করুন:

পরিবর্তে ব্যবহার করার আপনার XML- এর match_parent বা wrap_content recycleview ব্যবহারের জন্য ফিক্স উচ্চতা


-5

নেস্টেডস্ক্রোলভিউয়ের সাথে রিসাইক্লারভিউ

    <android.support.v7.widget.RecyclerView
    android:id="@+id/rv"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior" />
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.