স্ক্রোলভিউয়ের অভ্যন্তরে রিসাইক্লারভিউ কাজ করছে না


276

আমি একই লেআউটে রিসাইক্লারভিউ এবং স্ক্রোলভিউ সমন্বিত একটি বিন্যাস কার্যকর করার চেষ্টা করছি।

বিন্যাস টেমপ্লেট:

<RelativeLayout>
    <ScrollView android:id="@+id/myScrollView">
       <unrelated data>...</unrealated data>

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


</RelativeLayout>

সমস্যা: আমি এর শেষ উপাদান পর্যন্ত স্ক্রোল করতে পারি ScrollView

আমি যে জিনিসগুলি চেষ্টা করেছি:

  1. এর ভিতরে কার্ড ভিউ ScrollView(এখন ScrollViewরয়েছে RecyclerView) - কার্ডটি আপ না হওয়া পর্যন্ত দেখতে পাবেRecyclerView
  2. প্রাথমিক চিন্তাধারার পরিবর্তে এর মতামতের ধরণগুলির মধ্যে একটি হ'ল পরিবর্তে এটি viewGroupব্যবহার করে বাস্তবায়ন করা হয়েছিল তবে আমি ঠিক একই ফলাফল পেয়েছি resultsRecyclerViewScrollViewCardViewScrollView

: এই পদ্ধতির চেকআউট stackoverflow.com/a/21878703/684582
Alécio কারভালহো

15
এর মধ্যে অনেক ক্ষেত্রে একটি সহজ সমাধান NestedScrollViewপরিবর্তে ব্যবহার করা হয়, কারণ এটি প্রচুর স্ক্রোলিংয়ের বিষয়গুলি পরিচালনা করে
রিচার্ড লে ম্যাসুরিয়ার

রিচার্ড আপনাকে ফেব্রুয়ারিতে উত্তরটি দিয়েছিল। এর NestedScrollViewপরিবর্তে একটি ব্যবহার করুন ScrollView। এটি ঠিক এটির জন্য।
মাইক এম।

2
আমার জন্য কোনও জিনিস পরিবর্তন করে না
লুক অ্যালিসন

2
ভবিষ্যতের রেফারেন্সের জন্য, যদি কেউ কেবল মার্শমেলো / নওগাট (এপিআই 23, 24) ডিভাইসগুলির সম্মুখীন হন, আমার স্ট্যাকওভারফ্লো. com
হোসেন খান

উত্তর:


653

NestedScrollViewপরিবর্তে ব্যবহার করুনScrollView

আরও তথ্যের জন্য দয়া করে নেস্টডস্ক্রোলভিউ রেফারেন্স ডকুমেন্টের মাধ্যমে যান ।

এবং recyclerView.setNestedScrollingEnabled(false);আপনার যুক্তRecyclerView


24
এর সাথে কাজ করে: android.support.v4.widget.NestedScrollView
কোকোরিকো

7
রাখা android:layout_height="wrap_content"ViewHolder জন্য স্ফীত লেআউট জন্য
সারাথ বাবু

4
একটি জটিল বিন্যাসে NestedScrollViewআমার জন্য lags, এর বিপরীতে ScrollView। ব্যবহার না করে সমাধানের সন্ধান করছেনNestedScrollView
রোমান সামোলেঙ্কো

7
এছাড়াও আপনি অ্যান্ড্রয়েড যুক্ত করতে পারেন: নেস্টডস্ক্রোলিংএনবলড = "মিথ্যা" কে এক্সএমএল এর পরিবর্তে রিসাইক্লারভিউ.সেটনেস্টডস্ক্রোলিংএনেবলড (ভুয়া);
কোস্ট্যাবাকায়

2
এটি আমার পক্ষে কাজ করেছে তবে মনে রাখবেন যে রিসাইক্লারভিউয়ের আইটেমগুলি পুনর্ব্যবহারযোগ্য হচ্ছে না।
মোস্তফা আরিয়ান নেজাদ

102

আমি জানি যে আমি এই গেমটি দেরি করে ফেলেছি, তবে গুগল ঠিক করে দেওয়ার পরেও বিষয়টি এখনও বিদ্যমান android.support.v7.widget.RecyclerView

ইস্যু আমি এখন পাবেন RecyclerViewসঙ্গে layout_height=wrap_contentসব আইটেম ইস্যু উচ্চতা গ্রহণ না করার ভিতরে ScrollViewযে শুধুমাত্র Marshmallow এ এবং বাদামের তক্তি + + (API এর 23, 24, 25) সংস্করণের উপর ঘটবে।
(আপডেট: সমস্ত সংস্করণে কাজগুলির ScrollViewসাথে প্রতিস্থাপন করা android.support.v4.widget.NestedScrollViewI আমি কোনওভাবে পরীক্ষার গ্রহণযোগ্য সমাধানটি মিস করেছি missed এটি আমার গিথুব প্রকল্পে ডেমো হিসাবে যুক্ত করেছে))

বিভিন্ন জিনিস চেষ্টা করার পরে, আমি কার্যকরী সন্ধান পেয়েছি যা এই সমস্যাটিকে সংশোধন করে।

সংক্ষেপে আমার লেআউট কাঠামো এখানে:

<ScrollView>
  <LinearLayout> (vertical - this is the only child of scrollview)
     <SomeViews>
     <RecyclerView> (layout_height=wrap_content)
     <SomeOtherViews>

