Заден план
В приложението Phone на Lollipop, когато стигнете до раздела „скорошни“ или „контакти“ и се опитате да превъртите, първото нещо, което се случва, е преоразмеряването на горната област, която се състои от скорошно събитие и поле за търсене като такова:
Ако имаше много повече от 3 елемента в RecyclerView, RecyclerView няма да превърти надолу, докато горната област може да бъде свита до минималния си размер.
Същото важи и за превъртането нагоре: докато горната област не е напълно увеличена, RecyclerView няма да превърта нагоре.
Проблемът
Не мога да намеря най-добрия начин за прилагане на тази функция.
По-конкретно, имам проблем с преоразмеряването на горната област, така че да бъде толкова гладко, колкото работи на Lollipop.
За да опростя, трябва да преоразмеря само една част от екрана, а не 2, както е показано в приложението на телефона („скорошното събитие“ и полето за търсене).
Това, което съм пробвал
Има няколко неща, които се опитах да направя:
направете RecyclerView да стане толкова голям, колкото целия екран, като същевременно има фалшив, голям, празен хедър. когато превъртам, също задавам "translationY" на истинското съдържание в горната част. Това има проблем с показването на лентата за превъртане като част от горната област (и искам да покажа лентата за превъртане на правилното място). Плюс това, това го прави доста сложно, тъй като трябва да обработвате и стойностите за превъртане на RecyclerViews на другите страници. Това е решение, подобно на някои библиотеки на трети страни, като тази a> (все пак тук използвах оформление, а не ImageView, но кодът е почти идентичен).
RecyclerView е под горната област и превъртането променя layoutParams на горната област, подобно на това, което направих в тази публикация< /силен>.
същото като 2, но вместо да променя LayoutParams, променям scaleY на изгледите.
Както за #2, така и за #3 проблемът е, че в някои случаи, веднага щом получа събитие за превъртане на +Y в някаква стойност, получавам също превъртане дори на -Y със същата стойност (и обратно) , правейки обработката на ефекта на преоразмеряване "скоклив" (нагоре и надолу, дори ако потребителят е превъртял добре).
Моето предположение защо това се случва е, че когато преместя RecyclerView, следващото събитие, направено от потребителя, е на напълно различна позиция от оригиналната, защото промених начина, по който RecyclerView е позициониран или неговия размер.
Опитах да използвам и двата < strong>setOnTouchListener (дори заедно с GestureDetectorCompat) и setOnScrollListener. Всички причиниха един и същ странен проблем.
Въпроса
Как да разреша този проблем? Защо се случва и защо не се случва винаги?
РЕДАКТИРАНЕ: Опитах се да променя #2, така че вместо да обработвам събитието за докосване на RecyclerView, ще обработвам събитията за докосване на неговия контейнер (някои LinearLayout). По някаква причина контейнерът не реагира на събития при докосване, така че го замених с RelativeLayout и поставих изглед върху всичко в това оформление, което ще реагира на събития при докосване (и съответно ще промени горната област). Това проработи, но след това не можах да предам събитията по-нататък към дъщерните изгледи, когато е необходимо.
Мисля, че най-доброто нещо е да персонализирате RecyclerView (да го разширите) при докосване. Може би добавете слушател за превъртане, че когато RecyclerView е на път да превърти, той ще попита дали е добре и ако не е, няма да се опита да превърти, докато не се задейства събитието за коригиране и не се нулира състоянието му.