পুনর্ব্যবহারযোগ্য স্ক্রোলিং কীভাবে অক্ষম করবেন?


221

আমি স্ক্রোলিং অক্ষম করতে পারি না RecyclerView। আমি কল করার চেষ্টা করেছি rv.setEnabled(false)কিন্তু আমি এখনও স্ক্রোল করতে পারি।

আমি কীভাবে স্ক্রোলিং অক্ষম করতে পারি?


1
আপনি RecyclerViewযদি স্ক্রলিং না চান তবে ব্যবহার করার কী লাভ ?
কমন্সওয়ের

16
@ কমন্সওয়্যার, উদাহরণস্বরূপ, আমি যখন এটির একটি সন্তানের সাথে একটি কাস্টম অ্যানিমেশন করছি তখন আমি কেবল এটি অস্থায়ীভাবে অক্ষম করতে চাই।
জ্লসোল্ট সাফরানি

1
আহ, ঠিক আছে, এটা বোঝা যায়। আমি সম্ভবত Viewউপরে একটি স্বচ্ছ RecyclerViewলাগিয়েছি, মধ্যে টগলিং VISIBLEএবং GONEপ্রয়োজন হিসাবে, কিন্তু আপনার উপায় যুক্তিযুক্ত মনে হয়।
কমন্সওয়্যার

আশা করি এই সাহায্য করে ভাল সমাধান খুঁজে।
সাইতাজা পারসি

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

উত্তর:


368

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

মূল:

 public class CustomGridLayoutManager extends LinearLayoutManager {
 private boolean isScrollEnabled = true;

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

 public void setScrollEnabled(boolean flag) {
  this.isScrollEnabled = flag;
 }

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

এখানে "iscrolEnabled" পতাকাটি ব্যবহার করে আপনি সাময়িকভাবে আপনার পুনর্ব্যবহারযোগ্য-দৃশ্যটির স্ক্রোলিং কার্যকারিতা সক্ষম / অক্ষম করতে পারবেন।

এছাড়াও:

স্ক্রোলিং অক্ষম করতে এবং ক্লিক করার অনুমতি দেওয়ার জন্য সহজ আপনার বিদ্যমান প্রয়োগাকে ওভাররাইড করে।

 linearLayoutManager = new LinearLayoutManager(context) {
 @Override
 public boolean canScrollVertically() {
  return false;
 }
};

2
এটি সঠিক উত্তর হওয়া উচিত কারণ এটি আমাকে ক্লিক করার অনুমতি দেওয়ার সময় স্ক্রোলিং অক্ষম করে।
জ্যারেড বুরোজ

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

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

2
এটি মসৃণস্ক্রোলটিপোজিওটি অক্ষম করে
ম্লাদেন রাকনজাক

4
আপনি কোটলিন সংস্করণ অবজেক্টটি যুক্ত করুন: লিনিয়ারলআউটম্যানেজার (এটি) can মজাদার ক্যানস্ক্রোলভারটিকালি (): বুলিয়ান false মিথ্যা ফিরবে}}
amorenew

149

আসল উত্তরটি হ'ল

recyclerView.setNestedScrollingEnabled(false);

ডকুমেন্টেশন আরও তথ্য


39
এটি কেবল নেস্টেড স্ক্রোলিং অক্ষম করবে, সমস্ত স্ক্রোলিং নয়। বিশেষত, যদি আপনার রিসাইক্লারভিউ কোনও স্ক্রোলভিউতে থাকে তবে স্ক্রিনটি পূরণ না করে তবে স্ক্রোলভিউ স্ক্রল করবে না (সামগ্রী স্ক্রিনে ফিট করে) এবং আপনি আপনার পুনর্ব্যবহারযোগ্য ভিউতে স্ক্রোল UI পাবেন (উদাহরণস্বরূপ স্ক্রোল করার চেষ্টা করার পরে তালিকার প্রভাবের শেষ) ) যদিও এটি বড় হয়ে গেলে স্ক্রোল করবে না। লেআউট ম্যানেজারটি প্রসারিত করা সত্যিই কাজটি করে।
personne3000