কার্যসংক্রান্ত মোড়ানো হয় RecyclerViewসঙ্গে RelativeLayout। আমাকে জিজ্ঞাসা করবেন না কিভাবে আমি এই কাজটি দেখতে পেয়েছি !!!¯\_(ツ)_/¯

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:descendantFocusability="blocksDescendants">

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

</RelativeLayout>

সম্পূর্ণ উদাহরণ গিটহাব প্রকল্পে উপলভ্য - https://github.com/amardeshbd/android-recycler-view-wrap-content

এখানে একটি ডেমো স্ক্রিনকাস্টটি কার্যের স্থিরতা প্রদর্শন করছে:

স্কীনকাস্ট


6
ধন্যবাদ ম্যান .. এটির সাহায্য অনেক .. তবে আপনার সমাধানের পরে স্ক্রোলিং শক্ত হয়ে ওঠে তাই আমি রিসাইক্লারভিউ সেট করে নিইসনেস্টডস্ক্রোলিংএনেবলড (মিথ্যা); এবং এখন এটি একটি কবজ মত কাজ।
সাগর চাওয়াদা

4
এই পদ্ধতিটি কি পুনরুদ্ধার করা হয়েছে? যদি আমাদের কাছে প্রায় কয়েকশ বস্তু পুনর্ব্যবহারযোগ্য হয়। এটি হ্যাক সমাধান নয়।
অ্যান্ড্রয়েডএক্সপি

1
হ্যাঁ, @ অ্যান্ড্রয়েডএক্সপি ঠিক আছে, এই হ্যাকটি দীর্ঘ তালিকার কোনও সমাধান নয়। আমার ব্যবহারের ক্ষেত্রে একটি তালিকা দেখুন যা 10. কম এবং কিভাবে আমি অন্য কার্যসংক্রান্ত পাওয়া তার জন্য অবশ্যই আমি র্যান্ডম কিছু চেষ্টা ছিল আইটেম সংশোধন করা হয়েছে, এই তাদের :-) অন্যতম
হোসেন খান

নিখুঁত.আডনরয়েড মার্শমেলো এবং উপরের অংশে আমার সমস্যা সমাধান করুন। ;)
আমির জিয়ারাটি

2
যদি আমি এই সমাধানটি ব্যবহার করি, তবে অনবিন্দ ভিউ তালিকার সমস্ত আইটেমের জন্য কল করা হচ্ছে যা পুনর্ব্যবহারের দর্শন নয়।
thedarkp যাত্রী

54

যদিও এটি সুপারিশ

অন্য স্ক্রোলযোগ্য দৃশ্যের মধ্যে আপনার কখনই কোনও স্ক্রোলযোগ্য ভিউ রাখা উচিত নয়

একটি দুর্দান্ত পরামর্শ, তবে আপনি যদি পুনর্ব্যবহারকারী দৃশ্যে একটি নির্দিষ্ট উচ্চতা নির্ধারণ করেন তবে এটি ঠিকঠাক কাজ করা উচিত।

যদি আপনি অ্যাডাপ্টার আইটেম বিন্যাসের উচ্চতা জানেন তবে আপনি কেবল পুনর্ব্যবহারযোগ্য ভিউয়ের উচ্চতা গণনা করতে পারেন।

int viewHeight = adapterItemSize * adapterData.size();
recyclerView.getLayoutParams().height = viewHeight;

10
কীভাবে কোনও ধারণা পুনর্ব্যবহারযোগ্য এডাপ্টার আইটেম সাইজ পাবেন?
ক্রুতিক

1
এটি যাদুমন্ত্রের মত কাজ করে! সামান্য সংশোধন এটি হওয়া উচিত: int ভিউহাইট = অ্যাডাপ্টারআইটেম সাইজ * অ্যাডাপ্টারডাটা.সাইজ (); recyclerView.getLayoutParams ()। উচ্চতা = ভিউহাইট;
বৈভব জানি

3
অ্যাডাপ্টারের আইটেম সাইজটি কীভাবে সন্ধান করবেন?
droidster.me

2
@ জোয়াকিমইংস্ট্রম adapterItemSizeভেরিয়েবল কী ?
ইগোরগানাপলস্কি

1
স্ক্রোল ভিউয়ের অভ্যন্তরে পুনর্ব্যবহারকারী দৃশ্যটি এড়িয়ে চলুন, কারণ স্ক্রোল ভিউটি তার শিশুকে অসীম স্থান দেয়। এটি উল্লম্ব দিকের (পুনর্ব্যবহারকারী দর্শনের শেষ আইটেম অবধি) অসীমভাবে পরিমাপ করতে উচ্চতা হিসাবে মোড়কে_ কনটেন্টযুক্ত পুনর্ব্যবহারকারী দৃশ্যের কারণ ঘটায়। স্ক্রোল ভিউয়ের অভ্যন্তরে পুনর্ব্যবহারযোগ্য ভিউটি ব্যবহার করার পরিবর্তে বিভিন্ন আইটেমের ধরণের সাথে কেবল পুনর্ব্যক্তিকর ভিউটি ব্যবহার করুন। এই প্রয়োগের সাথে সাথে, স্ক্রোল ভিউয়ের বাচ্চারা দর্শন প্রকারের মতো আচরণ করবে। রিসাইকেলার ভিউয়ের মধ্যে সেই ভিউ টাইপগুলি হ্যান্ডেল করুন।
অভিষেশ

28

