{"id":266199,"date":"2015-09-23T09:23:02","date_gmt":"2015-09-23T05:23:02","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=266199"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=266199","title":{"rendered":"\u0420\u0435\u0446\u0435\u043f\u0442\u044b \u043f\u043e\u0434 Android: \u041a\u0430\u043a \u0432\u043a\u0443\u0441\u043d\u043e \u043f\u0440\u0438\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c LayoutManager"},"content":{"rendered":"<p>       \u041f\u0440\u0438\u0432\u0435\u0442 \u0445\u0430\u0431\u0440! <\/p>\n<p>  \u041c\u044b \u043b\u044e\u0431\u0438\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u043e\u0442 \u0441\u0432\u043e\u0438\u0445 \u0441\u043e\u0431\u0440\u0430\u0442\u044c\u0435\u0432 \u043a\u0430\u043a \u043f\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c, \u0442\u0430\u043a \u0438 \u043f\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0443. <a href=\"http:\/\/habrahabr.ru\/company\/eastbanctech\/blog\/263397\/\">\u0412 \u043f\u0440\u043e\u0448\u043b\u044b\u0439 \u0440\u0430\u0437<\/a> \u043c\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043b\u0438 \u043e \u043a\u043b\u0438\u0435\u043d\u0442-\u0441\u0435\u0440\u0432\u0435\u0440\u043d\u043e\u043c \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0438 \u0432 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u043d\u0430\u0448\u0438\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0430 \u0432 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u043f\u043e\u0434\u0435\u043b\u0438\u043c\u0441\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0435\u0433\u043e UI \u0444\u0438\u0447\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0433\u043e \u0441 \u043d\u0443\u043b\u044f LayoutManager. \u0414\u0443\u043c\u0430\u0435\u043c, \u0447\u0442\u043e \u0441\u0442\u0430\u0442\u044c\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u0430 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u043c \u0430\u043d\u0434\u0440\u043e\u0438\u0434-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c, \u043d\u043e \u0438 \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u043c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u0430\u043c.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/872\/ce9\/826\/872ce98265b171e705cc2340ed9487ce.png\"\/><br \/>  <a name=\"habracut\"><\/a><\/p>\n<h1>\u041d\u0430\u0447\u043d\u0451\u043c-\u0441<\/h1>\n<p>  \u0415\u0441\u043b\u0438 \u0432\u044b \u2014 android-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a, \u0442\u043e \u0432\u044b \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u0443\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 RecyclerView, \u043c\u043e\u0449\u043d\u0443\u044e \u0438 \u043d\u0435\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e \u043a\u0430\u0441\u0442\u043e\u043c\u0438\u0437\u0438\u0440\u0443\u0435\u043c\u0443\u044e \u0437\u0430\u043c\u0435\u043d\u0443 ListView \u0438 GridView. \u041e\u0434\u043d\u0430 \u0438\u0437 \u0441\u0442\u0435\u043f\u0435\u043d\u0435\u0439 \u043a\u0430\u0441\u0442\u043e\u043c\u0438\u0437\u0430\u0446\u0438\u0438 RecyclerView \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u043d \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0437\u043d\u0430\u0435\u0442 \u043e \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0435\u0431\u044f. \u042d\u0442\u0430 \u0440\u0430\u0431\u043e\u0442\u0430 \u0434\u0435\u043b\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0435\u0433\u043e LayoutManager\u2019\u0443. Google \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u043b \u043d\u0430\u043c 3 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0430: LinearLayoutManager \u0434\u043b\u044f \u0441\u043f\u0438\u0441\u043a\u043e\u0432 \u043a\u0430\u043a \u0432 ListView, GridLayoutManager \u0434\u043b\u044f \u043f\u043b\u0438\u0442\u043e\u043a, \u0441\u0435\u0442\u043e\u043a \u0438\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446 \u0438 StaggeredGridLayoutManager \u0434\u043b\u044f \u043b\u044d\u0439\u0430\u0443\u0442\u0430 \u043a\u0430\u043a \u0432 Google+. \u0414\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043b\u044d\u0439\u0430\u0443\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u0432\u043f\u0438\u0441\u044b\u0432\u0430\u043b\u0441\u044f \u0432 \u0440\u0430\u043c\u043a\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u043b\u044d\u0439\u0430\u0443\u0442 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u043e\u0432, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0439. \u041e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0439 LayoutManager \u043f\u043e\u0434\u043e\u0431\u043d\u043e \u043d\u0430\u0440\u043a\u043e\u0442\u0438\u043a\u0443. \u041e\u0434\u043d\u0430\u0436\u0434\u044b \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0432, \u0443\u0436\u0435 \u0441\u043b\u043e\u0436\u043d\u043e \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f \u2014 \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u043e\u043d \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c \u043f\u0440\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u0432\u0435\u0440\u0441\u0442\u043a\u0438.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/0aa\/df7\/979\/0aadf797930068c4cb20f5ff8abeffe5.gif\" alt=\"image\"\/><\/p>\n<p>  \u0418\u0442\u0430\u043a, \u0437\u0430\u0434\u0430\u0447\u0430. \u0412 \u043d\u0430\u0448\u0435\u043c \u0443\u0447\u0435\u0431\u043d\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0431\u0443\u0434\u0443\u0442 \u0441\u0442\u0430\u0442\u044c\u0438 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0430: \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430, \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0438 \u0442\u0435\u043a\u0441\u0442. \u041c\u044b \u0445\u043e\u0442\u0438\u043c \u0438\u043c\u0435\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u0442\u0430\u0442\u0435\u0439, \u043a\u0430\u0436\u0434\u0430\u044f \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0430 \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c 75% \u043e\u0442 \u0432\u044b\u0441\u043e\u0442\u044b \u044d\u043a\u0440\u0430\u043d\u0430. \u041f\u043e\u043c\u0438\u043c\u043e \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e, \u0431\u0443\u0434\u0435\u0442 \u0438 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043a\u0430\u0436\u0434\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043a\u0440\u044b\u0442\u0430 \u043d\u0430 \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d. \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0438\u0437 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0435\u0436\u0438\u043c\u0430 \u0432 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u0430\u043d\u0438\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u043f\u043e \u043a\u043b\u0438\u043a\u0443 \u043d\u0430 \u043a\u0430\u043a\u0443\u044e-\u043b\u0438\u0431\u043e \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0443 \u0438 \u043a\u043d\u043e\u043f\u043a\u043e\u0439 back \u2014 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439. \u0410 \u0435\u0449\u0435, \u0434\u043b\u044f \u043a\u0440\u0430\u0441\u043e\u0442\u044b, \u0432 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 \u043d\u0438\u0436\u043d\u044f\u044f \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0430 \u043f\u0440\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0435\u0437\u0436\u0430\u0442\u044c \u0441 \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u043c \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u041a\u0441\u0442\u0430\u0442\u0438, \u043d\u0430\u0448 \u0443\u0447\u0435\u0431\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0437\u0434\u0435\u0441\u044c: <a href=\"https:\/\/github.com\/forceLain\/AwesomeRecyclerView\">https:\/\/github.com\/forceLain\/AwesomeRecyclerView<\/a>, \u0432 \u043d\u0451\u043c \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0444\u044d\u0439\u043a\u043e\u0432\u044b\u0439 DataProvider, \u0432\u043e\u0437\u0440\u0430\u0449\u0430\u044e\u0449\u0438\u0439 5 \u043d\u0435\u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0445 \u0441\u0442\u0430\u0442\u0435\u0439, \u0432\u0441\u0435 \u043b\u044d\u0439\u0430\u0443\u0442\u044b \u0438, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0441\u0430\u043c LayoutManager \ud83d\ude42<br \/>  \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c, \u0447\u0442\u043e Activity \u0441 RecyclerView \u0432 \u043d\u0435\u0439, \u0430 \u0442\u0430\u043a\u0436\u0435 RecyclerView.Adapter, \u0441\u043e\u0437\u0434\u0430\u044e\u0449\u0438\u0439 \u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0438\u0439 \u0441\u0442\u0430\u0442\u044c\u0438-\u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u043c\u044b \u0443\u0436\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 (\u0438\u043b\u0438 \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0438\u0437 \u0443\u0447\u0435\u0431\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430) \u0438 \u043f\u0440\u0438\u0448\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0439 LayoutManager.<\/p>\n<h1>\u041f\u0438\u0448\u0435\u043c \u043e\u0441\u043d\u043e\u0432\u0443<\/h1>\n<p>  \u041f\u0435\u0440\u0432\u043e\u0435, \u0447\u0442\u043e \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u2014 \u044d\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 generateDefaultLayoutParams(), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0435 LayoutParams \u0434\u043b\u044f views, \u0447\u044c\u0438 LayoutParams \u043d\u0430\u043c \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0442<\/p>\n<pre><code class=\"java\">public class AwesomeLayoutManager extends RecyclerView.LayoutManager {     @Override     public RecyclerView.LayoutParams generateDefaultLayoutParams() {         return new RecyclerView.LayoutParams(RecyclerView.LayoutParams.MATCH_PARENT, RecyclerView.LayoutParams.MATCH_PARENT);     } } <\/code><\/pre>\n<p>  \u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u043c\u0430\u0433\u0438\u044f \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 onLayoutChildren(&#8230;), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u0447\u043a\u043e\u0439 \u0441\u0442\u0430\u0440\u0442\u0430 \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0438 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430\u0448\u0438\u0445 \u0432\u044c\u044e\u0448\u0435\u043a. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u0443\u0447\u0438\u043c\u0441\u044f \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0442\u044c \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u043d\u0443 \u0441\u0442\u0430\u0442\u044c\u044e. <\/p>\n<pre><code class=\"java\">@Override public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {     View view = recycler.getViewForPosition(0);     addView(view);     measureChildWithMargins(view, 0, 0);     layoutDecorated(view, 0, 0, getWidth(), getHeight()); } <\/code><\/pre>\n<p>  \u0412 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u0447\u043a\u0435 \u043c\u044b \u043f\u0440\u043e\u0441\u0438\u043c recycler \u0434\u0430\u0442\u044c \u043d\u0430\u043c view \u0434\u043b\u044f \u043f\u0435\u0440\u0432\u043e\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u0438. \u0417\u0430\u0442\u0435\u043c, Recycler \u0441\u0430\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043b\u0438 \u0435\u0451 \u0438\u0437 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0433\u043e \u043a\u044d\u0448\u0430 \u0438\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u0443\u044e. \u041d\u0430 \u0432\u0442\u043e\u0440\u043e\u0439 \u0441\u0442\u0440\u043e\u0447\u043a\u0435 \u0437\u0430\u0434\u0435\u0440\u0436\u0438\u043c\u0441\u044f \u043f\u043e\u0434\u043e\u043b\u044c\u0448\u0435.<\/p>\n<p>  \u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u0443\u0436\u0435 \u0434\u043e\u0432\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 view, \u0432\u044b \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u0437\u043d\u0430\u0435\u0442\u0435 \u043a\u0430\u043a \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0432\u043e\u0435\u0439 view \u0435\u0449\u0435 \u043e\u0434\u043d\u0443 \u0434\u043e\u0447\u0435\u0440\u043d\u044e\u044e. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u044e\u044e view \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u0441\u0432\u043e\u0439 layout (\u043a\u0430\u043a \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u0441\u0442\u0440\u043e\u0447\u043a\u0435), \u0437\u0430\u0442\u0435\u043c \u0438\u0437\u043c\u0435\u0440\u0438\u0442\u044c, \u0432\u044b\u0437\u0432\u0430\u0432 \u0443 \u043d\u0435\u0451 \u043c\u0435\u0442\u043e\u0434 measure(&#8230;) \u0438, \u0432 \u043a\u043e\u043d\u0446\u0435 \u043a\u043e\u043d\u0446\u043e\u0432, \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0432 \u043d\u0443\u0436\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435, \u0432\u044b\u0437\u0432\u0430\u0432 \u0443 \u043d\u0435\u0451 \u043c\u0435\u0442\u043e\u0434 layout(&#8230;) \u0441 \u043d\u0443\u0436\u043d\u044b\u043c\u0438 \u0440\u0430\u0437\u043c\u0435\u0440\u0430\u043c\u0438. \u0415\u0441\u043b\u0438 \u0436\u0435 \u0432\u044b \u0435\u0449\u0435 \u043d\u0438 \u0440\u0430\u0437\u0443 \u043d\u0435 \u0434\u0435\u043b\u0430\u043b\u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0433\u043e, \u0442\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u044b \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0435, \u043a\u0430\u043a \u044d\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \ud83d\ude42 \u0427\u0442\u043e \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f RecyclerView, \u0437\u0434\u0435\u0441\u044c \u0434\u0435\u043b\u043e \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0434\u0440\u0443\u0433\u043e\u0439 \u043e\u0431\u043e\u0440\u043e\u0442. \u041f\u043e\u0447\u0442\u0438 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 View-\u043a\u043b\u0430\u0441\u0441\u0430, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0441 \u0440\u0430\u0437\u043c\u0435\u0440\u0430\u043c\u0438 \u0438 \u043b\u044d\u0439\u0430\u0443\u0442\u043e\u043c \u0443 RecyclerView \u0435\u0441\u0442\u044c \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438 \u043d\u0443\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c. \u041f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e \u043e\u043d\u0438 \u043d\u0443\u0436\u043d\u044b \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0432 RecyclerView \u0435\u0441\u0442\u044c \u043a\u043b\u0430\u0441\u0441 ItemDecoration, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043c\u0435\u043d\u044f\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u0432\u044c\u044e\u0448\u0435\u043a, \u0430 \u044d\u0442\u0438 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0431\u0435\u0440\u0443\u0442 \u0432 \u0440\u0430\u0441\u0447\u0435\u0442 \u0432\u0441\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440\u044b.<br \/>  \u0412\u043e\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432:<\/p>\n<pre><code class=\"java\">view.layout(left, top, right, bottom) -&gt; layoutDecorated(view, left, top, right, bottom) view.getLeft() -&gt; getDecoratedLeft(view) view.getWidth() -&gt; getDecoratedWidth(view) <\/code><\/pre>\n<p>  \u0438 \u0442.\u0434.<\/p>\n<p>  \u0418\u0442\u0430\u043a, \u0432 \u0442\u0440\u0435\u0442\u0435\u0439 \u0441\u0442\u0440\u043e\u0447\u043a\u0435 \u043c\u044b \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u043c \u0432\u044c\u044e\u0448\u043a\u0435 \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u0440\u0430\u0437\u043c\u0435\u0440\u044b, \u0430 \u0432 \u0447\u0435\u0442\u0432\u0435\u0440\u0442\u043e\u0439 \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u043c \u0435\u0451 \u0432 \u043b\u044d\u0439\u0430\u0443\u0442\u0435 \u043e\u0442 \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u043b\u0435\u0432\u043e\u0433\u043e \u0443\u0433\u043b\u0430 (0, 0) \u0434\u043e \u043d\u0438\u0436\u043d\u0435\u0433\u043e \u043f\u0440\u0430\u0432\u043e\u0433\u043e (getWidth(), getHeight()).<br \/>  \u0414\u043b\u044f \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432 \u0432\u044c\u044e\u0448\u043a\u0438 \u043c\u044b \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u0433\u043e\u0442\u043e\u0432\u044b\u043c \u043c\u0435\u0442\u043e\u0434\u043e\u043c measureChildWithMargins(&#8230;). \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043e\u043d \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0430\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f, \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044f \u0432 \u0440\u0430\u0441\u0447\u0435\u0442 \u0448\u0438\u0440\u0438\u043d\u0443 \u0438 \u0432\u044b\u0441\u043e\u0442\u0443, \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u0443\u044e \u0432 LayoutParams \u0443 \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0439 \u0432\u044c\u044e\u0448\u043a\u0438. \u0410 \u0442\u0430\u043c \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0447\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e: wrap_content, match_parent \u0438\u043b\u0438 \u0434\u0430\u0436\u0435 \u0437\u0430\u0434\u0430\u043d \u0432 dp. \u041d\u043e \u043c\u044b \u0442\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u043b\u0438\u0441\u044c, \u0447\u0442\u043e \u0432\u0441\u0435 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0443\u0442 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430! \u0422\u0430\u043a \u0447\u0442\u043e \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043d\u0430\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0439 measure, \u043d\u0435 \u0437\u0430\u0431\u044b\u0432 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u0440\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440\u043e\u0432:<\/p>\n<pre><code class=\"java\">private void measureChildWithDecorationsAndMargin(View child, int widthSpec, int heightSpec) {     Rect decorRect = new Rect();     calculateItemDecorationsForChild(child, decorRect);     RecyclerView.LayoutParams lp = (RecyclerView.LayoutParams) child.getLayoutParams();     widthSpec = updateSpecWithExtra(widthSpec, lp.leftMargin + decorRect.left,             lp.rightMargin + decorRect.right);     heightSpec = updateSpecWithExtra(heightSpec, lp.topMargin + decorRect.top,                 lp.bottomMargin + decorRect.bottom);     child.measure(widthSpec, heightSpec); }  private int updateSpecWithExtra(int spec, int startInset, int endInset) {     if (startInset == 0 && endInset == 0) {         return spec;     }     final int mode = View.MeasureSpec.getMode(spec);     if (mode == View.MeasureSpec.AT_MOST || mode == View.MeasureSpec.EXACTLY) {         return View.MeasureSpec.makeMeasureSpec(                 View.MeasureSpec.getSize(spec) - startInset - endInset, mode);     }     return spec; } <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0448 onLayoutChildren() \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"java\">@Override public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {     View view = recycler.getViewForPosition(0);     addView(view);     final int widthSpec = View.MeasureSpec.makeMeasureSpec(getWidth(), View.MeasureSpec.EXACTLY);     final int heightSpec = View.MeasureSpec.makeMeasureSpec(getHeight(), View.MeasureSpec.EXACTLY);     measureChildWithDecorationsAndMargin(view, widthSpec, heightSpec);     layoutDecorated(view, 0, 0, getWidth(), getHeight()); } <\/code><\/pre>\n<p>  \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e MeasureSpec \u043c\u044b \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u043c \u043d\u0430\u0448\u0435\u0439 view, \u0447\u0442\u043e \u0435\u0451 \u0432\u044b\u0441\u043e\u0442\u0430 \u0438 \u0448\u0438\u0440\u0438\u043d\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0438 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u043d\u0430 \u0432\u044b\u0441\u043e\u0442\u0435 \u0438 \u0448\u0438\u0440\u0438\u043d\u0435 RecyclerView. \u0420\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u044e \u0432\u044b\u0441\u043e\u0442\u043e\u0439 \u0432 75% \u0432\u044b\u0441\u043e\u0442\u044b \u044d\u043a\u0440\u0430\u043d\u0430, \u043d\u0443\u0436\u043d\u043e \u0432 layoutDecorated() \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u044d\u0442\u0443 \u0441\u0430\u043c\u0443\u044e \u0432\u044b\u0441\u043e\u0442\u0443:<\/p>\n<pre><code class=\"java\">private static final float VIEW_HEIGHT_PERCENT = 0.75f;  @Override public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {     View view = recycler.getViewForPosition(0);     addView(view);     int viewHeight = (int) (getHeight() * VIEW_HEIGHT_PERCENT);     final int widthSpec = View.MeasureSpec.makeMeasureSpec(getWidth(), View.MeasureSpec.EXACTLY);     final int heightSpec = View.MeasureSpec.makeMeasureSpec(getHeight(), View.MeasureSpec.EXACTLY);     measureChildWithDecorationsAndMargin(view, widthSpec, heightSpec);     layoutDecorated(view, 0, 0, getWidth(), viewHeight); } <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c, \u0435\u0441\u043b\u0438 \u043c\u044b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u043d\u0430\u0448 LayoutManager \u0432 RecyclerView \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u043f\u0440\u043e\u0435\u043a\u0442 \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c \u043e\u0434\u043d\u0443 \u0441\u0442\u0430\u0442\u044c\u044e \u043d\u0430 \u0442\u0440\u0438 \u0447\u0435\u0442\u0432\u0435\u0440\u0442\u0438 \u044d\u043a\u0440\u0430\u043d\u0430<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/e39\/bba\/cd2\/e39bbacd2711829d74f984b01b564157.png\"\/><\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0432\u044e\u0448\u043a\u0438-\u0441\u0442\u0430\u0442\u044c\u0438, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u043f\u0435\u0440\u0432\u043e\u0439 (\u043d\u0443\u043b\u0435\u0432\u043e\u0439) \u0438 \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u044f \u0438\u0445 \u0434\u0440\u0443\u0433 \u043f\u043e\u0434 \u0434\u0440\u0443\u0433\u043e\u043c, \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043a\u043e\u043d\u0447\u0438\u0442\u0441\u044f \u044d\u043a\u0440\u0430\u043d \u043f\u043e \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u0438 \u0438\u043b\u0438 \u043d\u0435 \u043a\u043e\u043d\u0447\u0430\u0442\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u0430\u0434\u0430\u043f\u0442\u0435\u0440\u0435.<\/p>\n<pre><code class=\"java\">@Override public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {     fillDown(recycler); }  private void fillDown(RecyclerView.Recycler recycler) {     int pos = 0;     boolean fillDown = true;     int height = getHeight();     int viewTop = 0;     int itemCount = getItemCount();     int viewHeight = (int) (getHeight() * VIEW_HEIGHT_PERCENT);     final int widthSpec = View.MeasureSpec.makeMeasureSpec(getWidth(), View.MeasureSpec.EXACTLY);     final int heightSpec = View.MeasureSpec.makeMeasureSpec(getHeight(), View.MeasureSpec.EXACTLY);      while (fillDown && pos &lt; itemCount){         View view = recycler.getViewForPosition(pos);         addView(view);         measureChildWithDecorationsAndMargin(view, widthSpec, heightSpec);         int decoratedMeasuredWidth = getDecoratedMeasuredWidth(view);         layoutDecorated(view, 0, viewTop, decoratedMeasuredWidth, viewTop + viewHeight);         viewTop = getDecoratedBottom(view);         fillDown = viewTop &lt;= height;         pos++;     } } <\/code><\/pre>\n<p>  <img decoding=\"async\" src=\"https:\/\/raw.githubusercontent.com\/forceLain\/storage\/master\/wp3.png\"\/><\/p>\n<p>  \u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0433\u043e\u0442\u043e\u0432\u044b\u043c, \u043e\u0434\u043d\u0430\u043a\u043e \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u043c\u044b \u043d\u0435 \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u043e\u0434\u043d\u0443 \u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u0443\u044e \u0432\u0435\u0449\u044c. \u0420\u0430\u043d\u0435\u0435 \u043c\u044b \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u0438, \u0447\u0442\u043e recycler \u0441\u0430\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442, \u0431\u0440\u0430\u0442\u044c \u043b\u0438 \u0435\u043c\u0443 \u0432\u044c\u044e\u0448\u043a\u0438 \u0438\u0437 \u043a\u044d\u0448\u0430 \u043b\u0438\u0431\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435, \u043d\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0442\u043e \u0434\u0435\u043b\u0435 \u043a\u044d\u0448 \u0443 \u043d\u0435\u0433\u043e \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u043f\u0443\u0441\u0442, \u0442\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u0432 \u043d\u0435\u0433\u043e \u0435\u0449\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u043e\u043b\u043e\u0436\u0438\u043b\u0438. \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0432\u044b\u0437\u043e\u0432 detachAndScrapAttachedViews(recycler) \u0432 onLayoutChildren() \u043d\u0430 \u043f\u0435\u0440\u0432\u043e\u0435 \u043c\u0435\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0434 fillDown().<\/p>\n<pre><code class=\"java\">@Override public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {     detachAndScrapAttachedViews(recycler);    fillDown(recycler); } <\/code><\/pre>\n<p>  \u042d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0443\u0431\u0438\u0440\u0430\u0435\u0442 \u0432\u0441\u0435 view \u0438\u0437 \u043d\u0430\u0448\u0435\u0433\u043e \u043b\u044d\u0439\u0430\u0443\u0442\u0430 \u0438 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442 \u0438\u0445 \u0432 \u0441\u0432\u043e\u0439 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 scrap-\u043a\u044d\u0448. \u041f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043c\u043e\u0436\u043d\u043e \u0432\u0435\u0440\u043d\u0443\u0442\u044c view, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043c\u0435\u0442\u043e\u0434 recycler.getViewForPosition(pos).<\/p>\n<h1>They See Me Rollin&#8217;<\/h1>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0445\u043e\u0440\u043e\u0448\u043e \u0431\u044b \u043d\u0430\u0443\u0447\u0438\u0442\u044c \u043d\u0430\u0448 LayoutManager \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u0442\u044c\u0441\u044f.<br \/>  \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0441\u043a\u0430\u0436\u0435\u043c \u043d\u0430\u0448\u0435\u043c\u0443 LayoutManager\u2019\u0443, \u0447\u0442\u043e \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u043e \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u0438:<\/p>\n<pre><code class=\"java\">@Override public boolean canScrollVertically() {     return true; } <\/code><\/pre>\n<p>  \u0417\u0430\u0442\u0435\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0441\u0430\u043c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043a\u0440\u043e\u043b\u043b<\/p>\n<pre><code class=\"java\">@Override public int scrollVerticallyBy(int dy, RecyclerView.Recycler recycler, RecyclerView.State state) {     offsetChildrenVertical(-dy);     return dy; } <\/code><\/pre>\n<p>  \u041d\u0430 \u0432\u0445\u043e\u0434 \u044d\u0442\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c dy \u2014 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u043a\u0440\u043e\u043b\u043b\u0438\u0442\u044c. \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0442\u043e \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u0438\u043b\u0438 \u043d\u0430\u0448\u0438 \u0432\u044c\u044e\u0448\u043a\u0438. \u042d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0431\u044b \u043d\u0435 \u0434\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0443 \u0443\u0435\u0445\u0430\u0442\u044c \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u044d\u043a\u0440\u0430\u043d\u0430. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0440\u0430\u0437\u0443 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0449\u0438\u0439 \u043c\u043e\u0436\u0435\u043c \u043b\u0438 \u043c\u044b \u0435\u0449\u0435 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u0442\u044c \u0438 \u043d\u0430 \u043a\u0430\u043a\u043e\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435:<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">Scrolling<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"java\">@Override public int scrollVerticallyBy(int dy, RecyclerView.Recycler recycler, RecyclerView.State state) {     int delta = scrollVerticallyInternal(dy);     offsetChildrenVertical(-delta);     return delta; }  private int scrollVerticallyInternal(int dy) {     int childCount = getChildCount();     int itemCount = getItemCount();     if (childCount == 0){         return 0;     }      final View topView = getChildAt(0);     final View bottomView = getChildAt(childCount - 1);      \/\/\u0421\u043b\u0443\u0447\u0430\u0439, \u043a\u043e\u0433\u0434\u0430 \u0432\u0441\u0435 \u0432\u044c\u044e\u0448\u043a\u0438 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u043b\u0438\u0441\u044c \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435     int viewSpan = getDecoratedBottom(bottomView) - getDecoratedTop(topView);     if (viewSpan &lt;= getHeight()) {         return 0;     }      int delta = 0;     \/\/\u0435\u0441\u043b\u0438 \u043a\u043e\u043d\u0442\u0435\u043d\u0442 \u0443\u0435\u0437\u0436\u0430\u0435\u0442 \u0432\u043d\u0438\u0437     if (dy &lt; 0){         View firstView = getChildAt(0);         int firstViewAdapterPos = getPosition(firstView);         if (firstViewAdapterPos &gt; 0){ \/\/\u0435\u0441\u043b\u0438 \u0432\u0435\u0440\u0445\u043d\u044f\u044f \u0432\u044e\u0448\u043a\u0430 \u043d\u0435 \u0441\u0430\u043c\u0430\u044f \u043f\u0435\u0440\u0432\u0430\u044f \u0432 \u0430\u0434\u0430\u043f\u0442\u0435\u0440\u0435             delta = dy;         } else { \/\/\u0435\u0441\u043b\u0438 \u0432\u0435\u0440\u0445\u043d\u044f\u044f \u0432\u044c\u044e\u0448\u043a\u0430 \u0441\u0430\u043c\u0430\u044f \u043f\u0435\u0440\u0432\u0430\u044f \u0432 \u0430\u0434\u0430\u043f\u0442\u0435\u0440\u0435 \u0438 \u0432\u044b\u0448\u0435 \u0432\u044c\u044e\u0448\u0435\u043a \u0431\u043e\u043b\u044c\u0448\u0435 \u0431\u044b\u0442\u044c \u043d\u0435 \u043c\u043e\u0436\u0435\u0442             int viewTop = getDecoratedTop(firstView);             delta = Math.max(viewTop, dy);         }     } else if (dy &gt; 0){ \/\/\u0435\u0441\u043b\u0438 \u043a\u043e\u043d\u0442\u0435\u043d\u0442 \u0443\u0435\u0437\u0436\u0430\u0435\u0442 \u0432\u0432\u0435\u0440\u0445         View lastView = getChildAt(childCount - 1);         int lastViewAdapterPos = getPosition(lastView);         if (lastViewAdapterPos &lt; itemCount - 1){ \/\/\u0435\u0441\u043b\u0438 \u043d\u0438\u0436\u043d\u044f\u044f \u0432\u044e\u0448\u043a\u0430 \u043d\u0435 \u0441\u0430\u043c\u0430\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0432 \u0430\u0434\u0430\u043f\u0442\u0435\u0440\u0435             delta = dy;         } else { \/\/\u0435\u0441\u043b\u0438 \u043d\u0438\u0436\u043d\u044f\u044f \u0432\u044c\u044e\u0448\u043a\u0430 \u0441\u0430\u043c\u0430\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0432 \u0430\u0434\u0430\u043f\u0442\u0435\u0440\u0435 \u0438 \u043d\u0438\u0436\u0435 \u0432\u044c\u044e\u0448\u0435\u043a \u0431\u043e\u043b\u044c\u0448\u0435 \u0431\u044b\u0442\u044c \u043d\u0435 \u043c\u043e\u0436\u0435\u0442             int viewBottom = getDecoratedBottom(lastView);             int parentBottom = getHeight();             delta = Math.min(viewBottom - parentBottom, dy);         }     }     return delta; } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0441\u043a\u0440\u043e\u043b\u043b\u0438\u0442\u044c \u043d\u0430\u0448\u0438 2 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0441\u0442\u0430\u0442\u044c\u0438, \u043d\u043e \u043f\u0440\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u043d\u0438\u0438 \u043d\u043e\u0432\u044b\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d \u043d\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f. \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u044b\u0445 \u0432\u044c\u044e\u0448\u0435\u043a \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0441\u043a\u0440\u043e\u043b\u043b\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u0437\u0430\u043a\u043e\u0432\u044b\u0440\u0438\u0441\u0442\u044b\u043c, \u043d\u043e \u044d\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434. \u041f\u043e\u043f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0435\u0433\u043e \u0441\u043b\u043e\u0432\u0430\u043c\u0438:  <\/p>\n<ol>\n<li>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u043c \u0432\u0441\u0435 \u0438\u043c\u0435\u044e\u0449\u0438\u0435\u0441\u044f \u0432\u044c\u044e\u0448\u043a\u0438 \u043d\u0430 dy \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e offsetChildrenVertical(-dy)<\/li>\n<li>\u0412\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u043e\u0434\u043d\u0443 \u0438\u0437 \u0438\u043c\u0435\u044e\u0449\u0438\u0445\u0441\u044f \u0432 \u043b\u044d\u0439\u0430\u0443\u0442\u0435 \u0432\u044c\u044e\u0448\u0435\u043a \u043a\u0430\u043a \u201c\u044f\u043a\u043e\u0440\u043d\u0443\u044e\u201d \u0438 \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c \u0435\u0451 \u0438 \u0435\u0451 \u043f\u043e\u0437\u0438\u0446\u0438\u044e. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u044f\u043a\u043e\u0440\u043d\u043e\u0439 \u0432\u044c\u044e\u0448\u043a\u0438 \u0442\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0432\u0438\u0434\u043d\u0430 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435. \u0415\u0441\u043b\u0438 \u0442\u0430\u043a\u043e\u0439 \u043d\u0435\u0442, \u0442\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0442\u0443, \u0432\u0438\u0434\u0438\u043c\u0430\u044f \u043f\u043b\u043e\u0449\u0430\u0434\u044c \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430. \u0422\u0430\u043a\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u044f\u043a\u043e\u0440\u043d\u043e\u0439 \u0432\u044c\u044e\u0448\u043a\u0438 \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u043c \u0438 \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c, \u043f\u0440\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u043c\u0435\u043d\u044b \u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043d\u0430\u0448\u0435\u0433\u043e \u043b\u044d\u0439\u0430\u0443\u0442-\u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0430<\/li>\n<li>\u0423\u0431\u0438\u0440\u0430\u0435\u043c \u0432\u0441\u0435 \u0438\u043c\u0435\u044e\u0449\u0438\u0435\u0441\u044f \u0432 \u043b\u044d\u0439\u0430\u0443\u0442\u0435 \u0432\u044c\u044e\u0448\u043a\u0438, \u043f\u043e\u043c\u0435\u0449\u0430\u044f \u0438\u0445 \u0432 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043a\u044d\u0448 \u0438 \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u044f \u043d\u0430 \u043a\u0430\u043a\u0438\u0445 \u043f\u043e\u0437\u0438\u0446\u0438\u044f\u0445 \u043e\u043d\u0438 \u0431\u044b\u043b\u0438<\/li>\n<li>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u043b\u044d\u0439\u0430\u0443\u0442 \u0432\u044c\u044e\u0448\u043a\u0438 \u0432\u044b\u0448\u0435 \u0442\u043e\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0432\u0437\u044f\u043b\u0438 \u0437\u0430 \u044f\u043a\u043e\u0440\u043d\u0443\u044e. \u041f\u043e\u0442\u043e\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u044f\u043a\u043e\u0440\u043d\u0443\u044e \u0438 \u0432\u0441\u0451, \u0447\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u043d\u0438\u0436\u0435 \u043d\u0435\u0451. \u0412\u044c\u044e\u0448\u043a\u0438 \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0431\u0435\u0440\u0435\u043c \u0438\u0437 \u0441\u0432\u043e\u0435\u0433\u043e \u043a\u044d\u0448\u0430 \u0438, \u0435\u0441\u043b\u0438 \u043d\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u043c, \u043f\u0440\u043e\u0441\u0438\u043c \u0443 recycler<\/li>\n<\/ol>\n<p>  <i>\u041f\u0420\u0418\u041c\u0415\u0427\u0410\u041d\u0418\u0415: \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043a\u0440\u043e\u043b\u043b\u0430 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 view \u0432 \u043b\u044d\u0439\u0430\u0443\u0442 \u2014 \u0434\u0435\u043b\u043e \u0438\u043d\u0434\u0438\u0432\u0438\u0434\u0443\u0430\u043b\u044c\u043d\u043e\u0435. \u0421 \u0442\u0435\u043c \u0436\u0435 \u0443\u0441\u043f\u0435\u0445\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0432\u0437\u044f\u0442\u044c \u0437\u0430 \u044f\u043a\u043e\u0440\u043d\u0443\u044e \u0432\u044c\u044e\u0448\u043a\u0443 \u0441\u0430\u043c\u0443\u044e \u0432\u0435\u0440\u0445\u043d\u044e\u044e \u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u044d\u043a\u0440\u0430\u043d \u0432\u043d\u0438\u0437 \u043e\u0442 \u043d\u0435\u0451. \u0410 \u0435\u0441\u043b\u0438 \u0431\u044b \u0432\u044b \u0445\u043e\u0442\u0435\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0439 LayoutManager, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u0435\u0434\u0435\u0442 \u0441\u0435\u0431\u044f \u043a\u0430\u043a ViewPager, \u0432\u0430\u043c \u0431\u044b \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0432\u044c\u044e\u0448\u043a\u0438 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438, \u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043f\u0435\u0440\u0435\u0440\u044b\u0432\u0430\u0445 \u043c\u0435\u0436\u0434\u0443 \u0441\u0432\u0430\u0439\u043f\u0430\u043c\u0438.<\/i><\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">Scrolling + Recycling<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"java\">    private SparseArray&lt;View&gt; viewCache = new SparseArray&lt;&gt;();       @Override     public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {         detachAndScrapAttachedViews(recycler);         fill(recycler);     }      private void fill(RecyclerView.Recycler recycler) {          View anchorView = getAnchorView();         viewCache.clear();                  \/\/\u041f\u043e\u043c\u0435\u0449\u0430\u0435\u043c \u0432\u044c\u044e\u0448\u043a\u0438 \u0432 \u043a\u044d\u0448 \u0438...         for (int i = 0, cnt = getChildCount(); i &lt; cnt; i++) {             View view = getChildAt(i);             int pos = getPosition(view);             viewCache.put(pos, view);         }          \/\/... \u0438 \u0443\u0434\u0430\u043b\u044f\u043c \u0438\u0437 \u043b\u044d\u0439\u0430\u0443\u0442\u0430         for (int i = 0; i &lt; viewCache.size(); i++) {             detachView(viewCache.valueAt(i));         }          fillUp(anchorView, recycler);         fillDown(anchorView, recycler);          \/\/\u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u043a\u043e\u0440\u0437\u0438\u043d\u0443 \u0432\u0441\u0451, \u0447\u0442\u043e \u043d\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u0432 \u044d\u0442\u043e\u043c \u0446\u0438\u043a\u043b\u0435 \u043b\u044d\u0439\u0430\u0443\u0442\u0430         \/\/\u044d\u0442\u0438 \u0432\u044c\u044e\u0448\u043a\u0438 \u0438\u043b\u0438 \u0443\u0448\u043b\u0438 \u0437\u0430 \u044d\u043a\u0440\u0430\u043d \u0438\u043b\u0438 \u043d\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u043b\u0438\u0441\u044c, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b          \/\/\u0443\u0434\u0430\u043b\u0438\u043b\u0438\u0441\u044c \u0438\u0437 \u0430\u0434\u0430\u043f\u0442\u0435\u0440\u0430         for (int i=0; i &lt; viewCache.size(); i++) {             recycler.recycleView(viewCache.valueAt(i));         }      }      private void fillUp(@Nullable View anchorView, RecyclerView.Recycler recycler) {         int anchorPos = 0;         int anchorTop = 0;         if (anchorView != null){             anchorPos = getPosition(anchorView);             anchorTop = getDecoratedTop(anchorView);         }          boolean fillUp = true;         int pos = anchorPos - 1;         int viewBottom = anchorTop; \/\/\u043d\u0438\u0436\u043d\u044f\u044f \u0433\u0440\u0430\u043d\u0438\u0446\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0432\u044c\u044e\u0448\u043a\u0438 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0447\u0438\u0442\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u0432\u0435\u0440\u0445\u043d\u0435\u0439 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439         int viewHeight = (int) (getHeight() * VIEW_HEIGHT_PERCENT);         final int widthSpec = View.MeasureSpec.makeMeasureSpec(getWidth(), View.MeasureSpec.EXACTLY);         final int heightSpec = View.MeasureSpec.makeMeasureSpec(viewHeight, View.MeasureSpec.EXACTLY);         while (fillUp && pos &gt;= 0){             View view = viewCache.get(pos); \/\/\u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043a\u044d\u0448             if (view == null){                  \/\/\u0435\u0441\u043b\u0438 \u0432\u044c\u044e\u0448\u043a\u0438 \u043d\u0435\u0442 \u0432 \u043a\u044d\u0448\u0435 - \u043f\u0440\u043e\u0441\u0438\u043c \u0443 recycler \u043d\u043e\u0432\u0443\u044e, \u0438\u0437\u043c\u0435\u0440\u044f\u0435\u043c \u0438 \u043b\u044d\u0439\u0430\u0443\u0442\u0438\u043c \u0435\u0451                 view = recycler.getViewForPosition(pos);                 addView(view, 0);                 measureChildWithDecorationsAndMargin(view, widthSpec, heightSpec);                 int decoratedMeasuredWidth = getDecoratedMeasuredWidth(view);                 layoutDecorated(view, 0, viewBottom - viewHeight, decoratedMeasuredWidth, viewBottom);             } else {                 \/\/\u0435\u0441\u043b\u0438 \u0432\u044c\u044e\u0448\u043a\u0430 \u0435\u0441\u0442\u044c \u0432 \u043a\u044d\u0448\u0435 - \u043f\u0440\u043e\u0441\u0442\u043e \u0430\u0442\u0442\u0430\u0447\u0438\u043c \u0435\u0451 \u043e\u0431\u0440\u0430\u0442\u043d\u043e                 \/\/\u043d\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c measure\/layout \u0446\u0438\u043a\u043b.                 attachView(view);                 viewCache.remove(pos);             }             viewBottom = getDecoratedTop(view);             fillUp = (viewBottom &gt; 0);             pos--;         }     }      private void fillDown(@Nullable View anchorView, RecyclerView.Recycler recycler) {         int anchorPos = 0;         int anchorTop = 0;         if (anchorView != null){             anchorPos = getPosition(anchorView);             anchorTop = getDecoratedTop(anchorView);         }          int pos = anchorPos;         boolean fillDown = true;         int height = getHeight();         int viewTop = anchorTop;         int itemCount = getItemCount();         int viewHeight = (int) (getHeight() * VIEW_HEIGHT_PERCENT);         final int widthSpec = View.MeasureSpec.makeMeasureSpec(getWidth(), View.MeasureSpec.EXACTLY);         final int heightSpec = View.MeasureSpec.makeMeasureSpec(viewHeight, View.MeasureSpec.EXACTLY);          while (fillDown && pos &lt; itemCount){             View view = viewCache.get(pos);             if (view == null){                 view = recycler.getViewForPosition(pos);                 addView(view);                 measureChildWithDecorationsAndMargin(view, widthSpec, heightSpec);                 int decoratedMeasuredWidth = getDecoratedMeasuredWidth(view);                 layoutDecorated(view, 0, viewTop, decoratedMeasuredWidth, viewTop + viewHeight);             } else {                 attachView(view);                 viewCache.remove(pos);             }             viewTop = getDecoratedBottom(view);             fillDown = viewTop &lt;= height;             pos++;         }     }      \/\/\u043c\u0435\u0442\u043e\u0434 \u0432\u0435\u0440\u043d\u0435\u0442 \u0432\u044c\u044e\u0448\u043a\u0443 \u0441 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0432\u0438\u0434\u0438\u043c\u043e\u0439 \u043f\u043b\u043e\u0449\u0430\u0434\u044c\u044e     private View getAnchorView() {         int childCount = getChildCount();         HashMap&lt;Integer, View&gt; viewsOnScreen = new HashMap&lt;&gt;();         Rect mainRect = new Rect(0, 0, getWidth(), getHeight());         for (int i = 0; i &lt; childCount; i++) {             View view = getChildAt(i);             int top = getDecoratedTop(view);             int bottom = getDecoratedBottom(view);             int left = getDecoratedLeft(view);             int right = getDecoratedRight(view);             Rect viewRect = new Rect(left, top, right, bottom);             boolean intersect = viewRect.intersect(mainRect);             if (intersect){                 int square = viewRect.width() * viewRect.height();                 viewsOnScreen.put(square, view);             }         }         if (viewsOnScreen.isEmpty()){             return null;         }         Integer maxSquare = null;         for (Integer square : viewsOnScreen.keySet()) {             if (maxSquare == null){                 maxSquare = square;             } else {                 maxSquare = Math.max(maxSquare, square);             }         }         return viewsOnScreen.get(maxSquare);     }      @Override     public int scrollVerticallyBy(int dy, RecyclerView.Recycler recycler, RecyclerView.State state) {         int delta = scrollVerticallyInternal(dy);         offsetChildrenVertical(-delta);         fill(recycler);         return delta;     } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0432\u043d\u0443\u0442\u0440\u0438 fillUp() \u0432\u044c\u044e\u0448\u043a\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u043c addView(view, 0), \u0430 \u043d\u0435 addView(view), \u043a\u0430\u043a \u0440\u0430\u043d\u044c\u0448\u0435. \u0421\u0434\u0435\u043b\u0430\u043d\u043e \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u043d\u0443\u0442\u0440\u0438 \u043b\u044d\u0439\u0430\u0443\u0442\u0430 \u2014 \u0447\u0435\u043c \u0432\u044b\u0448\u0435 view, \u0442\u0435\u043c \u043c\u0435\u043d\u044c\u0448\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0435\u0451 \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u0432\u044b\u0439 \u043d\u043e\u043c\u0435\u0440.<\/p>\n<h1>Wow-\u044d\u0444\u0444\u0435\u043a\u0442<\/h1>\n<p>  \u041a \u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u043c\u0435\u043d\u0442\u0443 \u0443 \u043d\u0430\u0441 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u0432\u043f\u043e\u043b\u043d\u0435 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 LayoutManager, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u0435\u0434\u0435\u0442 \u0441\u0435\u0431\u044f \u043a\u0430\u043a ListView. \u0422\u0435\u043f\u0435\u0440\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u043d\u0435\u0433\u043e \u044d\u0444\u0444\u0435\u043a\u0442 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0438\u0436\u043d\u0435\u0439 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u0441\u0435\u0433\u043e \u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430!<\/p>\n<pre><code class=\"java\">    private void updateViewScale() {         int childCount = getChildCount();         int height = getHeight();         int thresholdPx = (int) (height * SCALE_THRESHOLD_PERCENT); \/\/ SCALE_THRESHOLD_PERCENT = 0.66f or 2\/3         for (int i = 0; i &lt; childCount; i++) {             float scale = 1f;             View view = getChildAt(i);             int viewTop = getDecoratedTop(view);             if (viewTop &gt;= thresholdPx){                 int delta = viewTop - thresholdPx;                 scale = (height - delta) \/ (float)height;                 scale = Math.max(scale, 0);             }             view.setPivotX(view.getHeight()\/2);             view.setPivotY(view.getHeight() \/ -2);             view.setScaleX(scale);             view.setScaleY(scale);         }     } <\/code><\/pre>\n<p>  \u0420\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u0442\u0435 \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0432\u043d\u0443\u0442\u0440\u0438 fill() \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c. \u041e\u043d \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 scale &lt; 1 \u0434\u043b\u044f \u0442\u0435\u0445 view, \u0432\u0435\u0440\u0445\u043d\u044f\u044f \u0433\u0440\u0430\u043d\u0438\u0446\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0438\u0436\u0435 2\/3 \u044d\u043a\u0440\u0430\u043d\u0430. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c, scale \u0442\u0435\u043c \u043c\u0435\u043d\u044c\u0448\u0435, \u0447\u0435\u043c \u043d\u0438\u0436\u0435 \u044d\u0442\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0430. \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043c\u044b \u0441\u043c\u0435\u0449\u0430\u0435\u043c \u0444\u043e\u043a\u0443\u0441 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f (setPivotX \u0438 setPivotY) \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0447\u0442\u043e \u043e\u043d \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0432\u044b\u0448\u0435 \u0441\u0430\u043c\u043e\u0439 view. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u044d\u0444\u0444\u0435\u043a\u0442, \u0431\u0443\u0434\u0442\u043e \u043d\u0438\u0436\u043d\u044f\u044f \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0430 \u0432\u044b\u043f\u043b\u044b\u0432\u0430\u0435\u0442 \u0438\u0437 \u043f\u043e\u0434 \u0432\u0435\u0440\u0445\u043d\u0435\u0439.<\/p>\n<p>  \u0415\u0441\u043b\u0438 \u043c\u044b \u0441\u0435\u0439\u0447\u0430\u0441 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u043d\u0430\u0448 \u043f\u0440\u043e\u0435\u043a\u0442, \u0442\u043e \u0443\u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0432\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0442\u0430\u043a, \u043a\u0430\u043a \u043e\u0436\u0438\u0434\u0430\u043b\u043e\u0441\u044c: \u043d\u0438\u0436\u043d\u044f\u044f \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0430 \u0440\u0438\u0441\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u0432\u0435\u0440\u0445 \u0432\u0435\u0440\u0445\u043d\u0435\u0439, \u0445\u043e\u0442\u044f \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442.<br \/>  <img decoding=\"async\" src=\"https:\/\/raw.githubusercontent.com\/forceLain\/storage\/master\/wp4.png\"\/><\/p>\n<p>  \u042d\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043e\u0442\u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u044c\u044e\u0448\u0435\u043a \u0432 Android \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u043c \u0438\u0445 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f. \u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u0438\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u0432 RecyclerView \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u0441\u043b\u043e\u0436\u043d\u043e: <\/p>\n<pre><code class=\"java\">    recyclerView.setChildDrawingOrderCallback(new RecyclerView.ChildDrawingOrderCallback() {             @Override             public int onGetChildDrawingOrder(int childCount, int i) {                 return childCount - i - 1;             }         }); <\/code><\/pre>\n<p>  \u041d\u0443 \u0432\u043e\u0442, \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u0441\u0451 \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/raw.githubusercontent.com\/forceLain\/storage\/master\/wp5.png\"\/><\/p>\n<h1>\u0413\u043e\u0440\u0438\u0437\u043e\u043d\u0442 \u043d\u0435 \u0437\u0430\u0432\u0430\u043b\u0435\u043d!<\/h1>\n<p>  \u0421\u0435\u0439\u0447\u0430\u0441, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0437\u043d\u0430\u0435\u043c \u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 LayoutManager, \u043d\u0430\u043c \u043d\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u0442 \u0442\u0440\u0443\u0434\u0430 \u043f\u043e \u0435\u0433\u043e \u043f\u043e\u0434\u043e\u0431\u0438\u044e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c. \u041d\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u0435 \u043a\u043b\u0430\u0441\u0441\u0430, \u0433\u0434\u0435 \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0440\u0435\u0436\u0438\u043c (\u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u044f), getter- \u0438 setter- \u0434\u043b\u044f \u043d\u0435\u0433\u043e. \u0410 \u0442\u0430\u043a \u0436\u0435, \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b fillLeft(), fillRight(), canScrollHorizontally(), scrollHorizontallyBy() \u0438 \u0442.\u043f.<\/p>\n<pre><code class=\"java\">    public enum Orientation {VERTICAL, HORIZONTAL}     private Orientation orientation = Orientation.VERTICAL;     private int mAnchorPos;      public void setOrientation(Orientation orientation) {         View anchorView = getAnchorView();         mAnchorPos = anchorView != null ? getPosition(anchorView) : 0;         if (orientation != null){             this.orientation = orientation;         }         requestLayout();     }      private void fill(RecyclerView.Recycler recycler) {          View anchorView = getAnchorView();         viewCache.clear();         for (int i = 0, cnt = getChildCount(); i &lt; cnt; i++) {             View view = getChildAt(i);             int pos = getPosition(view);             viewCache.put(pos, view);         }          for (int i = 0; i &lt; viewCache.size(); i++) {             detachView(viewCache.valueAt(i));         }          switch (orientation) {              case VERTICAL:                 fillUp(anchorView, recycler);                 fillDown(anchorView, recycler);                 break;             case HORIZONTAL:                 fillLeft(anchorView, recycler);                 fillRight(anchorView, recycler);                 break;         }          \/\/\u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u043a\u043e\u0440\u0437\u0438\u043d\u0443 \u0432\u0441\u0451, \u0447\u0442\u043e \u043d\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u0432 \u044d\u0442\u043e\u043c \u0446\u0438\u043a\u043b\u0435 \u043b\u044d\u0439\u0430\u0443\u0442\u0430         \/\/\u044d\u0442\u0438 \u0432\u044c\u044e\u0448\u043a\u0438 \u0438\u043b\u0438 \u0443\u0448\u043b\u0438 \u0437\u0430 \u044d\u043a\u0440\u0430\u043d \u0438\u043b\u0438 \u043d\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u043b\u0438\u0441\u044c, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b          \/\/\u0443\u0434\u0430\u043b\u0438\u043b\u0438\u0441\u044c \u0438\u0437 \u0430\u0434\u0430\u043f\u0442\u0435\u0440\u0430         for (int i=0; i &lt; viewCache.size(); i++) {             recycler.recycleView(viewCache.valueAt(i));         }                  updateViewScale();     }      @Override     public boolean canScrollVertically() {         return orientation == Orientation.VERTICAL;     }      @Override     public boolean canScrollHorizontally() {         return orientation == Orientation.HORIZONTAL;     } <\/code><\/pre>\n<p>  \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 fillLeft(), fillRight() \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0433\u0440\u0430\u043d\u0438\u0446 \u0441\u043a\u0440\u043e\u043b\u043b\u0430 \u043c\u044b \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0435\u043c, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d\u0438 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436\u0438 \u043d\u0430 \u0441\u0432\u043e\u0438 \u201c\u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435\u201d \u0430\u043d\u0430\u043b\u043e\u0433\u0438. \u041f\u0440\u043e\u0441\u0442\u043e \u043c\u0435\u043d\u044f\u0439\u0442\u0435 top \u043d\u0430 left \u0438 bottom \u043d\u0430 right \u0438 \u0434\u0435\u043b\u0430\u0439\u0442\u0435 layout \u0432\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d :). \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0434\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043a\u043e\u0434 \u0432 \u043d\u0430\u0448\u0435\u043c \u0443\u0447\u0435\u0431\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043d\u0430 github, \u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u044b \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b\u0438 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0441\u0442\u0430\u0442\u044c\u0438. \u0422\u0430\u043a\u0436\u0435, \u043e\u0431\u0440\u0430\u0442\u0438\u043c \u0432\u0430\u0448\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0432\u043d\u0443\u0442\u0440\u0438 setOrientation() \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u044f mAnchorPos, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0442\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 fill*()-\u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0434\u043b\u044f \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u0440\u0438 \u0441\u043c\u0435\u043d\u0435 \u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u0438.<\/p>\n<p>  \u041d\u0430\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u043a, \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0435\u0439 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u0438\u0437 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0435\u0436\u0438\u043c\u0430 \u0432 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0439. \u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0435\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u043a\u043b\u0438\u043a\u0438 \u043f\u043e \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0435 \u0438 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u0442\u0443, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u043a\u043b\u0438\u043a\u043d\u0443\u043b\u0438. \u0422\u0430\u043a \u043a\u0430\u043a \u043b\u0435\u0432\u0430\u044f \u0438 \u043f\u0440\u0430\u0432\u0430\u044f \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0443 \u0432\u044c\u044e\u0448\u043a\u0438 \u0432 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u043c \u0438 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0430\u0445 \u0432\u0441\u0435\u0433\u0434\u0430 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442, \u0442\u043e \u0430\u043d\u0438\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u043c \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0451 \u0432\u0435\u0440\u0445 \u0438 \u043d\u0438\u0437. \u0418 \u0432\u0435\u0440\u0445\u0438 \u0438 \u043d\u0438\u0437\u044b \u0432\u0441\u0435\u0445 \u0435\u0451 \u0441\u043e\u0441\u0435\u0434\u0435\u0439 \ud83d\ude42<\/p>\n<p>  \u041d\u0430\u043f\u0438\u0448\u0435\u043c \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 openView(int pos), \u0432\u044b\u0437\u043e\u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0438 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e<\/p>\n<pre><code class=\"java\">    public void openItem(int pos) {         if (orientation == Orientation.VERTICAL){             View viewToOpen = null;             int childCount = getChildCount();             for (int i = 0; i &lt; childCount; i++) {                 View view = getChildAt(i);                 int position = getPosition(view);                 if (position == pos){                     viewToOpen = view;                 }             }             if (viewToOpen != null){                 openView(viewToOpen);             }         }     } <\/code><\/pre>\n<p>  \u0418 \u0441\u0430\u043c\u0443 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u043e\u0433\u043e openView(View view):<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">Animation<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"java\">    private void openView(final View viewToAnimate) {         final ArrayList&lt;ViewAnimationInfo&gt; animationInfos = new ArrayList&lt;&gt;();         int childCount = getChildCount();         int animatedPos = getPosition(viewToAnimate);         for (int i = 0; i &lt; childCount; i++) {             View view = getChildAt(i);             int pos = getPosition(view);             int posDelta = pos - animatedPos;             final ViewAnimationInfo viewAnimationInfo = new ViewAnimationInfo();             viewAnimationInfo.startTop = getDecoratedTop(view);             viewAnimationInfo.startBottom = getDecoratedBottom(view);             viewAnimationInfo.finishTop = getHeight() * posDelta;             viewAnimationInfo.finishBottom = getHeight() * posDelta + getHeight();             viewAnimationInfo.view = view;             animationInfos.add(viewAnimationInfo);         }         ValueAnimator animator = ValueAnimator.ofFloat(0, 1);         animator.setDuration(TRANSITION_DURATION_MS);         animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {             @Override             public void onAnimationUpdate(ValueAnimator animation) {                 float animationProgress = (float) animation.getAnimatedValue();                 for (ViewAnimationInfo animationInfo : animationInfos) {                     int top = (int) (animationInfo.startTop + animationProgress * (animationInfo.finishTop - animationInfo.startTop));                     int bottom = (int) (animationInfo.startBottom + animationProgress * (animationInfo.finishBottom - animationInfo.startBottom));                     layoutDecorated(animationInfo.view, 0, top, getWidth(), bottom);                 }                 updateViewScale();             }         });         animator.addListener(new Animator.AnimatorListener() {             @Override             public void onAnimationStart(Animator animation) {}              @Override             public void onAnimationEnd(Animator animation) {                 setOrientation(Orientation.HORIZONTAL);             }              @Override             public void onAnimationCancel(Animator animation) {}              @Override             public void onAnimationRepeat(Animator animation) {}         });         animator.start();     } <\/code><\/pre>\n<p>  ViewAnimationInfo \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u043b\u0430\u0441\u0441-\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439: <\/p>\n<pre><code class=\"java\">    private static class ViewAnimationInfo {         int startTop;         int startBottom;         int finishTop;         int finishBottom;         View view;     } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0412\u043e\u0442, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 openView: \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0432\u044c\u044e\u0448\u043a\u0438 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u043c\u044b \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c \u0435\u0451 \u0432\u0435\u0440\u0445 \u0438 \u043d\u0438\u0437, \u0430 \u0442\u0430\u043a \u0436\u0435 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u0435\u0451 \u0432\u0435\u0440\u0445 \u0438 \u043d\u0438\u0437, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044d\u0442\u0430 \u0432\u044c\u044e\u0448\u043a\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u201c\u0443\u0435\u0445\u0430\u0442\u044c\u201d. \u0417\u0430\u0442\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c ValueAnimator, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u0434\u0430\u0435\u0442 \u043d\u0430\u043c \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441 \u043e\u0442 0 \u0434\u043e 1, \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u044b \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0432\u0435\u0440\u0445 \u0438 \u043d\u0438\u0437 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0432\u044c\u044e\u0448\u043a\u0438 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0434\u043b\u044f \u043d\u0438\u0445 layoutDecorated(&#8230;) \u0441 \u043d\u0443\u0436\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438. \u0412 \u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442, \u043a\u043e\u0433\u0434\u0430 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044f \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u0442\u0441\u044f, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c setOrientation(Orientation.HORIZONTAL) \u0434\u043b\u044f \u043e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u044f \u0432 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c. \u041f\u043b\u0430\u0432\u043d\u043e \u0438 \u043d\u0435\u0437\u0430\u043c\u0435\u0442\u043d\u043e.<\/p>\n<h1>\u0421\u043d\u0438\u043c\u0430\u0435\u043c \u043f\u0440\u043e\u0431\u0443<\/h1>\n<p>  \u0416\u0430\u043b\u044c, \u0447\u0442\u043e \u043d\u0435 \u0443\u0434\u0430\u0441\u0442\u0441\u044f \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0441\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e LayoutManager\u2019\u0435 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0432\u0441\u0435\u0433\u043e \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438. \u041f\u0440\u0438 \u043d\u0430\u0434\u043e\u0431\u043d\u043e\u0441\u0442\u0438, \u0447\u0442\u043e-\u0442\u043e \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0434\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0432 \u043d\u0430\u0448\u0435\u043c \u0443\u0447\u0435\u0431\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e smoothScrollToPosition()), \u0430 \u0447\u0442\u043e-\u0442\u043e \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043f\u043e\u0438\u0441\u043a\u0430\u0442\u044c \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e.<\/p>\n<p>  \u0412 \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e LayoutManager \u044d\u0442\u043e \u0447\u0440\u0435\u0437\u0432\u044b\u0447\u0430\u0439\u043d\u043e \u043c\u043e\u0449\u043d\u044b\u0439 \u0438 \u0433\u0438\u0431\u043a\u0438\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442. RecyclerView + CustomLayoutManager \u0443\u0436\u0435 \u043d\u0435 \u0440\u0430\u0437 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043b \u043d\u0430\u043c \u043d\u0430 \u043f\u043e\u043c\u043e\u0449\u044c \u043f\u0440\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u043e\u0447\u0435\u043d\u044c \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u0434\u0438\u0437\u0430\u0439\u043d\u0435\u0440\u0441\u043a\u0438\u0445 \u0437\u0430\u0434\u0430\u0447. \u041e\u043d \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u043a\u0430\u043a \u0441\u0430\u043c\u0438\u0445 \u0432\u044c\u044e\u0448\u0435\u043a, \u0442\u0430\u043a \u0438 \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430 \u0432 \u043d\u0438\u0445. \u041a \u0442\u043e\u043c\u0443 \u0436\u0435, \u043e\u043d \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438. \u041a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0445\u043e\u0447\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c smoothScroll() \u043e\u0442 1-\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0434\u043e 100-\u0433\u043e, \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e-\u0447\u0435\u0441\u0442\u043d\u043e\u043c\u0443 \u043f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0442\u044c \u0432\u0441\u0435 99 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432. \u041c\u043e\u0436\u043d\u043e \u0441\u0445\u0438\u0442\u0440\u0438\u0442\u044c \u0438 \u043f\u0435\u0440\u0435\u0434 \u043d\u0430\u0447\u0430\u043b\u043e\u043c \u0441\u043a\u0440\u043e\u043b\u043b\u0430 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c 100-\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u043b\u044d\u0439\u0430\u0443\u0442, \u0430 \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u043e\u0441\u043a\u0440\u043e\u043b\u043b\u0438\u0442\u044c \u0434\u043e \u043d\u0435\u0433\u043e, \u044d\u043a\u043e\u043d\u043e\u043c\u044f \u043a\u0443\u0447\u0443 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432! <br \/>  \u041e\u0434\u043d\u0430\u043a\u043e, LayoutManager \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u0442\u0430\u043a \u043f\u0440\u043e\u0441\u0442 \u0434\u043b\u044f \u043e\u0441\u0432\u043e\u0435\u043d\u0438\u044f \u0441 \u043d\u0443\u043b\u044f. \u0414\u043b\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0443\u0436\u043d\u043e \u0445\u043e\u0440\u043e\u0448\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c, \u043a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0435 view, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 measure\/layout \u0446\u0438\u043a\u043b\u044b, \u043a\u0430\u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f MeasureSpec \u0438 \u043f\u0440\u043e\u0447\u0435\u0435 \u0432 \u0442\u0430\u043a\u043e\u043c \u0436\u0435 \u0434\u0443\u0445\u0435.<\/p>\n<h2>\u0421\u0441\u044b\u043b\u043a\u0438 \u043f\u043e \u0442\u0435\u043c\u0435:<\/h2>\n<p>  \u0423\u0447\u0435\u0431\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0441 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u043c LayoutManager: <a href=\"https:\/\/github.com\/forceLain\/AwesomeRecyclerView\">https:\/\/github.com\/forceLain\/AwesomeRecyclerView<\/a><br \/>  \u0421\u0442\u0430\u0442\u044c\u044f \u0432 3-\u0445 \u0447\u0430\u0441\u0442\u044f\u0445 \u043f\u0440\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0432\u043e\u0435\u0433\u043e LayoutManager, \u043f\u043e\u0445\u043e\u0436\u0435\u0433\u043e \u043d\u0430 GridLayoutManager \u043d\u0430 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u043e\u043c: <a href=\"http:\/\/wiresareobsolete.com\/2014\/09\/building-a-recyclerview-layoutmanager-part-1\/\">http:\/\/wiresareobsolete.com\/2014\/09\/building-a-recyclerview-layoutmanager-part-1\/<\/a>               <\/p>\n<div class=\"clear\"><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/267497\/\"> http:\/\/habrahabr.ru\/post\/267497\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>       \u041f\u0440\u0438\u0432\u0435\u0442 \u0445\u0430\u0431\u0440! <\/p>\n<p>  \u041c\u044b \u043b\u044e\u0431\u0438\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u043e\u0442 \u0441\u0432\u043e\u0438\u0445 \u0441\u043e\u0431\u0440\u0430\u0442\u044c\u0435\u0432 \u043a\u0430\u043a \u043f\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c, \u0442\u0430\u043a \u0438 \u043f\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0443. <a href=\"http:\/\/habrahabr.ru\/company\/eastbanctech\/blog\/263397\/\">\u0412 \u043f\u0440\u043e\u0448\u043b\u044b\u0439 \u0440\u0430\u0437<\/a> \u043c\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043b\u0438 \u043e \u043a\u043b\u0438\u0435\u043d\u0442-\u0441\u0435\u0440\u0432\u0435\u0440\u043d\u043e\u043c \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0438 \u0432 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u043d\u0430\u0448\u0438\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0430 \u0432 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u043f\u043e\u0434\u0435\u043b\u0438\u043c\u0441\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0435\u0433\u043e UI \u0444\u0438\u0447\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0433\u043e \u0441 \u043d\u0443\u043b\u044f LayoutManager. \u0414\u0443\u043c\u0430\u0435\u043c, \u0447\u0442\u043e \u0441\u0442\u0430\u0442\u044c\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u0430 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u043c \u0430\u043d\u0434\u0440\u043e\u0438\u0434-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c, \u043d\u043e \u0438 \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u043c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u0430\u043c.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/872\/ce9\/826\/872ce98265b171e705cc2340ed9487ce.png\"\/>  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-266199","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/266199","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=266199"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/266199\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=266199"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=266199"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=266199"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}