3
@ personne3000 আমি বিশ্বাস করি রিসাইক্লারভিউ.সেটহ্যাসফিক্সডসাইজ (সত্য) এর জন্য কাজ করে। সম্পাদনা: সেট সেটফিলভিউপোর্ট (সত্য) এর সাথেও আমি এটি কনজাকশনটিতে ব্যবহার করি যাতে দুটির মধ্যে কোনটি এটির স্থির করে তা আমি আসলে নিশ্চিত নই।
এমড্রয়েড

5
এটি আমার জন্য কাজ করে জরিমানা, কিন্তু আমার "RecyclerView", তাই আমি "NestedScrollView" দ্বারা "ScrollView" পরিবর্তন করতে হয়েছিল, যেমন এখানে বর্ণিত একটি টুকরা ভিতরে "ScrollView" ব্যবহার বিন্যাস ছিল: stackoverflow.com/a/38088902/618464
educoutinho

1
জন্য পূর্ণ বর্গ নাম ব্যবহার করতে মনে রাখুন NestedScrollView: android.support.v4.widget.NestedScrollView: যেমন এখানে বর্ণিত, chessdork দ্বারা, stackoverflow.com/questions/37846245/...
gustavoknz

4 ঘন্টা ব্যয় করার পরে কী কী ভুল তা বের করার চেষ্টা করার পরে এটি আমার সমস্যার সমাধান করেছে। আমার ক্ষেত্রে আমি মোশনলআউটটির অভ্যন্তরে একটি পুনর্ব্যবহারযোগ্য ব্যবহার করছি। এবং আমি কেবল গতি যুক্ত করে টেনে আনার জন্য একটি সোয়াইপ অঞ্চল যুক্ত করেছি: টাচএঞ্চরআইডি = "@ আইডি / সোয়াইপ_আর্যা"। এটি সাধারণত কাজ করে তবে পুনর্ব্যবহারযোগ্য দর্শনগুলির ফাঁকা জায়গাগুলি স্পর্শ করলে ট্রিগারও করে। অন্যান্য সোয়াইপ উপাদানগুলির সাথে মোশনলআউট ব্যবহার করার সময় সাবধান হন।
ও কুমারু

73

রিয়েল বাস্তব উত্তরটি: 21 এপিআই এবং তার চেয়ে বেশি এর জন্য:

কোনও জাভা কোডের প্রয়োজন নেই। আপনি android:nestedScrollingEnabled="false" এক্সএমএলে সেট করতে পারেন :

<android.support.v7.widget.RecyclerView
     android:id="@+id/recycler"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:clipToPadding="true"
     android:nestedScrollingEnabled="false"
     tools:listitem="@layout/adapter_favorite_place">

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

21 এর নীচে থাকা এপিআইয়ের জন্য কী ??
মওদাদ আবদেলঘাফুর আইটালি

নীচের API গুলির জন্য আপনি যে পিকটি ব্যবহার করতে পারেন তা ব্যবহার করুন: রিসাইক্লারভিউ.সেটনেষ্টস্ট্রোলিংএনবলড (মিথ্যা);
মিলাদ ফরিদনিয়া

1
আমার জন্য গৃহীত উত্তর।
ফার্নান্দো টরেস

1
এটি সেরা এবং সর্বাধিক সরল উত্তর, যা অপ্রয়োজনীয় কোড দূষণ এবং অন্তহীন শ্রেণীর প্রসারিত নিদর্শনগুলি এড়িয়ে চলে।
রাফেল সি

52

এটি কিছুটা কাজ করে তবে এটি কাজ করে; আপনি স্ক্রোলিং সক্ষম / অক্ষম করতে পারেন RecyclerView

এটি RecyclerView.OnItemTouchListenerপ্রতিটি স্পর্শ ইভেন্টকে খালি চুরি করে লক্ষ্যটি অক্ষম করে RecyclerView