পুনর্ব্যবহারযোগ্যের জন্য নির্দিষ্ট উচ্চতা নির্ধারণের ক্ষেত্রে কারও পক্ষে কাজ করা হয়নি (আমার মতো), আমি স্থির উচ্চতার সমাধানটিতে যা যুক্ত করেছি তা এখানে:

mRecyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
    @Override
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
        int action = e.getAction();
        switch (action) {
            case MotionEvent.ACTION_MOVE:
                rv.getParent().requestDisallowInterceptTouchEvent(true);
                break;
        }
        return false;
    }

    @Override
    public void onTouchEvent(RecyclerView rv, MotionEvent e) {

    }

    @Override
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

    }
});

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

1
এটি আমার পক্ষেও কাজ করেছে, কেবল স্ক্রোলভিউয়ের সরাসরি সন্তানের উপর getParent ব্যবহার করতে ভুলবেন না
BigBen3216

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

আমারও পুনর্ব্যবহারযোগ্য ভিউ.সেটনেস্টডস্ক্রোলিংএনেবল (ভুয়া) দরকার ছিল;
বিশ্লেষক

25

নতুন অ্যান্ড্রয়েড সাপোর্ট লাইব্রেরি 23.2 সেই সমস্যার সমাধান করে, আপনি এখন র্যাপ_ কনটেন্টকে আপনার উচ্চতা হিসাবে সেট করতে পারেন RecyclerViewএবং সঠিকভাবে কাজ করতে পারেন।

অ্যান্ড্রয়েড সমর্থন লাইব্রেরি 23.2


খুব ভালভাবে ওঠে না (23.4.0)

1
@ বিহেলিট ২৩.৪.০ এর কিছু সমস্যা আছে কোড. google.com/p/android/issues/detail?id=210085#makecgesges , পরিবর্তে 23.2.1 ব্যবহার করুন
সামাদ

1
এমনকি 25.0.1
maruti060385

15

রিসাইক্লারভিউগুলি এতক্ষণ স্ক্রোলভিউগুলিতে রাখা ঠিক আছে কারণ তারা নিজেরাই স্ক্রোল করছে না। এই ক্ষেত্রে, এটি একটি নির্দিষ্ট উচ্চতা তৈরি করা বোধগম্য।

সঠিক সমাধানটি হ'ল wrap_contentরিসাইক্লারউভিউ উচ্চতায় ব্যবহার করা এবং তারপরে একটি কাস্টম লিনিয়ারলআউটআউট ম্যানেজার প্রয়োগ করা যা মোড়কে সঠিকভাবে পরিচালনা করতে পারে।

আপনার প্রকল্পে এই লিনিয়ারলআউটম্যানেজারটি অনুলিপি করুন: https://github.com/sero/android-linear-layout-manager/blob/master/lib/src/main/java/org/solovyev/android/views/llm/LinearLayoutManager.java

তারপরে পুনর্ব্যবহারযোগ্য ভিউটি মোড়ুন:

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

এবং এটির মতো সেট আপ করুন:

    RecyclerView list = (RecyclerView)findViewById(R.id.list);
    list.setHasFixedSize(true);
    list.setLayoutManager(new com.example.myapp.LinearLayoutManager(list.getContext()));
    list.setAdapter(new MyViewAdapter(data));

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


4
আপনি রিসাইক্লারভিউতে সেটনেস্টডস্ক্রোলিংএনেবলড (ভুয়া) কল করতে পারবেন না?
এশান

14

এর জন্য ScrollView, আপনি নীচের মতো ব্যবহার করতে fillViewport=trueএবং তৈরি করতে এবং layout_height="match_parent"ভিতরে পুনর্ব্যক্তিকর দৃশ্যটি রাখতে পারেন :

<ScrollView
    android:fillViewport="true"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_below="@+id/llOptions">
          <android.support.v7.widget.RecyclerView
            android:id="@+id/rvList"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            />
</ScrollView>

কোডের মাধ্যমে আর কোনও উচ্চতার সমন্বয় প্রয়োজন।


V23.2.1 ব্যবহার করে জরিমানা কাজ করার পরীক্ষিত। উপরের পুনর্ব্যবহারের জন্য লেআউট যুক্ত করার জন্য এটি ব্যবহার করছিল।
winsontan520

কেবল রিসাইক্লারভিউ স্ক্রোলিং এবং স্ক্রোলভিউ স্ক্রোলিং নয়
সামাদ

13

RecyclerViewম্যানুয়ালি উচ্চতার গণনা করা ভাল নয়, একটি কাস্টম ব্যবহার করা ভাল LayoutManager

(উপরে সমস্যার জন্য কারণ কোন দৃশ্য যা এর স্ক্রল আছে ListView, GridView, RecyclerView) এটি উচ্চতা নিরূপণ করা যখন অন্য দৃশ্য একটি শিশু হিসেবে যুক্ত করো স্ক্রল হয়েছে ব্যর্থ হয়েছে। সুতরাং এর onMeasureপদ্ধতিটি ওভাররাইড করা সমস্যার সমাধান করবে।

নীচের সাথে ডিফল্ট লেআউট ম্যানেজার প্রতিস্থাপন করুন:

