রিসাইক্লারভিউ + অ্যাপবারলয়আউটের সাথে ফ্লাই করা


171

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

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

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

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

এখানে একটি ভিডিও স্ক্রোলিংয়ের কয়েকটি সমস্যা দেখায়। https://youtu.be/xMLKoJOsTAM

এখানে পুনরায় ব্যবহারকারীর দৃশ্য (চিজডেটেলঅ্যাক্টিভিটি) দিয়ে সমস্যাটি দেখানোর একটি উদাহরণ রয়েছে is https://github.com/tylerjroach/cheesesquare

এখানে আসল উদাহরণটি যা ক্রিস ব্যানস থেকে নেস্টেডস্ক্রোলভিউ ব্যবহার করে। https://github.com/chrisbanes/cheesesquare


আমি এই একই সঠিক সমস্যাটি অনুভব করছি (আমি একটি রিসাইক্লারভিউয়ের সাথে ব্যবহার করছি)। যদি আপনি কোনও অ্যাপ্লিকেশনের জন্য কোনও গুগল প্লে স্টোরের তালিকার দিকে লক্ষ্য করেন তবে এটি সঠিকভাবে আচরণ করছে বলে মনে হচ্ছে, তাই অবশ্যই একটি সমাধান অবশ্যই আছে ...
আনিম

হেই আনিম, আমি জানি এটি সবচেয়ে বড় সমাধান নয় তবে আমি এই লাইব্রেরিটি নিয়ে পরীক্ষা-নিরীক্ষা শুরু করেছি: github.com/ksoichiro/Android-ObservableScrollView । বিশেষত এই ক্রিয়াকলাপে আমার প্রয়োজনীয় ফলাফলগুলি অর্জন করতে: ফ্লেক্সিবলস্পেসবিথআইমেজরিসাইক্লারভিউঅ্যাক্টিভিটি.জভা। সম্পাদনার আগে আপনার নামের ভুল বানান সম্পর্কে দুঃখিত। স্বতঃসংশোধন ..
টাইলারজরোচ

2
এখানে একই সমস্যা, আমি অ্যাপবারআলআউট এড়িয়ে শেষ করেছি।
রেনাড সেরারাতো

হাঁ। ওভারসেসেবলসক্রোলভিউ লাইব্রেরি থেকে আমার যা প্রয়োজন তা হ'ল আমি শেষ করেছি। আমি নিশ্চিত এটি ভবিষ্যতের সংস্করণগুলিতে স্থির হয়ে যাবে।
tylerjroach

8
ফিটিংটি বগি, একটি সমস্যা উত্থাপিত হয়েছে (এবং স্বীকৃত)।
রেনেউদ সেরারাতো

উত্তর:


114

কিরিল বোয়ারশিনভের উত্তর প্রায় সঠিক ছিল।

মূল সমস্যাটি হ'ল রিসাইক্লারভিউ কখনও কখনও ভুল ভ্রূক দিক নির্দেশনা দেয়, তাই আপনি যদি তার উত্তরে নিম্নলিখিত কোডটি যুক্ত করেন তবে এটি সঠিকভাবে কাজ করে:

public final class FlingBehavior extends AppBarLayout.Behavior {
    private static final int TOP_CHILD_FLING_THRESHOLD = 3;
    private boolean isPositive;

    public FlingBehavior() {
    }

    public FlingBehavior(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onNestedFling(CoordinatorLayout coordinatorLayout, AppBarLayout child, View target, float velocityX, float velocityY, boolean consumed) {
        if (velocityY > 0 && !isPositive || velocityY < 0 && isPositive) {
            velocityY = velocityY * -1;
        }
        if (target instanceof RecyclerView && velocityY < 0) {
            final RecyclerView recyclerView = (RecyclerView) target;
            final View firstChild = recyclerView.getChildAt(0);
            final int childAdapterPosition = recyclerView.getChildAdapterPosition(firstChild);
            consumed = childAdapterPosition > TOP_CHILD_FLING_THRESHOLD;
        }
        return super.onNestedFling(coordinatorLayout, child, target, velocityX, velocityY, consumed);
    }

    @Override
    public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, AppBarLayout child, View target, int dx, int dy, int[] consumed) {
        super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed);
        isPositive = dy > 0;
    }
}

আমি আশাবাদী এটা সাহায্য করবে.


তুমি আমার দিন বাঁচিয়েছ! মনে হচ্ছে একদম ঠিকঠাক কাজ করছে! আপনার উত্তর গ্রহণ করা হয় না কেন?
জোর্ডিড