public class RecyclerViewDisabler implements RecyclerView.OnItemTouchListener {

    @Override
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
        return true;
    }

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

    }

    @Override
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

    }
}

এটি ব্যবহার করছি:

RecyclerView rv = ...
RecyclerView.OnItemTouchListener disabler = new RecyclerViewDisabler();

rv.addOnItemTouchListener(disabler);        // disables scolling
// do stuff while scrolling is disabled
rv.removeOnItemTouchListener(disabler);     // scrolling is enabled again 

8
এটি কি আইটেম ক্লিক করা নিষ্ক্রিয় করে?
জহির ফিকুইটিভা

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

1
এটি পিতামাতার দৃশ্যের স্ক্রোলটিও অক্ষম করে
জেমশিত ইস্কেনডেরভ

এই আইটেম ক্লিক এছাড়াও নিষ্ক্রিয়
মুহাম্মদ রিয়াজ

1
যখন কোনও পরিষ্কার সমাধান থাকে তখন কেন হ্যাকিশ ওয়ার্কআরাউন্ড ব্যবহার করুন (পার্শ্ব প্রতিক্রিয়া সহ)? স্রেফ লেআউট ম্যানেজারটিকে ওভাররাইড করুন (অন্যান্য উত্তর দেখুন)
personne3000

37

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

  recyclerView.setOnTouchListener(new View.OnTouchListener() {
      @Override
      public boolean onTouch(View v, MotionEvent event) {
          return true;
      }
  });

11
এটি সমস্ত স্পর্শ অক্ষম করে।
জ্যারেড বুরোজ

1
দুর্দান্ত কৌশল! পুনরায় সক্ষম করতে, মিথ্যা ফেরত পেতে কেবলমাত্র টুচলিস্টনারের টিচটি পুনরায় সেট করুন
হেন্দ্রডাব্লুডি

আহ, তবে একটি সতর্কতা রয়েছেCustom view 'RecyclerView' has setOnTouchListener called on it but does not override performClick
হেন্ডেনডাব্লুডি

: আপনি একই সাবধানবাণী যে @HendraWD মন্তব্যে উল্লেখ গ্রহন করে থাকেন উপরে তারপর এই প্রশ্ন উত্তর কটাক্ষপাত করা stackoverflow.com/questions/46135249/...
নিকোলাস কারাস্কো

1
সত্য প্রত্যাবর্তনের পরিবর্তে এবং তাই সমস্ত ধরণের স্পর্শ ইভেন্টগুলি অক্ষম করার return e.getAction() == MotionEvent.ACTION_MOVE;পরিবর্তে return true;কেবলমাত্র স্ক্রোল / সোয়াইপ ইভেন্টগুলি বাতিল হয়ে যায়।
টাফিক বাতাচে

15

আপনি আপনার পুনর্ব্যবহারযোগ্য ভিউ জমা করে স্ক্রোলিং অক্ষম করতে পারেন।

হিমায়িত করতে: recyclerView.setLayoutFrozen(true)

জমাট বাঁধতে: recyclerView.setLayoutFrozen(false)


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

1
এপিআই 28
অবহিত হয়েছে

13

রিসাইক্লার ভিউ ক্লাস প্রসারিত ক্লাস তৈরি করুন

public class NonScrollRecyclerView extends RecyclerView {

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

    public NonScrollRecyclerView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public NonScrollRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int heightMeasureSpec_custom = MeasureSpec.makeMeasureSpec(
                Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, heightMeasureSpec_custom);
        ViewGroup.LayoutParams params = getLayoutParams();
        params.height = getMeasuredHeight();
    }
}

এটি স্ক্রোল ইভেন্টটি অক্ষম করবে, তবে ক্লিক ইভেন্টগুলি নয়

আপনার এক্সএমএলে এটি ব্যবহার করুন:

  <com.yourpackage.xyx.NonScrollRecyclerView 
     ...
     ... 
  />

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

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