public class MyLinearLayoutManager extends android.support.v7.widget.LinearLayoutManager {

private static boolean canMakeInsetsDirty = true;
private static Field insetsDirtyField = null;

private static final int CHILD_WIDTH = 0;
private static final int CHILD_HEIGHT = 1;
private static final int DEFAULT_CHILD_SIZE = 100;

private final int[] childDimensions = new int[2];
private final RecyclerView view;

private int childSize = DEFAULT_CHILD_SIZE;
private boolean hasChildSize;
private int overScrollMode = ViewCompat.OVER_SCROLL_ALWAYS;
private final Rect tmpRect = new Rect();

@SuppressWarnings("UnusedDeclaration")
public MyLinearLayoutManager(Context context) {
    super(context);
    this.view = null;
}

@SuppressWarnings("UnusedDeclaration")
public MyLinearLayoutManager(Context context, int orientation, boolean reverseLayout) {
    super(context, orientation, reverseLayout);
    this.view = null;
}

@SuppressWarnings("UnusedDeclaration")
public MyLinearLayoutManager(RecyclerView view) {
    super(view.getContext());
    this.view = view;
    this.overScrollMode = ViewCompat.getOverScrollMode(view);
}

@SuppressWarnings("UnusedDeclaration")
public MyLinearLayoutManager(RecyclerView view, int orientation, boolean reverseLayout) {
    super(view.getContext(), orientation, reverseLayout);
    this.view = view;
    this.overScrollMode = ViewCompat.getOverScrollMode(view);
}

public void setOverScrollMode(int overScrollMode) {
    if (overScrollMode < ViewCompat.OVER_SCROLL_ALWAYS || overScrollMode > ViewCompat.OVER_SCROLL_NEVER)
        throw new IllegalArgumentException("Unknown overscroll mode: " + overScrollMode);
    if (this.view == null) throw new IllegalStateException("view == null");
    this.overScrollMode = overScrollMode;
    ViewCompat.setOverScrollMode(view, overScrollMode);
}

public static int makeUnspecifiedSpec() {
    return View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
}

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

    final boolean hasWidthSize = widthMode != View.MeasureSpec.UNSPECIFIED;
    final boolean hasHeightSize = heightMode != View.MeasureSpec.UNSPECIFIED;

    final boolean exactWidth = widthMode == View.MeasureSpec.EXACTLY;
    final boolean exactHeight = heightMode == View.MeasureSpec.EXACTLY;

    final int unspecified = makeUnspecifiedSpec();

    if (exactWidth && exactHeight) {
        // in case of exact calculations for both dimensions let's use default "onMeasure" implementation
        super.onMeasure(recycler, state, widthSpec, heightSpec);
        return;
    }

    final boolean vertical = getOrientation() == VERTICAL;

    initChildDimensions(widthSize, heightSize, vertical);

    int width = 0;
    int height = 0;

    // it's possible to get scrap views in recycler which are bound to old (invalid) adapter entities. This
    // happens because their invalidation happens after "onMeasure" method. As a workaround let's clear the
    // recycler now (it should not cause any performance issues while scrolling as "onMeasure" is never
    // called whiles scrolling)
    recycler.clear();

    final int stateItemCount = state.getItemCount();
    final int adapterItemCount = getItemCount();
    // adapter always contains actual data while state might contain old data (f.e. data before the animation is
    // done). As we want to measure the view with actual data we must use data from the adapter and not from  the
    // state
    for (int i = 0; i < adapterItemCount; i++) {
        if (vertical) {
            if (!hasChildSize) {
                if (i < stateItemCount) {
                    // we should not exceed state count, otherwise we'll get IndexOutOfBoundsException. For such items
                    // we will use previously calculated dimensions
                    measureChild(recycler, i, widthSize, unspecified, childDimensions);
                } else {
                    logMeasureWarning(i);
                }
            }
            height += childDimensions[CHILD_HEIGHT];
            if (i == 0) {
                width = childDimensions[CHILD_WIDTH];
            }
            if (hasHeightSize && height >= heightSize) {
                break;
            }
        } else {
            if (!hasChildSize) {
                if (i < stateItemCount) {
                    // we should not exceed state count, otherwise we'll get IndexOutOfBoundsException. For such items
                    // we will use previously calculated dimensions
                    measureChild(recycler, i, unspecified, heightSize, childDimensions);
                } else {
                    logMeasureWarning(i);
                }
            }
            width += childDimensions[CHILD_WIDTH];
            if (i == 0) {
                height = childDimensions[CHILD_HEIGHT];
            }
            if (hasWidthSize && width >= widthSize) {
                break;
            }
        }
    }

    if (exactWidth) {
        width = widthSize;
    } else {
        width += getPaddingLeft() + getPaddingRight();
        if (hasWidthSize) {
            width = Math.min(width, widthSize);
        }
    }

    if (exactHeight) {
        height = heightSize;
    } else {
        height += getPaddingTop() + getPaddingBottom();
        if (hasHeightSize) {
            height = Math.min(height, heightSize);
        }
    }

    setMeasuredDimension(width, height);

    if (view != null && overScrollMode == ViewCompat.OVER_SCROLL_IF_CONTENT_SCROLLS) {
        final boolean fit = (vertical && (!hasHeightSize || height < heightSize))
                || (!vertical && (!hasWidthSize || width < widthSize));

        ViewCompat.setOverScrollMode(view, fit ? ViewCompat.OVER_SCROLL_NEVER : ViewCompat.OVER_SCROLL_ALWAYS);
    }
}

private void logMeasureWarning(int child) {
    if (BuildConfig.DEBUG) {
        Log.w("MyLinearLayoutManager", "Can't measure child #" + child + ", previously used dimensions will be reused." +
                "To remove this message either use #setChildSize() method or don't run RecyclerView animations");
    }
}