9
আপনি যদি আপনার পুনর্ব্যবহারের পিতামাতা হিসাবে একটি সোয়াইপ রিফ্রেশলয়আউট ব্যবহার করছেন তবে কেবল এই কোডটি যুক্ত করুন: এর if (target instanceof SwipeRefreshLayout && velocityY < 0) { target = ((SwipeRefreshLayout) target).getChildAt(0); }আগে if (target instanceof RecyclerView && velocityY < 0) {
লাকাসএফএম

1
+ 1 এই ফিক্সটি বিশ্লেষণ করে, গুগল কেন এখনও এটি স্থির করেনি তা আমি বুঝতে পারি না। কোডটি বেশ সহজ বলে মনে হচ্ছে।
গ্যাস্টন ফ্লোরস

3
হ্যালো কীভাবে একই জিনিসটি অ্যাপ্লায়ারআউট এবং নেস্টস্ক্রোলভিউয়ের সাথে অর্জন করবেন ... আগাম ধন্যবাদ ..
হ্যারি শর্মা

1
এটি আমার পক্ষে কাজ করে না = / যাইহোক, ক্লাসটি সাপোর্ট প্যাকেজে সরিয়ে নেওয়ার দরকার নেই, আপনি কনস্ট্রাক্টরে একটি ড্রাগগ্যালব্যাক নিবন্ধন করতে পারেন।
অগস্টো কারমো

69

দেখে মনে হচ্ছে v23আপডেটটি এখনও এটি ঠিক করে নি।

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

public final class FlingBehavior extends AppBarLayout.Behavior {

    public FlingBehavior() {
    }

    public FlingBehavior(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onNestedFling(CoordinatorLayout coordinatorLayout, AppBarLayout child, View target, float velocityX, float velocityY, boolean consumed) {
        if (target instanceof ScrollingView) {
            final ScrollingView scrollingView = (ScrollingView) target;
            consumed = velocityY > 0 || scrollingView.computeVerticalScrollOffset() > 0;
        }
        return super.onNestedFling(coordinatorLayout, child, target, velocityX, velocityY, consumed);
    }
}

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

 <android.support.design.widget.AppBarLayout
    android:id="@+id/appbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:layout_behavior="your.package.FlingBehavior">
    <!--your views here-->
 </android.support.design.widget.AppBarLayout>

সম্পাদনা:verticalScrollOffset শীর্ষ থেকে আইটেমের পরিমাণের পরিবর্তে এখন ফিটিং ইভেন্টের পুনর্বিবেচনা ভিত্তিক RecyclerView

সম্পাদনা 2:ScrollingView পরিবর্তে ইন্টারফেস উদাহরণ হিসাবে লক্ষ্য পরীক্ষা করুন RecyclerView। উভয় RecyclerViewএবং NestedScrollingViewএটি বাস্তবায়ন।


লেআউট-আচরণ আচরণের ত্রুটির জন্য স্ট্রিংয়ের ধরণ পাওয়ার অনুমতি নেই
বৈশাখ এন

আমি এটি পরীক্ষা করেছি এবং আরও ভাল কাজ করি! তবে TOP_CHILD_FLING_THRESHOLD এর উদ্দেশ্য কী? এবং কেন এটি 3?
জুলিওোয়া

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

হ্যালো কীভাবে একই জিনিসটি অ্যাপ্লায়ারআউট এবং নেস্টস্ক্রোলভিউয়ের সাথে অর্জন করবেন ... আগাম ধন্যবাদ ..
হ্যারি শর্মা

2
@ হারদীপ পরিবর্তন target instanceof RecyclerViewকরুন target instanceof NestedScrollView, বা জেনেরিক কেসে এর জন্য আরও কিছু target instanceof ScrollingView। আমি উত্তর আপডেট।
কিরিল বোয়ারশিভিনভ

15

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

package com.singmak.uitechniques.util.coordinatorlayout;

import android.content.Context;
import android.support.design.widget.AppBarLayout;
import android.support.design.widget.CoordinatorLayout;
import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
import android.view.View;

import java.lang.ref.WeakReference;
import java.util.HashMap;
import java.util.Map;

/**
 * Created by maksing on 26/3/2016.
 */
public final class RecyclerViewAppBarBehavior extends AppBarLayout.Behavior {

    private Map<RecyclerView, RecyclerViewScrollListener> scrollListenerMap = new HashMap<>(); //keep scroll listener map, the custom scroll listener also keep the current scroll Y position.

    public RecyclerViewAppBarBehavior() {
    }

    public RecyclerViewAppBarBehavior(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    /**
     *
     * @param coordinatorLayout
     * @param child The child that attached the behavior (AppBarLayout)
     * @param target The scrolling target e.g. a recyclerView or NestedScrollView
     * @param velocityX
     * @param velocityY
     * @param consumed The fling should be consumed by the scrolling target or not
     * @return
     */
    @Override
    public boolean onNestedFling(CoordinatorLayout coordinatorLayout, AppBarLayout child, View target, float velocityX, float velocityY, boolean consumed) {
        if (target instanceof RecyclerView) {
            final RecyclerView recyclerView = (RecyclerView) target;
            if (scrollListenerMap.get(recyclerView) == null) {
                RecyclerViewScrollListener recyclerViewScrollListener = new RecyclerViewScrollListener(coordinatorLayout, child, this);
                scrollListenerMap.put(recyclerView, recyclerViewScrollListener);
                recyclerView.addOnScrollListener(recyclerViewScrollListener);
            }
            scrollListenerMap.get(recyclerView).setVelocity(velocityY);
            consumed = scrollListenerMap.get(recyclerView).getScrolledY() > 0; //recyclerView only consume the fling when it's not scrolled to the top
        }
        return super.onNestedFling(coordinatorLayout, child, target, velocityX, velocityY, consumed);
    }

    private static class RecyclerViewScrollListener extends RecyclerView.OnScrollListener {
        private int scrolledY;
        private boolean dragging;
        private float velocity;
        private WeakReference<CoordinatorLayout> coordinatorLayoutRef;
        private WeakReference<AppBarLayout> childRef;
        private WeakReference<RecyclerViewAppBarBehavior> behaviorWeakReference;

        public RecyclerViewScrollListener(CoordinatorLayout coordinatorLayout, AppBarLayout child, RecyclerViewAppBarBehavior barBehavior) {
            coordinatorLayoutRef = new WeakReference<CoordinatorLayout>(coordinatorLayout);
            childRef = new WeakReference<AppBarLayout>(child);
            behaviorWeakReference = new WeakReference<RecyclerViewAppBarBehavior>(barBehavior);
        }

        @Override
        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
            dragging = newState == RecyclerView.SCROLL_STATE_DRAGGING;
        }

        public void setVelocity(float velocity) {
            this.velocity = velocity;
        }

        public int getScrolledY() {
            return scrolledY;
        }

        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            scrolledY += dy;

            if (scrolledY <= 0 && !dragging && childRef.get() != null && coordinatorLayoutRef.get() != null && behaviorWeakReference.get() != null) {
                //manually trigger the fling when it's scrolled at the top
                behaviorWeakReference.get().onNestedFling(coordinatorLayoutRef.get(), childRef.get(), recyclerView, 0, velocity, false);
            }
        }
    }
}

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

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

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

1
@ ম্যাকসিং সমস্ত সমাধান বন্ধ করে দিলে এটি আমার পক্ষে সবচেয়ে ভাল কাজ করে। আমি নেস্টফ্লিনিং-এর হাতে দেওয়া বেগটি সামান্য বিট * 0.6f এ সামঞ্জস্য করেছি ... মনে হচ্ছে এটি একটি সুন্দর প্রবাহ দেয়।
সাবদারাইডার

আমার জন্য কাজ কর. @ ম্যাকসিং অনস্ক্রোল পদ্ধতিতে কি আপনাকে অ্যাপবারলয়েউটের নেস্টড ফ্লাইং কল করতে হবে? আচরণটি এবং পুনর্ব্যবহারযোগ্য ভিউ অ্যাপবারবারিভারের নয়? আমার কাছে কিছুটা অদ্ভুত লাগছে।
অ্যান্টন ম্যালমাইগিন

13

সমর্থন নকশা 26.0.0 থেকে এটি স্থির করা হয়েছে।

compile 'com.android.support:design:26.0.0'

2
এটি উপরে উঠা প্রয়োজন। যে কেউ বিশদে আগ্রহী সে ক্ষেত্রে এটি এখানে বর্ণিত হয়েছে
ক্রিস ডিনন

1
এখন স্ট্যাটাস বার নিয়ে একটি সমস্যা রয়েছে বলে মনে হচ্ছে, যেখানে আপনি যখন স্ট্যাটাস বারটি নীচে স্ক্রোল করে স্কারলটি দিয়ে কিছুটা নিচে চলে যান ... এটির বিরক্তিকর!
বক্স

2
@ জিয়াওজউ আমি ২.1.১.০ ব্যবহার করছি এবং তবুও ঝাঁকুনির সমস্যা রয়েছে। দ্রুত ঝাপটায় কখনও কখনও বিপরীত আন্দোলনের ফলাফল হয় (অন্নেষ্টডিং পদ্ধতিতে আন্দোলনের বেগ বিপরীত / ভুল হিসাবে দেখা যায়)। শাওমি
রেডমি

@ dor506 stackoverflow.com/a/47298312/782870 আমি নিশ্চিত যদি আমরা একই সমস্যা আছে যখন আপনি বলে বিপরীত আন্দোলন ফলাফলের নই। তবে আমি এখানে একটি উত্তর পোস্ট করেছি। আশা করি এটি সাহায্য করবে :)
vida