@ রাহুল রাস্তোগি স্ক্রোলভিউয়ের পরিবর্তে নেস্টেডস্ক্রোলভিউ ব্যবহার করুন
আশীষ

আরে @ আশিষমঙ্গাভে, দয়া করে কীভাবে এটি পুনরায় প্রোগ্রামিয়ালি সক্ষম করবেন তা বলুন
শ্রুতি

@ শ্রুতি আমরা প্রগ্রেটিকভাবে এটি করতে পারি না। বিসিজেড আমরা রিসাইক্লারভিউ'র সরাসরি পরিমাপ পদ্ধতিতে ওভাররাইড করি ideআপনি এই পুনর্ব্যবহারকারী ভিউ.সেট নেস্টডক্রোলিংএনব্লিট (ভুয়া) জন্য চেষ্টা করতে পারেন .এটি আপনাকে সহায়তা করবে
আশীষ

11

আপনি শুধু অক্ষম করলে শুধুমাত্র স্ক্রল কার্যকারিতা এর RecyclerViewতারপর আপনি ব্যবহার করতে পারেন setLayoutFrozen(true);পদ্ধতি RecyclerView। তবে এটি স্পর্শ ইভেন্ট অক্ষম হতে পারে না।

your_recyclerView.setLayoutFrozen(true);

এই পদ্ধতি হ্রাস করা হয়। আপনি অন্য একটি পরামর্শ দিতে পারেন?
আইয়াজ পারমার

এপিআই 28
অবহিত হয়েছে

9
recyclerView.addOnItemTouchListener(new RecyclerView.SimpleOnItemTouchListener() {
        @Override
        public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
            // Stop only scrolling.
            return rv.getScrollState() == RecyclerView.SCROLL_STATE_DRAGGING;
        }
    });


স্পর্শ করা হলে স্মুথস্ক্রোলটোপজিশন () এর স্ক্রোলিং বাতিল করে।
ypresto

এটি আমার পক্ষে সেরা সমাধান কারণ এটি প্রোগ্রামক্রমে স্ক্রোলিংয়ের অনুমতি দেয় তবে ব্যবহারকারী স্ক্রোলিং এড়ানো হয়।
মিগুয়েল সেসমা

7

একটি বাস্তব সহজ উত্তর আছে।

LinearLayoutManager lm = new LinearLayoutManager(getContext()) {
                @Override
                public boolean canScrollVertically() {
                    return false;
                }
            };

উপরের কোডটি রিসাইক্লারভিউ উল্লম্বভাবে স্ক্রোলিং অক্ষম করে।



6

একটি কোটলিন সংস্করণ লিখেছিলেন:

class NoScrollLinearLayoutManager(context: Context?) : LinearLayoutManager(context) {
    private var scrollable = true

    fun enableScrolling() {
        scrollable = true
    }

    fun disableScrolling() {
        scrollable = false
    }

    override fun canScrollVertically() =
            super.canScrollVertically() && scrollable


    override fun canScrollHorizontally() =
            super.canScrollVertically()

 && scrollable
}

ব্যবহার:

recyclerView.layoutManager = NoScrollLinearLayoutManager(context)
(recyclerView.layoutManager as NoScrollLinearLayoutManager).disableScrolling()

5

প্রসারিত করুন LayoutManagerএবং ওভাররাইড করুন canScrollHorizontally()এবং canScrollVertically()স্ক্রোলিং অক্ষম করুন।

সচেতন থাকুন যে শুরুতে আইটেমগুলি সন্নিবেশ করানো স্বয়ংক্রিয়ভাবে শুরুতে ফিরে স্ক্রোল করবে না, এ জাতীয় কিছু করার জন্য এটি পেতে:

  private void clampRecyclerViewScroll(final RecyclerView recyclerView)
  {
    recyclerView.getAdapter().registerAdapterDataObserver(new RecyclerView.AdapterDataObserver()
    {
      @Override
      public void onItemRangeInserted(int positionStart, int itemCount)
      {
        super.onItemRangeInserted(positionStart, itemCount);
        // maintain scroll position at top
        if (positionStart == 0)
        {
          RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
          if (layoutManager instanceof GridLayoutManager)
          {
            ((GridLayoutManager) layoutManager).scrollToPositionWithOffset(0, 0);
          }else if(layoutManager instanceof LinearLayoutManager)
          {
            ((LinearLayoutManager) layoutManager).scrollToPositionWithOffset(0, 0);
          }
        }
      }
    });
  }