private void initChildDimensions(int width, int height, boolean vertical) {
    if (childDimensions[CHILD_WIDTH] != 0 || childDimensions[CHILD_HEIGHT] != 0) {
        // already initialized, skipping
        return;
    }
    if (vertical) {
        childDimensions[CHILD_WIDTH] = width;
        childDimensions[CHILD_HEIGHT] = childSize;
    } else {
        childDimensions[CHILD_WIDTH] = childSize;
        childDimensions[CHILD_HEIGHT] = height;
    }
}

@Override
public void setOrientation(int orientation) {
    // might be called before the constructor of this class is called
    //noinspection ConstantConditions
    if (childDimensions != null) {
        if (getOrientation() != orientation) {
            childDimensions[CHILD_WIDTH] = 0;
            childDimensions[CHILD_HEIGHT] = 0;
        }
    }
    super.setOrientation(orientation);
}

public void clearChildSize() {
    hasChildSize = false;
    setChildSize(DEFAULT_CHILD_SIZE);
}

public void setChildSize(int childSize) {
    hasChildSize = true;
    if (this.childSize != childSize) {
        this.childSize = childSize;
        requestLayout();
    }
}

private void measureChild(RecyclerView.Recycler recycler, int position, int widthSize, int heightSize, int[] dimensions) {
    final View child;
    try {
        child = recycler.getViewForPosition(position);
    } catch (IndexOutOfBoundsException e) {
        if (BuildConfig.DEBUG) {
            Log.w("MyLinearLayoutManager", "MyLinearLayoutManager doesn't work well with animations. Consider switching them off", e);
        }
        return;
    }

    final RecyclerView.LayoutParams p = (RecyclerView.LayoutParams) child.getLayoutParams();

    final int hPadding = getPaddingLeft() + getPaddingRight();
    final int vPadding = getPaddingTop() + getPaddingBottom();

    final int hMargin = p.leftMargin + p.rightMargin;
    final int vMargin = p.topMargin + p.bottomMargin;

    // we must make insets dirty in order calculateItemDecorationsForChild to work
    makeInsetsDirty(p);
    // this method should be called before any getXxxDecorationXxx() methods
    calculateItemDecorationsForChild(child, tmpRect);

    final int hDecoration = getRightDecorationWidth(child) + getLeftDecorationWidth(child);
    final int vDecoration = getTopDecorationHeight(child) + getBottomDecorationHeight(child);

    final int childWidthSpec = getChildMeasureSpec(widthSize, hPadding + hMargin + hDecoration, p.width, canScrollHorizontally());
    final int childHeightSpec = getChildMeasureSpec(heightSize, vPadding + vMargin + vDecoration, p.height, canScrollVertically());

    child.measure(childWidthSpec, childHeightSpec);

    dimensions[CHILD_WIDTH] = getDecoratedMeasuredWidth(child) + p.leftMargin + p.rightMargin;
    dimensions[CHILD_HEIGHT] = getDecoratedMeasuredHeight(child) + p.bottomMargin + p.topMargin;

    // as view is recycled let's not keep old measured values
    makeInsetsDirty(p);
    recycler.recycleView(child);
}

private static void makeInsetsDirty(RecyclerView.LayoutParams p) {
    if (!canMakeInsetsDirty) {
        return;
    }
    try {
        if (insetsDirtyField == null) {
            insetsDirtyField = RecyclerView.LayoutParams.class.getDeclaredField("mInsetsDirty");
            insetsDirtyField.setAccessible(true);
        }
        insetsDirtyField.set(p, true);
    } catch (NoSuchFieldException e) {
        onMakeInsertDirtyFailed();
    } catch (IllegalAccessException e) {
        onMakeInsertDirtyFailed();
    }
}

private static void onMakeInsertDirtyFailed() {
    canMakeInsetsDirty = false;
    if (BuildConfig.DEBUG) {
        Log.w("MyLinearLayoutManager", "Can't make LayoutParams insets dirty, decorations measurements might be incorrect");
    }
}
}

যখন আমরা ডেটাটি অ্যাডাপ্টারে সেট করি তখন কীভাবে আমি এই ক্লাসটি কল করতে পারি?
মিলন গাজেরা

11

এটা চেষ্টা কর. খুব দেরিতে উত্তর। তবে অবশ্যই ভবিষ্যতে কাউকে সাহায্য করুন।

আপনার স্ক্রোলভিউ নেস্টডস্ক্রোলভিউতে সেট করুন

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

আপনার পুনর্ব্যবহারযোগ্য দর্শন

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

8
নেস্টেডস্ক্রোলভিউয়ের অভ্যন্তরে রিসাইক্লারভিউ ব্যবহার করে তালিকার প্রতিটি আইটেমটি দৃশ্যমান না থাকলেও অনবিন্দ ভিউ কল করছে। এই সমস্যার কোন সমাধান?
thedarkp যাত্রী

8

আপডেট: এই উত্তরটি এখনই শেষ হয়ে গেছে কারণ নেস্টডস্ক্রোলভিউ এবং রিসাইক্লারভিউয়ের মতো উইজেট রয়েছে যা নেস্টেড স্ক্রোলিং সমর্থন করে।

আপনার অন্য কোনও স্ক্রোলযোগ্য ভিউয়ের ভিতরে কোনও স্ক্রোলযোগ্য ভিউ রাখা উচিত নয়!

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