5

এটি গুগল সাপোর্ট ডিজাইন অ্যাপবারলআউটের একটি মসৃণ সংস্করণ। আপনি যদি অ্যাপবারলআউট ব্যবহার করছেন তবে আপনি বুঝতে পারবেন এটিতে ঝাঁকুনির সমস্যা রয়েছে।

compile "me.henrytao:smooth-app-bar-layout:<latest-version>"

এখানে লাইব্রেরি দেখুন .. https://github.com/henrytao-me/smooth-app-bar-layout


4

এটি একটি পুনর্ব্যবহারযোগ্য বাগ। এটি v23.1.0 এ স্থির হওয়ার কথা।

https://code.google.com/p/android/issues/detail?id=177729 দেখুন

এখানে চিত্র বর্ণনা লিখুন


9
v23.4.0 - এখনও ঠিক হয়নি
আর্থার

3
এখনও v25.1.0
0xcaff

v25.3.1, এখনও খারাপ দেখাচ্ছে।
বাওয়া

1
শেষ পর্যন্ত এটি স্থির v26.0.1!
মাইক্রার

2

এটি আমার লেআউট এবং স্ক্রোলটি এটি করা উচিত হিসাবে কাজ করছে।

<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    android:id="@+id/container">

<android.support.design.widget.AppBarLayout
    android:id="@+id/appbarLayout"
    android:layout_height="192dp"
    android:layout_width="match_parent">

    <android.support.design.widget.CollapsingToolbarLayout
        android:id="@+id/ctlLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_scrollFlags="scroll|exitUntilCollapsed"
        app:contentScrim="?attr/colorPrimary"
        app:layout_collapseMode="parallax">

        <android.support.v7.widget.Toolbar
            android:id="@+id/appbar"
            android:layout_height="?attr/actionBarSize"
            android:layout_width="match_parent"
            app:layout_scrollFlags="scroll|enterAlways"
            app:layout_collapseMode="pin"/>

    </android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>

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