1
এটি মসৃণস্ক্রোলটিপোজিওটি অক্ষম করে
ম্লাদেন রাকনজাক

5

আমি জানি এটি ইতিমধ্যে একটি স্বীকৃত উত্তর আছে, তবে সমাধানটি আমি যে ব্যবহার-সংক্রান্ত ব্যবহারের মুখোমুখি হয়েছি তা বিবেচনায় নেয় না।

আমার বিশেষত এমন একটি শিরোনাম আইটেমের দরকার ছিল যা এখনও ক্লিকযোগ্য, তবুও পুনর্ব্যবহারযোগ্যের স্ক্রোলিং প্রক্রিয়াটি অক্ষম করে। এটি নিম্নলিখিত কোড দ্বারা সম্পন্ন করা যেতে পারে:

recyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
                            @Override
     public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
         return e.getAction() == MotionEvent.ACTION_MOVE;
     }

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

     }

     @Override
     public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

    }
});

কোনও কারণে, আপনাকে এই কাজটি না করা ছাড়া ঠিক ঠিক ক্লিক করতে হবে।
জ্যারেড বুরোজ

ভাল পয়েন্ট, @ জারেডবুরোস। এটি কারণ আমরা ACTION_MOVE অবজ্ঞা করছি reg স্পর্শটিকে প্রাকৃতিক বোধ করার জন্য, কিছুটা স্পর্শ করার এবং স্ক্রিনের সামান্য চলনের মধ্যে রয়েছে। দুর্ভাগ্যক্রমে, আমি সেই সমস্যার সমাধান করতে পারিনি।
রায়ান সাইমন

ধন্যবাদ, ঠিক আমার যা দরকার ছিল!
ছাত্র

5

setLayoutFrozenঅবজ্ঞাত হিসাবে , আপনি ব্যবহার করে আপনার পুনর্ব্যবহারযোগ্য ভিউ জমা করে স্ক্রোলিং অক্ষম করতে পারেন suppressLayout

হিমায়িত করতে:

recyclerView.suppressLayout(true)

জমাট বাঁধতে:

recyclerView.suppressLayout(false)

4

এক্সএমএলে: -

আপনি যোগ করতে পারেন

android:nestedScrollingEnabled="false"

চাইল্ড রিসাইকেলারভিউ লেআউট এক্সএমএল ফাইলটিতে in

অথবা

জাভাতে: -

childRecyclerView.setNestedScrollingEnabled(false);

আপনার জাভা কোডে রিসাইক্লারভিউতে।

ভিউকম্প্যাট (জাভা) ব্যবহার করে: -

childRecyclerView.setNestedScrollingEnabled(false);কেবলমাত্র android_version> 21 ডিভাইসে কাজ করবে । সমস্ত ডিভাইসে কাজ করতে নিম্নলিখিতটি ব্যবহার করুন

ViewCompat.setNestedScrollingEnabled(childRecyclerView, false);


অসাধারণ, সমস্ত এপিস আচ্ছাদিত, চালিত করা উচিত।
রিচার্ড

3

কিছু কারণে @ আলেজান্দ্রো গ্র্যাসিয়া উত্তরটি কেবল কয়েক সেকেন্ড পরে কাজ শুরু করে। আমি এমন একটি সমাধান পেয়েছি যা তাত্ক্ষণিকভাবে রিসাইক্লারভিউকে বাধা দেয়:

recyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
            @Override
            public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
                return true;
            }
            @Override
            public void onTouchEvent(RecyclerView rv, MotionEvent e) {
            }
            @Override
            public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
            }
        });