এই উদাহরণটি একবার দেখুন, এটি পুনর্বিবেচক ভিউ অ্যাডাপ্টারের অভ্যন্তরে কীভাবে একাধিক ভিউ ব্যবহার করবেন তা দেখায়। উদাহরণ লিঙ্ক


আমার একাধিক রিসাইক্লারের সাথে একটি পৃষ্ঠা রয়েছে , এটি বোঝানোর কোনও উপায় আছে কি? মত কিছু জিনিস Instagram বা Google Play অংশ মন্তব্য করুন আরো লোড রেকর্ড যখন আপনি ক্লিক আরোও নতুন মন্তব্য
Ashkan

এটিকে একটি একক পুনর্ব্যবহারযোগ্য ভিউ করুন এবং সেই পুনর্ব্যবহারকারী
ইসি 84 বি 4 এর

6
এটাই বাজে কথা। আপনি ঠিক জরিমানা পুনর্ব্যবহারযোগ্য ভিউ করতে পারেন।
ইগোরগানাপলস্কি

এই উত্তরটি এখন পুরানো। আমাদের কাছে নেস্টডস্ক্রোলভিউয়ের মতো জিনিস রয়েছে যা নেস্টেড স্ক্রোলযোগ্য দর্শনগুলির জন্য মঞ্জুরি দেয়। নেস্টেড রিসাইক্লারভিউগুলিও এখন কাজ করে।
কোরি হর্ন

7

আপনি যদি RecyclerViewভিতরে রেখে NestedScrollViewএবং সক্ষম করেন তবে recyclerView.setNestedScrollingEnabled(false);স্ক্রোলিং ভাল কাজ করবে
তবে সমস্যা আছে

RecyclerView রিসাইকেল করবেন না

উদাহরণস্বরূপ, আপনার RecyclerView(ভিতরে NestedScrollViewবা ScrollView) 100 টি আইটেম রয়েছে।
যখন Activityলঞ্চ হবে, 100 আইটেম তৈরি হবে ( onCreateViewHolderএবং onBindViewHolder100 টি আইটেম একই সাথে ডাকা হবে)।
উদাহরণস্বরূপ, প্রতিটি আইটেমের জন্য, আপনি এপিআই => তৈরি করা ক্রিয়াকলাপ থেকে একটি বড় চিত্র লোড করবেন -> 100 টি চিত্র লোড হবে।
এটি ক্রিয়াকলাপে অস্তিত্ব এবং পিছিয়ে থাকা শুরু করে।
সম্ভাব্য সমাধান :
- RecyclerViewএকাধিক প্রকারের সাথে ব্যবহারের বিষয়ে চিন্তাভাবনা ।

যাইহোক, যদি আপনার ক্ষেত্রে, কেবল কয়েকটি আইটেম রয়েছে RecyclerViewএবং পুনর্ব্যবহার করা বা পুনর্ব্যবহার না করা পারফরম্যান্সকে খুব বেশি প্রভাবিত করে না, আপনি RecyclerViewভিতরে ব্যবহার করতে পারেনScrollView সহজ জন্য


স্কলভিউয়ের অভ্যন্তরে কীভাবে আমি পুনর্ব্যবহারযোগ্য পুনর্ব্যবহার করতে পারি তা দেখান? ধন্যবাদ!
মিথ্যাবাদী

2
@ লাইয়ার, বর্তমানে এটি চালানোর RecyclerViewপরে পুনর্ব্যবহার করার কোনও উপায় নেই ScrollView। আপনি যদি পুনর্ব্যবহার করতে চান তবে অন্য পদ্ধতির কথা চিন্তা করে (যেমন একাধিক ধরণের রিসাইক্লারভিউ ব্যবহার করা)
ফান ভ্যান লিনহ

4

আপনি এইভাবে ব্যবহার করতে পারেন:

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

        android:nestedScrollingEnabled="false"

এটি ব্যবহার করে দেখুন, রিসাইক্লারভিউটি নমনীয় উচ্চতার সাথে সহজেই স্ক্রোল করা হবে

আশা করি এটি সাহায্য করেছিল


2

এটি NestedScrollViewসমস্যার সমাধান করে বলে মনে হচ্ছে । আমি এই লেআউটটি ব্যবহার করে পরীক্ষা করেছি:

<android.support.v4.widget.NestedScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
>

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

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/dummy_text"
        />

    <android.support.v7.widget.CardView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="16dp"
        android:layout_marginRight="16dp"
        >
        <android.support.v7.widget.RecyclerView
            android:id="@+id/recycler_view"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>

    </android.support.v7.widget.CardView>

</LinearLayout>

এবং এটি সমস্যা ছাড়াই কাজ করে


ব্রো, স্ক্রোলভিউ থেকে নেস্টেডস্ক্রোলভিউতে পরিবর্তিত হওয়ার পরেও একই সমস্যা রয়েছে।
মোহনরাজ এস

মিমি ... আপনি কিছু কোড শেয়ার করতে পারেন ... আমার শূন্য সমস্যা রয়েছে তবে আপনি এই ধরণের সমস্যা নিয়ে কখনই জানতে পারবেন না
রোয়বি

আমি কীভাবে ইমেল বা স্ট্যাক ওভারফ্লো মাধ্যমে আমার কোড ভাগ করতে পারি
মোহনরাজ এস