</android.support.design.widget.CoordinatorLayout>

2

আমার সমাধান এখন পর্যন্ত মাক সিং এবং মানোলো গার্সিয়া উত্তরের উপর ভিত্তি করে ।

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

import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.design.widget.AppBarLayout;
import android.support.design.widget.CoordinatorLayout;
import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
import android.view.View;

import java.lang.ref.WeakReference;

public class FlingAppBarLayoutBehavior
        extends AppBarLayout.Behavior {

    // The minimum I have seen for a dy, after the recycler view stopped.
    private static final int MINIMUM_DELTA_Y = -4;

    @Nullable
    RecyclerViewScrollListener mScrollListener;

    private boolean isPositive;

    public FlingAppBarLayoutBehavior() {
    }

    public FlingAppBarLayoutBehavior(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public boolean callSuperOnNestedFling(
            CoordinatorLayout coordinatorLayout,
            AppBarLayout child,
            View target,
            float velocityX,
            float velocityY,
            boolean consumed) {
        return super.onNestedFling(
                coordinatorLayout,
                child,
                target,
                velocityX,
                velocityY,
                consumed
        );
    }

    @Override
    public boolean onNestedFling(
            CoordinatorLayout coordinatorLayout,
            AppBarLayout child,
            View target,
            float velocityX,
            float velocityY,
            boolean consumed) {

        if (velocityY > 0 && !isPositive || velocityY < 0 && isPositive) {
            velocityY = velocityY * -1;
        }

        if (target instanceof RecyclerView) {
            RecyclerView recyclerView = (RecyclerView) target;

            if (mScrollListener == null) {
                mScrollListener = new RecyclerViewScrollListener(
                        coordinatorLayout,
                        child,
                        this
                );
                recyclerView.addOnScrollListener(mScrollListener);
            }

            mScrollListener.setVelocity(velocityY);
        }

        return super.onNestedFling(
                coordinatorLayout,
                child,
                target,
                velocityX,
                velocityY,
                consumed
        );
    }

    @Override
    public void onNestedPreScroll(
            CoordinatorLayout coordinatorLayout,
            AppBarLayout child,
            View target,
            int dx,
            int dy,
            int[] consumed) {
        super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed);
        isPositive = dy > 0;
    }

    private static class RecyclerViewScrollListener
            extends RecyclerView.OnScrollListener {

        @NonNull
        private final WeakReference<AppBarLayout> mAppBarLayoutWeakReference;

        @NonNull
        private final WeakReference<FlingAppBarLayoutBehavior> mBehaviorWeakReference;

        @NonNull
        private final WeakReference<CoordinatorLayout> mCoordinatorLayoutWeakReference;

        private int mDy;

        private float mVelocity;

        public RecyclerViewScrollListener(
                @NonNull CoordinatorLayout coordinatorLayout,
                @NonNull AppBarLayout child,
                @NonNull FlingAppBarLayoutBehavior barBehavior) {
            mCoordinatorLayoutWeakReference = new WeakReference<>(coordinatorLayout);
            mAppBarLayoutWeakReference = new WeakReference<>(child);
            mBehaviorWeakReference = new WeakReference<>(barBehavior);
        }

        @Override
        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
            if (newState == RecyclerView.SCROLL_STATE_IDLE) {
                if (mDy < MINIMUM_DELTA_Y
                        && mAppBarLayoutWeakReference.get() != null
                        && mCoordinatorLayoutWeakReference.get() != null
                        && mBehaviorWeakReference.get() != null) {

                    // manually trigger the fling when it's scrolled at the top
                    mBehaviorWeakReference.get()
                            .callSuperOnNestedFling(
                                    mCoordinatorLayoutWeakReference.get(),
                                    mAppBarLayoutWeakReference.get(),
                                    recyclerView,
                                    0,
                                    mVelocity, // TODO find a way to recalculate a correct velocity.
                                    false
                            );

                }
            }
        }

        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            mDy = dy;
        }

        public void setVelocity(float velocity) {
            mVelocity = velocity;
        }

    }

}

আপনি প্রতিবিম্ব ব্যবহার করে একটি পুনর্ব্যবহারযোগ্য ভিউ (25.1.0 হিসাবে) এর বর্তমান গতি অর্জন করতে পারেন: Field viewFlingerField = recyclerView.getClass().getDeclaredField("mViewFlinger"); viewFlingerField.setAccessible(true); Object flinger = viewFlingerField.get(recyclerView); Field scrollerField = flinger.getClass().getDeclaredField("mScroller"); scrollerField.setAccessible(true); ScrollerCompat scroller = (ScrollerCompat) scrollerField.get(flinger); velocity = Math.signum(mVelocity) * Math.abs(scroller.getCurrVelocity());
নিকোলাস