3

OnTouchEvent () এবং onIntercepTouchEvent () ওভাররাইড করুন এবং যদি আপনার যদি অনআইটেমটিউচলিস্টেনারের কোনও প্রয়োজন না হয় তবে মিথ্যা প্রত্যাখ্যান করুন। এটি ভিউহোল্ডারগুলির অনক্লিকলিস্টনারদের অক্ষম করে না।

public class ScrollDisabledRecyclerView extends RecyclerView {
    public ScrollDisabledRecyclerView(Context context) {
        super(context);
    }

    public ScrollDisabledRecyclerView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public ScrollDisabledRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public boolean onTouchEvent(MotionEvent e) {
        return false;
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent e) {
        return false;
    }
}

3

আপনি আপনার অ্যাডাপ্টার সেট করার পরে এই লাইনটি যুক্ত করতে পারেন

ViewCompat.setNestedScrollingEnabled(recyclerView, false);

এখন আপনার পুনর্ব্যবহারযোগ্যটি মসৃণ স্ক্রোলিংয়ের সাথে কাজ করবে


2

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

এখন অবধি সেরা সমাধানটি (আমার পক্ষে কমপক্ষে) @ জসোল্ট সাফরানি মেথোড ব্যবহার করছে তবে গিটার এবং সেটার যুক্ত করছে যাতে আপনাকে অনআইটেমটিউচলিস্টেনার অপসারণ বা যুক্ত করতে হবে না।

অনুসরণ

public class RecyclerViewDisabler implements RecyclerView.OnItemTouchListener {

    boolean isEnable = true;

    public RecyclerViewDisabler(boolean isEnable) {
        this.isEnable = isEnable;
    }

    public boolean isEnable() {
        return isEnable;
    }

    public void setEnable(boolean enable) {
        isEnable = enable;
    }

    @Override
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
        return !isEnable;
    }

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

   @Override
   public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept){}
 }

ব্যবহার

RecyclerViewDisabler disabler = new RecyclerViewDisabler(true);
feedsRecycler.addOnItemTouchListener(disabler);

// TO ENABLE/DISABLE JUST USE THIS
disabler.setEnable(enable);

2

কোটলিনে, যদি আপনি কেবল একটি মান নির্ধারণের জন্য অতিরিক্ত শ্রেণি তৈরি করতে না চান তবে আপনি লেআউটম্যানেজার থেকে বেনাম শ্রেণি তৈরি করতে পারেন:

recyclerView.layoutManager = object : LinearLayoutManager(context) {
    override fun canScrollVertically(): Boolean = false
}

1

ডেটা বাইন্ডিং দিয়ে আমি এটি কীভাবে করেছি তা এখানে:

            <android.support.v7.widget.RecyclerView
                android:id="@+id/recycler_view"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:clipChildren="false"
                android:onTouch="@{(v,e) -> true}"/>

"সত্য" এর জায়গায় আমি একটি বুলিয়ান ভেরিয়েবল ব্যবহার করেছি যা একটি শর্তের উপর ভিত্তি করে পরিবর্তিত হয়েছে যাতে পুনর্ব্যবহারযোগ্য ভিউ অক্ষম ও সক্ষম হওয়ার মধ্যে স্যুইচ করতে পারে।


1

একাধিক রিসাইকেলভিউ রয়েছে এমন একটি খণ্ড নিয়ে এসেছি যাতে প্রতিটি রিক্সেলভিউতে আমার কেবল একটি স্ক্রোলবারের পরিবর্তে কেবল একটি স্ক্রোলবার প্রয়োজন।

তাই আমি কেবল স্ক্রোলভিউকে প্যারেন্ট পাত্রে রেখেছি যাতে 2 টি রাইকেল চাক্ষুষ রয়েছে এবং পুনর্ব্যবহারে ব্যবহার android:isScrollContainer="false"করুন