2
এই কোডটি ব্যবহার করে তালিকার সমস্ত আইটেমের জন্য অনবিন্দ ভিউকে কল করে এমনকি যদি সেই আইটেমগুলি তালিকায় দৃশ্যমান না হয়। এটি পুনর্ব্যবহারের উদ্দেশ্যটিকে পরাস্ত করে।
thedarkp যাত্রী

2

আমি রিসাইক্লারভিউ স্ক্রোলিং অক্ষম করতে কাস্টমলআউটআউট ম্যানেজার ব্যবহার করেছি। এছাড়াও রিপ্যাক্টেন্ট হিসাবে পুনর্ব্যবহারযোগ্য ভিউ ব্যবহার করবেন না, 0 ডিপি, ওজন = 1 হিসাবে ব্যবহার করুন

public class CustomLayoutManager extends LinearLayoutManager {
    private boolean isScrollEnabled;

    // orientation should be LinearLayoutManager.VERTICAL or HORIZONTAL
    public CustomLayoutManager(Context context, int orientation, boolean isScrollEnabled) {
        super(context, orientation, false);
        this.isScrollEnabled = isScrollEnabled;
    }

    @Override
    public boolean canScrollVertically() {
        //Similarly you can customize "canScrollHorizontally()" for managing horizontal scroll
        return isScrollEnabled && super.canScrollVertically();
    }
}

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

CustomLayoutManager mLayoutManager = new CustomLayoutManager(getBaseActivity(), CustomLayoutManager.VERTICAL, false);
        recyclerView.setLayoutManager(mLayoutManager);
        ((DefaultItemAnimator) recyclerView.getItemAnimator()).setSupportsChangeAnimations(false); 
        recyclerView.setAdapter(statsAdapter);

ইউআই এক্সএমএল:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/background_main"
    android:fillViewport="false">


    <LinearLayout
        android:id="@+id/contParentLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

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

            <edu.aku.family_hifazat.libraries.mpchart.charts.PieChart
                android:id="@+id/chart1"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="@dimen/x20dp"
                android:minHeight="@dimen/x300dp">

            </edu.aku.family_hifazat.libraries.mpchart.charts.PieChart>


        </FrameLayout>

        <android.support.v7.widget.RecyclerView
            android:id="@+id/recyclerView"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1">


        </android.support.v7.widget.RecyclerView>


    </LinearLayout>


</ScrollView>

2

আমি একই সমস্যা ছিল। এটাই আমি চেষ্টা করেছি এবং এটি কাজ করে। আমি আমার এক্সএমএল এবং জাভা কোড ভাগ করে নিচ্ছি। আশা করি এটি কারও সাহায্য করবে।

এখানে এক্সএমএল

<?xml version="1.0" encoding="utf-8"?>

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

        <ImageView
            android:id="@+id/iv_thumbnail"
            android:layout_width="match_parent"
            android:layout_height="200dp" />

        <TextView
            android:id="@+id/tv_description"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Description" />

        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Buy" />

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Reviews" />
        <android.support.v7.widget.RecyclerView
            android:id="@+id/rc_reviews"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

        </android.support.v7.widget.RecyclerView>

    </LinearLayout>
</NestedScrollView >

সম্পর্কিত জাভা কোড এখানে। ইহা যাদুর মত কাজ করে।

LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
recyclerView.setLayoutManager(linearLayoutManager);
recyclerView.setNestedScrollingEnabled(false);

রিসাইক্লিউউয়ের নীচে লেআউটগুলির কী হবে?
তপা সেভ

যে পাশাপাশি কাজ করে। আপনার শুধু ব্যবহার করা দরকার। NestedScrollViewস্ক্রোল দেখার পরিবর্তে
জিশান শাব্বির

হ্যাঁ, কেবল নেস্টডস্ক্রোলভিউ। তবে নেস্টেডস্ক্রোলভিউ + রিসাইকেলভিউ সহ সমাধানটি রিসাইক্লিউউয়ের খুব ধীরে ধীরে জনসংখ্যা কল করে (আমি রিসাইক্লিউউয়ের পরে প্রথম দৃশ্যের ওয়াই-পজিশনের গণনার জন্য ভাবি)
তপা সেভ


0

আসলে মূল উদ্দেশ্য RecyclerViewজন্য ক্ষতিপূরণ হয় ListViewএবং ScrollView। পরিবর্তে করছেন আপনি আসলে কি করছেন: একটি হচ্ছে RecyclerViewএকটি ScrollView, আমি শুধুমাত্র একটি হচ্ছে সুপারিশ করবে RecyclerViewশিশুরা অনেক ধরনের ব্যবস্থা করতে সক্ষম।


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


রিসাইক্লার ভিউ তালিকাভুক্তির পরিবর্তে এটি স্ক্রোলভিউ প্রতিস্থাপনের উদ্দেশ্যে নয়।
সাইক্রোক্সিস

এই মন্তব্য আরও ভাল প্রাপ্য। এটি একটি সমাধান, এবং গ্রহণীকৃতটির চেয়ে আরও ভাল।
কাই ওয়াং

0

প্রথমে আপনার NestedScrollViewপরিবর্তে ব্যবহার করা উচিত ScrollViewএবং RecyclerViewভিতরে put োকানো উচিত NestedScrollView

পর্দার উচ্চতা এবং প্রস্থ পরিমাপ করতে কাস্টম লেআউট শ্রেণি ব্যবহার করুন:

