{"id":599,"date":"2018-07-28T01:16:17","date_gmt":"2018-07-27T16:16:17","guid":{"rendered":"http:\/\/www.charlezz.com\/?p=599"},"modified":"2018-07-28T01:16:17","modified_gmt":"2018-07-27T16:16:17","slug":"paging-datasource-%ec%a2%85%eb%a5%98","status":"publish","type":"post","link":"https:\/\/charlezz.com\/?p=599","title":{"rendered":"Paging &#8211; DataSource \uc885\ub958"},"content":{"rendered":"<p>2018 \uad6c\uae00 I\/O \uc5d0\uc11c Paging\ub77c\uc774\ube0c\ub7ec\ub9ac \ubc1c\ud45c\uc774\ud6c4 \ub85c\uceec(Room)\ub85c\ub9cc \ud398\uc774\uc9d5\uc744 \ud588\ub294\ub370, Retrofit \ub4f1\uc744 \uc774\uc6a9\ud55c \ub124\ud2b8\uc6cc\ud06c\ub098 Cursor\ub97c \ud1b5\ud55c \ud398\uc774\uc9d5\uc744 \ud560\ub54c\ub294 DataSource\ub97c \uc9c1\uc811 \uad6c\ud604\ud574\uc918\uc57c\ud55c\ub2e4\ub294 \uc0ac\uc2e4\uc744 \uc54c\uac8c \ub418\uc5c8\ub2e4.<\/p>\n<p>\uadf8\ub798\uc11c DataSource\uc758 \uc885\ub958\uc5d0 \ub300\ud574\uc11c \uc54c\uc544\ubcf4\uace0 \ud14c\uc2a4\ud2b8\ub97c \ud574\ubcf8\uac83\uc744 \uc815\ub9ac\ud558\uace0\uc790 \ud55c\ub2e4.<\/p>\n<h2>1.PositionalDataSoure<\/h2>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"http:\/\/www.charlezz.com\/wordpress\/wp-content\/uploads\/2018\/07\/PositionalDataSource-1-e1532247723681.jpg\" alt=\"\" width=\"849\" height=\"585\" class=\"aligncenter size-full wp-image-600\" srcset=\"https:\/\/charlezz.com\/wordpress\/wp-content\/uploads\/2018\/07\/PositionalDataSource-1-e1532247723681.jpg 849w, https:\/\/charlezz.com\/wordpress\/wp-content\/uploads\/2018\/07\/PositionalDataSource-1-e1532247723681-300x207.jpg 300w, https:\/\/charlezz.com\/wordpress\/wp-content\/uploads\/2018\/07\/PositionalDataSource-1-e1532247723681-768x529.jpg 768w\" sizes=\"(max-width: 849px) 100vw, 849px\" \/><\/p>\n<p>\uccab\ubc88\uc9f8\ub85c PositionalDataSource\ub294 Position\uae30\ubc18\uc758 \ub370\uc774\ud130 \ub85c\ub354\ub85c \uc140\uc218 \uc788\ub294 \uace0\uc815\ub41c \uc0ac\uc774\uc988\ub97c \uac16\ub294 \ub370\uc774\ud130\uc9d1\ud569\uc744 \ud398\uc774\uc9d5 \ud558\ub294\ub370 \uc801\ud569\ud558\ub2e4. \uc784\uc758\uc758 \ud3ec\uc9c0\uc158\uc73c\ub85c\ubd80\ud130 \uc6d0\ud558\ub294 \uc0ac\uc774\uc988\ub9cc\ud07c\uc758 \ub370\uc774\ud130\ub97c \ub85c\ub4dc\ud560 \uc218 \uc788\ub2e4. \ub9cc\uc57d\uc5d0 \ub370\uc774\ud130\uc758 \uc0ac\uc774\uc988\ub97c \uc815\ud655\ud558\uac8c \ubaa8\ub974\uac70\ub098 \ub7f0\ud0c0\uc784\uc5d0\ub9cc \uc54c \uc218 \uc788\ub2e4\uba74 PageKeyedDataSource\ub098 ItemKeyedDataSource\ub97c \uc4f0\ub294\uac83\uc744 \ucd94\ucc9c\ud55c\ub2e4.<\/p>\n<p>placeholder \ub97c \ube44\ud65c\uc131\ud654 \uc2dc\ucf30\ub2e4\uba74, \ub370\uc774\ud130\uc758 \uc0ac\uc774\uc988\ub97c \uc815\ud655\ud788 \uc54c\ub824\uc918\uc57c\ud55c\ub2e4. \uc774\ub97c \ud1b5\ud574\uc11c PagedList\uac00 \uc0ac\uc6a9\uc790\uac00 \ubcf4\uace0\uc788\ub294 \ub0b4\uc6a9\uc744 \uae30\uc900\uc73c\ub85c \uacc4\uc18d\ud574\uc11c \ub370\uc774\ud130\ub97c \uc21c\uc11c\ub300\ub85c \uc774\uc5b4\uac08 \uc218 \uc788\uae30 \ub54c\ubb38\uc774\ub2e4. placeholder\ub97c \ube44\ud65c\uc131\ud654 \uc2dc\ucf30\ub2e4\uba74 \ucd08\uae30\ud654\uc2dc\uc5d0 onResult(List, int) \uba54\uc18c\ub4dc\ub97c \ud638\ucd9c\ud558\uba74\ub41c\ub2e4.<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"lang:java decode:true\"> class ItemDataSource extends PositionalDataSource&lt;Item&gt; {\r\n     private int computeCount() {\r\n         \/\/ \uc2e4\uc81c \ub370\uc774\ud130\uc758 \uc0ac\uc774\uc988\ub97c \ubc18\ud658\r\n     }\r\n\r\n     private List&lt;Item&gt; loadRangeInternal(int startPosition, int loadCount) {\r\n         \/\/ \ud2b9\uc815 \ud3ec\uc9c0\uc158\uc73c\ub85c\ubd80\ud130 \uc6d0\ud558\ub294 \ub9cc\ud07c\uc758 \ub370\uc774\ud130\ub97c \uc774\uacf3\uc5d0\uc11c \ub85c\ub4dc\r\n     }\r\n\r\n     @Override\r\n     public void loadInitial(@NonNull LoadInitialParams params,\r\n             @NonNull LoadInitialCallback&lt;Item&gt; callback) {\r\n         int totalCount = computeCount();\r\n         int position = computeInitialLoadPosition(params, totalCount);\r\n         int loadSize = computeInitialLoadSize(params, position, totalCount);\r\n         callback.onResult(loadRangeInternal(position, loadSize), position, totalCount);\r\n     }\r\n\r\n     @Override\r\n     public void loadRange(@NonNull LoadRangeParams params,\r\n             @NonNull LoadRangeCallback&lt;Item&gt; callback) {\r\n         callback.onResult(loadRangeInternal(params.startPosition, params.loadSize));\r\n     }\r\n }<\/pre>\n<p>Room\uac19\uc740 \uacbd\uc6b0\ub294 \uc560\ub178\ud14c\uc774\uc158 \ud504\ub85c\uc138\uc2f1\uc744 \ud1b5\ud574 \uc2a4\uc2a4\ub85c PositionalDataSource \ucf54\ub4dc\ub97c \uc0dd\uc131\ud558\ubbc0\ub85c \ud3b8\ud558\ub2e4.<\/p>\n<pre class=\"lang:java decode:true\">@Dao\r\n interface UserDao {\r\n     @Query(\"SELECT * FROM user ORDER BY mAge DESC\")\r\n     public abstract DataSource.Factory&lt;Integer, User&gt; loadUsersByAgeDesc();\r\n }<\/pre>\n<p>&nbsp;<\/p>\n<h2>2. ItemKeyedDataSource<\/h2>\n<p>\uac00\uc7a5 \uc77c\ubc18\uc801\uc778 \ucf00\uc774\uc2a4\uc774\ub2e4. ItemKeyedDataSource\ub294 \uc11c\ubc84\ub098 \ub370\uc774\ud130\ubca0\uc774\uc2a4\ub85c\ubd80\ud130 \ud574\ub2f9 \uae30\uc900\ub41c Key\ub85c\ubd80\ud130 \ub370\uc774\ud130\ub97c \ub85c\ub4dc\uc2dc\ucf1c \ud398\uc774\uc9d5\uc744 \ud560 \uc218 \uc788\uac8c \ub3c4\uc640\uc900\ub2e4.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"http:\/\/www.charlezz.com\/wordpress\/wp-content\/uploads\/2018\/07\/image.png\" alt=\"\" width=\"871\" height=\"460\" class=\"aligncenter size-full wp-image-601\" srcset=\"https:\/\/charlezz.com\/wordpress\/wp-content\/uploads\/2018\/07\/image.png 871w, https:\/\/charlezz.com\/wordpress\/wp-content\/uploads\/2018\/07\/image-300x158.png 300w, https:\/\/charlezz.com\/wordpress\/wp-content\/uploads\/2018\/07\/image-768x406.png 768w\" sizes=\"(max-width: 871px) 100vw, 871px\" \/><\/p>\n<p>\ucc98\uc74c\uc5d0 RecyclerView\uac00 \ud654\uba74\uc5d0 \ub098\ud0c0\ub098\uac8c \ub418\uba74 ItemKeyedDataSource\uc5d0\uc11c\ub294 loadInitial() \uba54\uc18c\ub4dc\ub97c \ud638\ucd9c\ud558\uac8c \ub41c\ub2e4. \ucd08\uae30\ud654\uc5d0 \ud544\uc694\ud55c Key\uc640 \ub85c\ub4dc\ud558\uace0\uc2f6\uc740 \ub370\uc774\ud130\uc758 \uc0ac\uc774\uc988 \ub4f1\uc744 \uc778\uc790\ub85c \ubc1b\uc544 \uc11c\ubc84\ub098 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \ub4f1\uc73c\ub85c\ubd80\ud130 \ub370\uc774\ud130\ub97c \ub85c\ub4dc \ud560 \uc218 \uc788\ub2e4.<\/p>\n<p>&nbsp;<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"http:\/\/www.charlezz.com\/wordpress\/wp-content\/uploads\/2018\/07\/image-1.png\" alt=\"\" width=\"876\" height=\"448\" class=\"aligncenter size-full wp-image-602\" srcset=\"https:\/\/charlezz.com\/wordpress\/wp-content\/uploads\/2018\/07\/image-1.png 876w, https:\/\/charlezz.com\/wordpress\/wp-content\/uploads\/2018\/07\/image-1-300x153.png 300w, https:\/\/charlezz.com\/wordpress\/wp-content\/uploads\/2018\/07\/image-1-768x393.png 768w\" sizes=\"(max-width: 876px) 100vw, 876px\" \/><\/p>\n<p>\uc774\ud6c4 RecyclerView\ub97c \uc2a4\ud06c\ub864 \ud558\uac8c \ub418\uba74 loadAfter()\ub97c \ud638\ucd9c\ud558\uac8c \ub418\uace0, \uc774\ub54c \uae30\uc900 Key\ub97c \ud1b5\ud574 \ub2e4\uc74c \ud398\uc774\uc9c0\ub97c \ub85c\ub4dc \ud558\uba74\ub41c\ub2e4. \uc5ec\uae30\uc11c \uc0dd\uac01\ud574 \ubcfc \uc218 \uc788\ub294\uac8c Key\ub97c \ud1b5\ud574 \ub2e4\uc74c \ud398\uc774\uc9c0\ub97c \uac00\uc838\uc624\ub824\ub294\ub370 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc758 \ub0b4\uc6a9\uc774 \ubcc0\uacbd\ub41c\ub2e4\uba74 \uc5b4\ub5bb\uac8c \ub420\uae4c? \uac71\uc815\ud560 \ud544\uc694\uc5c6\ub2e4. Key\uc758 \ube44\uad50\ub97c \ud1b5\ud574 \uc911\ubcf5\ub41c \ub370\uc774\ud130\ub294 \uc790\uc5f0\uc2a4\ub7fd\uac8c \uac78\ub7ec\uc9c0\uac8c \ub418\uace0, \uc560\ub2c8\uba54\uc774\uc158\uacfc \ud568\uaed8 UI\uac00 \uac31\uc2e0\ub418\uac8c \ub41c\ub2e4.<\/p>\n<p>&nbsp;<\/p>\n<h2>3.PageKeyedDataSource<\/h2>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"http:\/\/www.charlezz.com\/wordpress\/wp-content\/uploads\/2018\/07\/image-2.png\" alt=\"\" width=\"871\" height=\"403\" class=\"aligncenter size-full wp-image-603\" srcset=\"https:\/\/charlezz.com\/wordpress\/wp-content\/uploads\/2018\/07\/image-2.png 871w, https:\/\/charlezz.com\/wordpress\/wp-content\/uploads\/2018\/07\/image-2-300x139.png 300w, https:\/\/charlezz.com\/wordpress\/wp-content\/uploads\/2018\/07\/image-2-768x355.png 768w\" sizes=\"(max-width: 871px) 100vw, 871px\" \/><\/p>\n<p>ItemKeyedDataSource\uac00 \ud558\ub098\uc758 \uc544\uc774\ud15c\ud0a4\uc5d0 \ub300\ud55c \uae30\uc900\uc73c\ub85c \ub370\uc774\ud130\ub97c \uac00\uc838\uc654\ub2e4\uba74, PageKeyedDataSource\ub294 \ud398\uc774\uc9c0\ud0a4 \ub2e8\uc704\ub85c \ub370\uc774\ud130\ub97c \ubd88\ub7ec\ub4e4\uc778\ub2e4. \ub2e8 \ub370\uc774\ud130\ubca0\uc774\uc2a4\ub85c\ubd80\ud130 \ub2e4\uc74c\ud398\uc774\uc9c0\uc640 \uc774\uc804\ud398\uc774\uc9c0\ub97c \ubc1b\uc544\uc57c\ud55c\ub2e4.<\/p>\n<p>&nbsp;<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"http:\/\/www.charlezz.com\/wordpress\/wp-content\/uploads\/2018\/07\/image-3.png\" alt=\"\" width=\"888\" height=\"470\" class=\"aligncenter size-full wp-image-604\" srcset=\"https:\/\/charlezz.com\/wordpress\/wp-content\/uploads\/2018\/07\/image-3.png 888w, https:\/\/charlezz.com\/wordpress\/wp-content\/uploads\/2018\/07\/image-3-300x159.png 300w, https:\/\/charlezz.com\/wordpress\/wp-content\/uploads\/2018\/07\/image-3-768x406.png 768w\" sizes=\"(max-width: 888px) 100vw, 888px\" \/><\/p>\n<p>\uba3c\uc800 loadInitial() \uba54\uc18c\ub4dc\ub97c \ud1b5\ud574 \ud55c\ud398\uc774\uc9c0\uc758 \ub370\uc774\ud130\ub97c \ubc1b\uc544\uc57c\ud55c\ub2e4.\u00a0<img decoding=\"async\" loading=\"lazy\" src=\"http:\/\/www.charlezz.com\/wordpress\/wp-content\/uploads\/2018\/07\/image-4.png\" alt=\"\" width=\"878\" height=\"468\" class=\"aligncenter size-full wp-image-605\" srcset=\"https:\/\/charlezz.com\/wordpress\/wp-content\/uploads\/2018\/07\/image-4.png 878w, https:\/\/charlezz.com\/wordpress\/wp-content\/uploads\/2018\/07\/image-4-300x160.png 300w, https:\/\/charlezz.com\/wordpress\/wp-content\/uploads\/2018\/07\/image-4-768x409.png 768w\" sizes=\"(max-width: 878px) 100vw, 878px\" \/><\/p>\n<p>\uc774\ud6c4 \uc0ac\uc6a9\uc790\uc758 RecyclerView \uc2a4\ud06c\ub864\uc744 \ud1b5\ud574 loadAfter\ub97c \ud638\ucd9c\ud558\uac8c \ub418\uace0 \ub2e4\uc74c \ud398\uc774\uc9c0\ub97c \ub85c\ub4dc \ud558\uba74\ub41c\ub2e4.<\/p>\n<p>\ud398\uc774\uc9d5 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \uc9c1\uc811 \uc0ac\uc6a9\ud574\ubcf4\ub2c8 \ub300\uc6a9\ub7c9\uc758 \ub370\uc774\ud130\ub97c \ube60\ub974\uace0, \uac04\ud3b8\ud558\uac8c \ucc98\ub9ac \ud560 \uc218 \uc788\uac8c \ub418\uc5c8\ub2e4. \ub354 \uc774\uc0c1 \ubc29\ub300\ud55c \ub370\uc774\ud130\ub97c \ud55c\ubc88\uc5d0 \ubd88\ub7ec\uc640 \uba54\ubaa8\ub9ac\uc5d0 \uc801\uc7ac\ud558\ub294\uac83\uc744 \uae30\ub2e4\ub9ac\uc9c0 \uc54a\uc544\ub3c4 \ub41c\ub2e4. \uadf8\ub54c \uadf8\ub54c \ud544\uc694\ud55c\ub9cc\ud07c\ub9cc \ub85c\ub4dc\ud558\uc5ec \uc0ac\uc6a9\uc790\uc640 \uc571\uac04\uc758 \ubc18\uc751\uc131\uc744 \ub192\uc77c \uc218 \uc788\ub2e4. \ub098\uc628\uc9c0 \uc5bc\ub9c8 \ub418\uc9c0 \uc54a\uc740 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub77c \uc55e\uc73c\ub85c\uac00 \ub354\uc6b1 \uae30\ub300\uac00 \ub41c\ub2e4.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>2018 \uad6c\uae00 I\/O \uc5d0\uc11c Paging\ub77c\uc774\ube0c\ub7ec\ub9ac \ubc1c\ud45c\uc774\ud6c4 \ub85c\uceec(Room)\ub85c\ub9cc \ud398\uc774\uc9d5\uc744 \ud588\ub294\ub370, Retrofit \ub4f1\uc744 \uc774\uc6a9\ud55c \ub124\ud2b8\uc6cc\ud06c\ub098 Cursor\ub97c \ud1b5\ud55c \ud398\uc774\uc9d5\uc744 \ud560\ub54c\ub294 DataSource\ub97c \uc9c1\uc811 \uad6c\ud604\ud574\uc918\uc57c\ud55c\ub2e4\ub294 \uc0ac\uc2e4\uc744 \uc54c\uac8c \ub418\uc5c8\ub2e4. \uadf8\ub798\uc11c DataSource\uc758 \uc885\ub958\uc5d0 \ub300\ud574\uc11c \uc54c\uc544\ubcf4\uace0 \ud14c\uc2a4\ud2b8\ub97c \ud574\ubcf8\uac83\uc744 \uc815\ub9ac\ud558\uace0\uc790 \ud55c\ub2e4. 1.PositionalDataSoure \uccab\ubc88\uc9f8\ub85c PositionalDataSource\ub294 Position\uae30\ubc18\uc758 \ub370\uc774\ud130 \ub85c\ub354\ub85c \uc140\uc218 \uc788\ub294 \uace0\uc815\ub41c \uc0ac\uc774\uc988\ub97c \uac16\ub294 \ub370\uc774\ud130\uc9d1\ud569\uc744 \ud398\uc774\uc9d5 \ud558\ub294\ub370 \uc801\ud569\ud558\ub2e4. \uc784\uc758\uc758 \ud3ec\uc9c0\uc158\uc73c\ub85c\ubd80\ud130 \uc6d0\ud558\ub294 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"inline_featured_image":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0},"categories":[16],"tags":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/posts\/599"}],"collection":[{"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/charlezz.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=599"}],"version-history":[{"count":1,"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/posts\/599\/revisions"}],"predecessor-version":[{"id":606,"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/posts\/599\/revisions\/606"}],"wp:attachment":[{"href":"https:\/\/charlezz.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=599"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/charlezz.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=599"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/charlezz.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=599"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}