2

আমার ক্ষেত্রে, আমি ইস্যুটি পেয়েছিলাম যেখানে ঝাঁকুনি দিয়ে RecyclerViewএটি সহজেই স্ক্রোল করবে না, এটি আটকে যাওয়ার কারণে।

এই ছিল, কারণ কিছু কারণে, আমি ভুলে গিয়েছিলেন যে আমি আমার করা ছিল RecyclerViewএকটিNestedScrollView

এটি একটি নির্লিপ্ত ভুল, তবে এটি বের করতে আমার কিছুটা সময় লেগেছে ...


1

আমি AppBarLayout এর ভিতরে 1dp উচ্চতার একটি ভিউ যুক্ত করি তবে এটি আরও ভাল কাজ করে। এটি আমার লেআউট।

  <android.support.design.widget.CoordinatorLayout 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"
android:background="@android:color/white"
tools:context="com.spof.spof.app.UserBeachesActivity">

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <android.support.v7.widget.Toolbar
        android:id="@+id/user_beaches_toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:layout_alignParentTop="true"
        android:background="?attr/colorPrimary"
        android:minHeight="?attr/actionBarSize"
        android:theme="@style/WhiteTextToolBar"
        app:layout_scrollFlags="scroll|enterAlways" />

    <View
        android:layout_width="match_parent"
        android:layout_height="1dp" />
</android.support.design.widget.AppBarLayout>


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


আপনি যদি স্ক্রোল করেন তবেই এটি কাজ করে। আপনি যদিও নীচে স্ক্রোল করবেন না
আর্থার

আমার জন্য উভয় দিক ভাল কাজ করে। আপনি অ্যাপবারলেটের ভিতরে 1 ডিপি ভিউ যুক্ত করেছেন? আমি এটি কেবল অ্যান্ড্রয়েড ললিপপ এবং কিটকেটেই পরীক্ষা করেছি।
জাচুম্বেলেচাও মন্টেকিলায়

ঠিক আছে, আমি কলাপসিং টুলবারলআউটটিও ব্যবহার করছি যা সরঞ্জামদণ্ডটি মোড়ানো। আমি এর ভিতরে 1 ডিপি ভিউ রেখেছি। এটি এই অ্যাপ্লারএলআউট -> কলাপসিং টুলবারলআউট -> সরঞ্জামদণ্ড + 1dp ভিউ
আর্থার

কলাপসিংটুলবারআউটআউটটি ভালভাবে কাজ করে কিনা আমি জানি না। আমি কেবল এই কোড দিয়ে পরীক্ষা করেছি। আপনি কলসিংটুলবারলআউটটির বাইরে 1dp ভিউ রাখার চেষ্টা করেছিলেন?
জাচুম্বেলেচাও মন্টেকিলায়

হ্যাঁ. স্ক্রোল আপ কাজ করে, ডাউন স্ক্রোলটি সরঞ্জামদণ্ডটি প্রসারিত করে না।
আর্থার

1

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

private int mScrolled;
private int mPreviousDy;
private AppBarLayout mAppBar;

myRecyclerView.addOnScrollListener(new OnScrollListener() {
        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
            mScrolled += dy;
            // scrolled to the top with a little more velocity than a slow scroll e.g. flick/fling.
            // Adjust 10 (vertical change of event) as you feel fit for you requirement
            if(mScrolled == 0 && dy < -10 && mPrevDy < 0) {
                mAppBar.setExpanded(true, true);
            }
            mPreviousDy = dy;
    });

এমপ্রিভডি কী
এআরআর.এস

1

গৃহীত উত্তরটি আমার পক্ষে কার্যকর হয়নি কারণ আমার RecyclerViewSwipeRefreshLayoutএবং ক এর ভিতরে ছিল ViewPager। এটি উন্নত সংস্করণ যা RecyclerViewশ্রেণিবিন্যাসের জন্য একটি সন্ধান করে এবং যে কোনও বিন্যাসের জন্য কাজ করা উচিত:

public final class FlingBehavior extends AppBarLayout.Behavior {
    private static final int TOP_CHILD_FLING_THRESHOLD = 3;
    private boolean isPositive;

    public FlingBehavior() {
    }

    public FlingBehavior(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onNestedFling(CoordinatorLayout coordinatorLayout, AppBarLayout child, View target, float velocityX, float velocityY, boolean consumed) {
        if (velocityY > 0 && !isPositive || velocityY < 0 && isPositive) {
            velocityY = velocityY * -1;
        }
        if (!(target instanceof RecyclerView) && velocityY < 0) {
            RecyclerView recycler = findRecycler((ViewGroup) target);
            if (recycler != null){
                target = recycler;
            }
        }
        if (target instanceof RecyclerView && velocityY < 0) {
            final RecyclerView recyclerView = (RecyclerView) target;
            final View firstChild = recyclerView.getChildAt(0);
            final int childAdapterPosition = recyclerView.getChildAdapterPosition(firstChild);
            consumed = childAdapterPosition > TOP_CHILD_FLING_THRESHOLD;
        }
        return super.onNestedFling(coordinatorLayout, child, target, velocityX, velocityY, consumed);
    }

    @Override
    public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, AppBarLayout child, View target, int dx, int dy, int[] consumed) {
        super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed);
        isPositive = dy > 0;
    }

    @Nullable
    private RecyclerView findRecycler(ViewGroup container){
        for (int i = 0; i < container.getChildCount(); i++) {
            View childAt = container.getChildAt(i);
            if (childAt instanceof RecyclerView){
                return (RecyclerView) childAt;
            }
            if (childAt instanceof ViewGroup){
                return findRecycler((ViewGroup) childAt);
            }
        }
        return null;
    }
}