public class CustomLinearLayoutManager extends LinearLayoutManager {

public CustomLinearLayoutManager(Context context, int orientation, boolean reverseLayout) {
    super(context, orientation, reverseLayout);
}

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

@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(i, View.MeasureSpec.UNSPECIFIED),
                    heightSpec,
                    mMeasuredDimension);

            width = width + mMeasuredDimension[0];
            if (i == 0) {
                height = mMeasuredDimension[1];
            }
        } else {
            measureScrapChild(recycler, i,
                    widthSpec,
                    View.MeasureSpec.makeMeasureSpec(i, 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);
    recycler.bindViewToPosition(view, position);
    if (view != null) {
        RecyclerView.LayoutParams p = (RecyclerView.LayoutParams) view.getLayoutParams();
        int childWidthSpec = ViewGroup.getChildMeasureSpec(widthSpec,
                getPaddingLeft() + getPaddingRight(), p.width);
        int childHeightSpec = ViewGroup.getChildMeasureSpec(heightSpec,
                getPaddingTop() + getPaddingBottom(), p.height);
        view.measure(childWidthSpec, childHeightSpec);
        measuredDimension[0] = view.getMeasuredWidth() + p.leftMargin + p.rightMargin;
        measuredDimension[1] = view.getMeasuredHeight() + p.bottomMargin + p.topMargin;
        recycler.recycleView(view);
    }
}
}

এবং এর ক্রিয়াকলাপ / খণ্ডে কোডের নীচে প্রয়োগ করুন RecyclerView:

 final CustomLinearLayoutManager layoutManager = new CustomLinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);

    recyclerView.setLayoutManager(layoutManager);
    recyclerView.setAdapter(mAdapter);

    recyclerView.setNestedScrollingEnabled(false); // Disables scrolling for RecyclerView, CustomLinearLayoutManager used instead of MyLinearLayoutManager
    recyclerView.setHasFixedSize(false);

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

            int visibleItemCount = layoutManager.getChildCount();
            int totalItemCount = layoutManager.getItemCount();
            int lastVisibleItemPos = layoutManager.findLastVisibleItemPosition();
            Log.i("getChildCount", String.valueOf(visibleItemCount));
            Log.i("getItemCount", String.valueOf(totalItemCount));
            Log.i("lastVisibleItemPos", String.valueOf(lastVisibleItemPos));
            if ((visibleItemCount + lastVisibleItemPos) >= totalItemCount) {
                Log.i("LOG", "Last Item Reached!");
            }
        }
    });

0

যদি রিসাইকেলারভিউ স্ক্রোলভিউয়ের মধ্যে কেবল একটি সারি দেখায়। আপনাকে কেবল আপনার সারিটির উচ্চতা নির্ধারণ করতে হবে android:layout_height="wrap_content"


0

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

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

0

পার্টিতে দেরি হয়ে যাওয়ার জন্য দুঃখিত, তবে মনে হচ্ছে এটির মতো আরও একটি সমাধান রয়েছে যা আপনি উল্লিখিত মামলার জন্য নিখুঁতভাবে কাজ করে।

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


0

সমস্যাটি সমাধান করার জন্য আরেকটি পদ্ধতি হ'ল ConstraintLayoutভিতরে ব্যবহার করা ScrollView:

<ScrollView>
  <ConstraintLayout> (this is the only child of ScrollView)
    <...Some Views...>
    <RecyclerView> (layout_height=wrap_content)
    <...Some Other Views...>

তবে আমি এখনও androidx.core.widget.NestedScrollView ইয়াং পিয়ংয়ের প্রস্তাবিত পদ্ধতির সাথে লেগে থাকব


-2

** সমাধান যা আমার পক্ষে কাজ করেছে
নেস্টেডস্ক্রোলভিউকে উচ্চতা সহ মোড়ানো_ কনটেন্ট হিসাবে ব্যবহার করুন

<br> RecyclerView 
                android:layout_width="match_parent"<br>
                android:layout_height="wrap_content"<br>
                android:nestedScrollingEnabled="false"<br>
                  app:layoutManager="android.support.v7.widget.LinearLayoutManager"
                tools:targetApi="lollipop"<br><br> and view holder layout 
 <br> android:layout_width="match_parent"<br>
        android:layout_height="wrap_content"

// আপনার সারির বিষয়বস্তু এখানে যায়


অনুরূপ উত্তরের কয়েকটি মন্তব্য বলছে নেস্টেড স্ক্রোলিং অক্ষম করা একটি পুনর্ব্যবহারযোগ্য ভিউ ব্যবহারের উদ্দেশ্যকে পরাস্ত করে, অর্থাত্ এটি দর্শন পুনর্ব্যবহার করবে না। কীভাবে এটি নিশ্চিত করবেন তা নিশ্চিত নন।
jk7

1
নেস্টডস্ক্রোলিংএনেবলড = "মিথ্যা" সেট করার ফলে রিসাইক্লার ভিউ কমপক্ষে আমার সেটআপে (নেস্টডস্ক্রোলভিউয়ের মধ্যে একটি পুনর্ব্যবহারযোগ্য) এর দৃষ্টিভঙ্গিগুলি পুনর্ব্যবহার করতে পারে না। পুনর্ব্যবহারযোগ্য ভিউতে একটি রিসাইক্লারলিস্টনার যুক্ত করে এবং এর অনভিউরেসাইক্ল্ড () পদ্ধতির অভ্যন্তরে একটি ব্রেকপয়েন্ট স্থাপন করে নিশ্চিত করা হয়েছে।
jk7
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.