<android.support.v7.widget.RecyclerView 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:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layoutManager="LinearLayoutManager"
    android:isScrollContainer="false" />

1

যোগ

android:descendantFocusability="blocksDescendants"

আপনার স্রোলভিউ বা নেস্টেডস্ক্রোলভিউয়ের সন্তানের মধ্যে (এবং তালিকার ভিউ, পুনর্ব্যবহারযোগ্য ও গ্রিডভিউয়ের যে কোনও একটি)


1

স্রেফ স্ট্যান্ডার্ড কার্যকারিতা ব্যবহার করে স্ক্রোলিং অক্ষম করার আরও সহজ সরল উপায় রয়েছে (প্রযুক্তিগতভাবে এটি কোনও স্ক্রোলিং ইভেন্টের চেয়ে বেশি বিরতি এবং কোনও শর্ত পূরণ হওয়ার পরে এটি শেষ করা), কেবলমাত্র স্ট্যান্ডার্ড কার্যকারিতা ব্যবহার করে। RecyclerViewপদ্ধতিটি বলা হয়েছে addOnScrollListener(OnScrollListener listener)এবং কেবল এটি ব্যবহার করে আপনি এটিকে স্ক্রোলিং থেকে বিরত রাখতে পারেন, ঠিক তেমন:

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

কেস ব্যবহার করুন: আসুন আমরা বলি যে আপনি যখন কোনও আইটেমের মধ্যে ক্লিক করেন তখন আপনি স্ক্রলিংটি অক্ষম করতে চান RecyclerViewযাতে আপনি অন্য কোনও আইটেমটিতে দুর্ঘটনাক্রমে স্ক্রোলিং দ্বারা বিভ্রান্ত না হয়ে এবং এটি দিয়ে কিছু ক্রিয়া সম্পাদন করতে পারেন, এবং যখন আপনি এটিটি সম্পন্ন করেন, কেবল ক্লিক করুন স্ক্রোলিং সক্ষম করতে আইটেমটি আবার। তার জন্য, আপনি OnClickListenerপ্রতিটি আইটেমের সাথে সংযুক্ত করতে চাইবেন RecyclerView, তাই আপনি যখন কোনও আইটেমে ক্লিক করেন, তখন এটি isItemSelectedথেকে টগল falseকরতে হবে true। আপনি যখন স্ক্রোল করার চেষ্টা করবেন, তখন RecyclerViewস্বয়ংক্রিয়ভাবে পদ্ধতিটি কল করবে onScrollStateChangedএবং isItemSelectedসেট trueহওয়ার RecyclerViewপরে, সুযোগটি পাওয়ার আগে এটি তত্ক্ষণাত বন্ধ হয়ে যাবে , ভাল ... স্ক্রোল করার জন্য।

দ্রষ্টব্য: আরও ভাল ব্যবহারের জন্য, ক্লিকগুলি প্রতিরোধ করার GestureListenerপরিবর্তে ব্যবহার করার চেষ্টা করুন ।OnClickListeneraccidental


stopScroll()স্ক্রোল হিমায়িত করার জন্য নয়, এটি কেবল স্ক্রোলিং পুনর্ব্যবহারযোগ্য পর্যালোচনা থামাতে / থামাতে।
ফরিদ

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

0

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

 android:nestedScrollingEnabled="false"

এটার মত

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

0

স্পর্শ করে স্ক্রোলিং বন্ধ করার জন্য তবে কমান্ডের মাধ্যমে স্ক্রোলিং চালিয়ে যান:

if (appTopBarMessagesRV == নাল) {appTopBarMessagesRV = findViewById (R.id.mainBarScrolMessagesRV);

        appTopBarMessagesRV.addOnItemTouchListener(new RecyclerView.SimpleOnItemTouchListener() {
            @Override
            public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {

                if ( rv.getScrollState() == RecyclerView.SCROLL_STATE_DRAGGING)
                {
                     // Stop  scrolling by touch

                    return false;
                }
                return  true;
            }
        });
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.