1

উত্তর: এটি সমর্থন লাইব্রেরি v26 এ স্থির করা হয়েছে

তবে ভি 26-এ পলক ফেলার ক্ষেত্রে কিছু সমস্যা আছে। কখনও কখনও, অ্যাপ্লার ফিরিং খুব শক্ত না হলেও আবার ফিরে আসে।

আমি কীভাবে অ্যাপবারে বাউন্সিং প্রভাবটি সরিয়ে ফেলব?

ভি 26 সমর্থন করার জন্য আপডেট করার সময় আপনি যদি একই সমস্যাটির মুখোমুখি হন তবে এই উত্তরের সংক্ষিপ্তসার এখানে ।

সমাধান : অ্যাপবারের ডিফল্ট আচরণটি প্রসারিত করুন এবং অ্যাপবারের স্পর্শকালে নেবারডস্ক্রোলটি বন্ধ না হওয়াতে অ্যাপবারের জন্য নেভেলপ্রেসক্রোল () এবং অননিস্টডস্ক্রোল () কল করুন block


0

জুলিয়ান ওস ঠিক আছে।

রিসাইক্লারভিউটি প্রান্তিকের নীচে এবং স্ক্রোলগুলি থাকলে মানোলো গার্সিয়ার উত্তর কাজ করে না। আপনাকে অবশ্যই offsetপুনর্ব্যবহারযোগ্য ও velocity to the distanceআইটেমের অবস্থানের তুলনা করতে হবে ।

আমি জুলিয়ানের কোটলিন কোড এবং বিয়োগফল প্রতিফলন উল্লেখ করে জাভা সংস্করণ তৈরি করেছি।

public final class FlingBehavior extends AppBarLayout.Behavior {

    private boolean isPositive;

    private float mFlingFriction = ViewConfiguration.getScrollFriction();

    private float DECELERATION_RATE = (float) (Math.log(0.78) / Math.log(0.9));
    private final float INFLEXION = 0.35f;
    private float mPhysicalCoeff;

    public FlingBehavior(){
        init();
    }

    public FlingBehavior(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    private void init(){
        final float ppi = BaseApplication.getInstance().getResources().getDisplayMetrics().density * 160.0f;
        mPhysicalCoeff = SensorManager.GRAVITY_EARTH // g (m/s^2)
                * 39.37f // inch/meter
                * ppi
                * 0.84f; // look and feel tuning
    }

    @Override
    public boolean onNestedFling(CoordinatorLayout coordinatorLayout, AppBarLayout child, View target, float velocityX, float velocityY, boolean consumed) {

        if (velocityY > 0 && !isPositive || velocityY < 0 && isPositive) {
            velocityY = velocityY * -1;
        }
        if (target instanceof RecyclerView && velocityY < 0) {
            RecyclerView recyclerView = (RecyclerView) target;

            double distance = getFlingDistance((int) velocityY);
            if (distance < recyclerView.computeVerticalScrollOffset()) {
                consumed = true;
            } else {
                consumed = false;
            }
        }
        return super.onNestedFling(coordinatorLayout, child, target, velocityX, velocityY, consumed);
    }

    @Override
    public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, AppBarLayout child, View target, int dx, int dy, int[] consumed) {
        super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed);
        isPositive = dy > 0;
    }

    public double getFlingDistance(int velocity){
        final double l = getSplineDeceleration(velocity);
        final double decelMinusOne = DECELERATION_RATE - 1.0;
        return mFlingFriction * mPhysicalCoeff * Math.exp(DECELERATION_RATE / decelMinusOne * l);
    }

    private double getSplineDeceleration(int velocity) {
        return Math.log(INFLEXION * Math.abs(velocity) / (mFlingFriction * mPhysicalCoeff));
    }

}

পুনরায় চালু করতে পারবেন নাBaseApplication
এআরআর.এস

@ এআরআরস, দুঃখিত, আপনি কেবল নীচের মতো এটি আপনার প্রসঙ্গটি প্রতিস্থাপন করেছেন।
정성민

YOUR_CONTEXT.getResferences ()। GetDisplayMetrics ()। ঘনত্ব * 160.0f;
정성민

0

আমি এনিজ বিলগিন https://stackoverflow.com/a/45090239/7639018 দ্বারা সমাধানটি পেয়েছি

এই সংগ্রহস্থলের লাইব্রেরিগুলিতে সমস্যাটি সমাধান করা হয়েছে।

( https://developer.android.com/topic/libraries/support-library/setup.html )

allprojects {
    repositories {
        jcenter()
        maven {
            url "https://maven.google.com"
        }
    }
}

0

রেফারেন্স দিয়ে গুগল ইস্যু যে ব্যক্তি অনুসরণ করে , এটা সমর্থন লাইব্রেরির অ্যান্ড্রয়েড 26.0.0-beta2 সংস্করণের সাথে সংশোধন করা হয়েছে

দয়া করে আপনার Android সমর্থন লাইব্রেরি সংস্করণ 26.0.0-beta2 আপডেট করুন

যদি কোনও সমস্যা অব্যাহত থাকে তবে দয়া করে গুগল ইস্যু ট্র্যাকারে রিপোর্ট করুন তারা পরীক্ষার জন্য পুনরায় খুলবে।


0

উপরেরগুলি হিসাবে আমার উত্তরগুলি সম্পূর্ণরূপে পূরণ করেনি বা খুব ভাল কাজ করেন নি বলে এখানে অন্য উত্তর যুক্ত করা। এটি একটি আংশিকভাবে এখানে ছড়িয়ে থাকা ধারণার ভিত্তিতে।

সুতরাং এই এক কি করে?

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

দৃশ্যের wardsর্ধ্বমুখীভাবে ঝাপটায়: যদি রিসাইক্লিউউ'র স্ক্রোল অফসেটটি শূন্য না হয়, তবে এটি মূল গতিতে প্রবাহিত হয়। যত তাড়াতাড়ি এটি শেষ হয়ে যায় এবং যদি এখনও বেগ থাকে (যেমন পুনর্ব্যবহারযোগ্য ভিউ 0 পজিশনে স্ক্রোল করা হয়), অ্যাপবারলয়েটটি এ পর্যন্ত প্রসারিত হবে যে আসল গতিবেগ সবেমাত্র গ্রাস করা দাবীগুলি মাইনাস করবে। অন্যথায়, অ্যাপবেলারলআউটটি মূল গতিবেগের দাবী পর্যন্ত প্রসারিত হয়।

আফাইক, এটি হ'ল চাপযুক্ত আচরণ।

এতে প্রচুর প্রতিচ্ছবি জড়িত রয়েছে এবং এটি বেশ প্রথাগত। যদিও এখনও কোন সমস্যা খুঁজে পাওয়া যায় নি। এটি কোটলিনেও লেখা আছে, তবে এটি বোঝার কোনও সমস্যা হওয়া উচিত নয়। আপনি এটেলিজজে কোটলিন প্লাগইনটি এটিকে বাইটোকড -> এ সংকলন করতে এবং জাভাতে আবার ডিকম্পাইল করতে ব্যবহার করতে পারেন। এটি ব্যবহারের জন্য, এটিকে android.support.v7.widget প্যাকেজে রাখুন এবং এটিকে অ্যাপবারআলআউট এর সমন্বয়কারী লেআউট.লায়আউটপ্যারামসের আচরণ কোড হিসাবে সেট করুন (অথবা এক্সএমএল প্রযোজ্য নির্মাণকারী বা কিছু যুক্ত করুন)

/*
 * Copyright 2017 Julian Ostarek
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.support.v7.widget

import android.support.design.widget.AppBarLayout
import android.support.design.widget.CoordinatorLayout
import android.support.v4.widget.ScrollerCompat
import android.view.View
import android.widget.OverScroller

class SmoothScrollBehavior(recyclerView: RecyclerView) : AppBarLayout.Behavior() {
    // We're using this SplineOverScroller from deep inside the RecyclerView to calculate the fling distances
    private val splineOverScroller: Any
    private var isPositive = false

    init {
        val scrollerCompat = RecyclerView.ViewFlinger::class.java.getDeclaredField("mScroller").apply {
            isAccessible = true
        }.get(recyclerView.mViewFlinger)
        val overScroller = ScrollerCompat::class.java.getDeclaredField("mScroller").apply {
            isAccessible = true
        }.get(scrollerCompat)
        splineOverScroller = OverScroller::class.java.getDeclaredField("mScrollerY").apply {
            isAccessible = true
        }.get(overScroller)
    }

    override fun onNestedFling(coordinatorLayout: CoordinatorLayout?, child: AppBarLayout, target: View?, velocityX: Float, givenVelocity: Float, consumed: Boolean): Boolean {
        // Making sure the velocity has the correct sign (seems to be an issue)
        var velocityY: Float
        if (isPositive != givenVelocity > 0) {
            velocityY = givenVelocity * - 1
        } else velocityY = givenVelocity

        if (velocityY < 0) {
            // Decrement the velocity to the maximum velocity if necessary (in a negative sense)
            velocityY = Math.max(velocityY, - (target as RecyclerView).maxFlingVelocity.toFloat())

            val currentOffset = (target as RecyclerView).computeVerticalScrollOffset()
            if (currentOffset == 0) {
                super.onNestedFling(coordinatorLayout, child, target, velocityX, velocityY, false)
                return true
            } else {
                val distance = getFlingDistance(velocityY.toInt()).toFloat()
                val remainingVelocity = - (distance - currentOffset) * (- velocityY / distance)
                if (remainingVelocity < 0) {
                    (target as RecyclerView).addOnScrollListener(object : RecyclerView.OnScrollListener() {
                        override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
                            if (newState == RecyclerView.SCROLL_STATE_IDLE) {
                                recyclerView.post { recyclerView.removeOnScrollListener(this) }
                                if (recyclerView.computeVerticalScrollOffset() == 0) {
                                    super@SmoothScrollBehavior.onNestedFling(coordinatorLayout, child, target, velocityX, remainingVelocity, false)
                                }
                            }
                        }
                    })
                }
                return false
            }
        }
        // We're not getting here anyway, flings with positive velocity are handled in onNestedPreFling
        return false
    }

    override fun onNestedPreFling(coordinatorLayout: CoordinatorLayout?, child: AppBarLayout, target: View?, velocityX: Float, givenVelocity: Float): Boolean {
        // Making sure the velocity has the correct sign (seems to be an issue)
        var velocityY: Float
        if (isPositive != givenVelocity > 0) {
            velocityY = givenVelocity * - 1
        } else velocityY = givenVelocity

        if (velocityY > 0) {
            // Decrement to the maximum velocity if necessary
            velocityY = Math.min(velocityY, (target as RecyclerView).maxFlingVelocity.toFloat())

            val topBottomOffsetForScrollingSibling = AppBarLayout.Behavior::class.java.getDeclaredMethod("getTopBottomOffsetForScrollingSibling").apply {
                isAccessible = true
            }.invoke(this) as Int
            val isCollapsed = topBottomOffsetForScrollingSibling == - child.totalScrollRange

            // The AppBarlayout is collapsed, we'll let the RecyclerView handle the fling on its own
            if (isCollapsed)
                return false

            // The AppbarLayout is not collapsed, we'll calculate the remaining velocity, trigger the appbar to collapse and fling the RecyclerView manually (if necessary) as soon as that is done
            val distance = getFlingDistance(velocityY.toInt())
            val remainingVelocity = (distance - (child.totalScrollRange + topBottomOffsetForScrollingSibling)) * (velocityY / distance)

            if (remainingVelocity > 0) {
                (child as AppBarLayout).addOnOffsetChangedListener(object : AppBarLayout.OnOffsetChangedListener {
                    override fun onOffsetChanged(appBarLayout: AppBarLayout, verticalOffset: Int) {
                        // The AppBarLayout is now collapsed
                        if (verticalOffset == - appBarLayout.totalScrollRange) {
                            (target as RecyclerView).mViewFlinger.fling(velocityX.toInt(), remainingVelocity.toInt())
                            appBarLayout.post { appBarLayout.removeOnOffsetChangedListener(this) }
                        }
                    }
                })
            }

            // Trigger the expansion of the AppBarLayout
            super.onNestedFling(coordinatorLayout, child, target, velocityX, velocityY, false)
            // We don't let the RecyclerView fling already
            return true
        } else return super.onNestedPreFling(coordinatorLayout, child, target, velocityX, velocityY)
    }

    override fun onNestedPreScroll(coordinatorLayout: CoordinatorLayout?, child: AppBarLayout?, target: View?, dx: Int, dy: Int, consumed: IntArray?) {
        super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed)
        isPositive = dy > 0
    }

    private fun getFlingDistance(velocity: Int): Double {
        return splineOverScroller::class.java.getDeclaredMethod("getSplineFlingDistance", Int::class.javaPrimitiveType).apply {
            isAccessible = true
        }.invoke(splineOverScroller, velocity) as Double
    }

}

কীভাবে সেট করবেন?
এআরআর.এস

0

এটি আমার প্রকল্পে আমার সমাধান।
অ্যাকশন_ডাউন পাওয়ার সময় কেবলমাত্র এসক্রোলার বন্ধ করুন

XML:

    <android.support.design.widget.AppBarLayout
        android:id="@+id/smooth_app_bar_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/white"
        app:elevation="0dp"
        app:layout_behavior="com.sogou.groupwenwen.view.topic.FixAppBarLayoutBehavior">

ফিক্সএপবারলআউটআউটভিউয়ার.জভা:

    public boolean onInterceptTouchEvent(CoordinatorLayout parent, AppBarLayout child, MotionEvent ev) {
        if (ev.getAction() == ACTION_DOWN) {
            Object scroller = getSuperSuperField(this, "mScroller");
            if (scroller != null && scroller instanceof OverScroller) {
                OverScroller overScroller = (OverScroller) scroller;
                overScroller.abortAnimation();
            }
        }

        return super.onInterceptTouchEvent(parent, child, ev);
    }

    private Object getSuperSuperField(Object paramClass, String paramString) {
        Field field = null;
        Object object = null;
        try {
            field = paramClass.getClass().getSuperclass().getSuperclass().getDeclaredField(paramString);
            field.setAccessible(true);
            object = field.get(paramClass);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return object;
    }

//or check the raw file:
//https://github.com/shaopx/CoordinatorLayoutExample/blob/master/app/src/main/java/com/spx/coordinatorlayoutexample/util/FixAppBarLayoutBehavior.java

0

অ্যান্ড্রয়েডক্সের জন্য,

যদি আপনার ম্যানিফেস্ট ফাইলটিতে একটি অ্যান্ড্রয়েড থাকে: হার্ডওয়্যারঅ্যাক্সিলারেটেড = "মিথ্যা" লাইন, এটি মুছুন।

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