{"id":484,"date":"2018-07-11T15:30:10","date_gmt":"2018-07-11T06:30:10","guid":{"rendered":"http:\/\/www.charlezz.com\/?p=484"},"modified":"2018-07-11T15:30:10","modified_gmt":"2018-07-11T06:30:10","slug":"android-architecture-component-paging","status":"publish","type":"post","link":"https:\/\/charlezz.com\/?p=484","title":{"rendered":"Android Architecture Component \u2013 Paging"},"content":{"rendered":"<h1>Paiging\ub77c\uc774\ube0c\ub7ec\ub9ac \uac1c\uc694<\/h1>\n<p>\ud398\uc774\uc9d5 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub294 \ub370\uc774\ud130 \ub85c\ub529\uc744 \uc27d\uac8c, \uc810\uc9c4\uc801\uc73c\ub85c \uadf8\ub9ac\uace0 \uc544\uc8fc \uc6b0\uc544\ud558\uac8c RecyclerView\uc640 \ud568\uaed8 \uc791\ub3d9\ud558\ub3c4\ub85d \ub3c4\uc640\uc8fc\ub294 \ub77c\uc774\ube0c\ub7ec\ub9ac\uc774\ub2e4.<br \/>\n\ub9ce\uc740 \uc571\ub4e4\uc774 \ub9ce\uc740 \uc591\uc758 \ub370\uc774\ud0c0\ub97c \ub85c\ub529\ud574\ub450\uace0, \uc2e4\uc81c\ub85c\ub294 \uc804\uccb4\uc758 \uc77c\ubd80\ub9cc\uc744 \uc2e4\uc81c\ub85c \ubcf4\uc5ec\uc8fc\uac8c \ub41c\ub2e4.<br \/>\n\ud398\uc774\uc9d5\ub77c\uc774\ube0c\ub7ec\ub9ac\ub294 \ud569\ub9ac\uc801\uc73c\ub85c \uc774\ub7f0 \ub370\uc774\ud130\uc758 \ubd80\ubd84\uc9d1\ud569\ub9cc\uc744 \ud45c\ud604\ud558\uace0 \uad00\ucc30\ud558\ub294\uac83\uc744 \ub3c4\uc640\uc900\ub2e4. \uc774\ub7f0 \uae30\ub2a5\uc740 \uba87\uba87 \uc7a5\uc810\uc744 \uac16\uac8c \ub41c\ub2e4.<\/p>\n<ul>\n<li>\ub370\uc774\ud130\ub97c \uc810\uc9c4\uc801\uc73c\ub85c \ub85c\ub529\ud558\uae30 \ub54c\ubb38\uc5d0 \ub124\ud2b8\uc6cc\ud06c \uc0ac\uc6a9\ub7c9 \ubc0f \uc2dc\uc2a4\ud15c \ub9ac\uc18c\uc2a4\ub97c \uc801\uac8c \uc4f8 \uc218 \uc788\ub2e4. \ubb34\uc81c\ud55c \uc694\uae08\uc81c\uac00 \uc544\ub2cc \uc81c\ud55c\uc801\uc73c\ub85c \uc791\uc740 \uc6a9\ub7c9\uc758 data \uc694\uae08\uc81c\ub97c \uc4f0\ub294 \uc0ac\uc6a9\uc790\uc5d0\uac8c\ub294 \ub3c4\uc6c0\uc774 \ub9ce\uc774 \ub41c\ub2e4.<\/li>\n<li>\uc0c8\ub85c\uc6b4 \ub370\uc774\ud130\ub97c \ubc1b\uc544\uc624\uac70\ub098 \uac31\uc2e0\ud558\ub294\uc911\uc5d0\ub3c4 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc740 \uc9c0\uc18d\uc801\uc73c\ub85c \uc0ac\uc6a9\uc790\uc758 \uc785\ub825\uc5d0 \ube60\ub974\uac8c \ubc18\uc751 \ud560 \uc218 \uc788\ub2e4.<\/li>\n<\/ul>\n<h2>\ud398\uc774\uc9d5 \ub77c\uc774\ube0c\ub7ec\ub9ac \uc124\uc815\ud558\uae30<\/h2>\n<p>\uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ubaa8\ub4c8\ub808\ubca8\uc5d0 \uc788\ub294 build.gradle\uc5d0 \ucd94\uac00\ud574\uc8fc\uc138\uc694.<\/p>\n<pre class=\"lang:xhtml decode:true\">dependencies {\n    def paging_version = \"1.0.0\"\n    implementation \"android.arch.paging:runtime:$paging_version\"\n}<\/pre>\n<p>&nbsp;<\/p>\n<h2>\ub77c\uc774\ube0c\ub7ec\ub9ac\uc758 \uad6c\uc870<\/h2>\n<p>\ud398\uc774\uc9d5 \ub77c\uc774\ube0c\ub7ec\ub9ac\uc758 \ud575\uc2ec \ucef4\ud3ec\ub10c\ud2b8\ub294 <a href=\"https:\/\/developer.android.com\/reference\/android\/arch\/paging\/PagedList\">PagedList<\/a>\u00a0\ud074\ub798\uc2a4 \uc785\ub2c8\ub2e4. \uc774 \ud074\ub798\uc2a4\ub294 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c \ud544\uc694\ub85c \ud558\ub294 \ub370\uc774\ud130 \ub610\ub294 \ud398\uc774\uc9c0\ub4e4\uc744 \ud2b9\uc815 \ub369\uc5b4\ub9ac \ub2e8\uc704\ub85c \ube44\ub3d9\uae30\uc801\uc73c\ub85c \ub85c\ub529\ud558\uc5ec \ub2f4\uc544\ub450\ub294 collection\ud074\ub798\uc2a4\uc785\ub2c8\ub2e4. \u00a0\uc774 \ud074\ub798\uc2a4\ub294 \uc571\ub0b4\uc758 \ub2e4\ub978 \uad6c\uc131\uc694\uc18c\ub4e4 \uc0ac\uc774\uc5d0\uc11c \uc911\uc7ac\ud558\ub294 \uc5ed\ud560\uc744 \ud569\ub2c8\ub2e4.<\/p>\n<h3>Data<\/h3>\n<p>PagedList\uc758 \uac01 \uc778\uc2a4\ud134\uc2a4\ub294 \ucd5c\uc2e0\uc758 \ub370\uc774\ud130\ub97c <a href=\"https:\/\/developer.android.com\/reference\/android\/arch\/paging\/DataSource\">DataSource<\/a>\ub85c \ubd80\ud130 \ubd88\ub7ec\uc624\uac8c \ub429\ub2c8\ub2e4. \uc11c\ubc84\ub098 \ub85c\uceec \ub370\uc774\ud130\ubca0\uc774\uc2a4\ubd80\ud130 \uac00\uc838\uc628 Data\uac00 PageList\uac1d\uccb4\ub85c \ub4e4\uc5b4\uac00\uac8c \ub429\ub2c8\ub2e4.<br \/>\n\ud398\uc774\uc9d5 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub294 \ub3c5\ub9bd\uc801\uc778 \ub370\uc774\ud130\ubca0\uc774\ud130 \uadf8\ub9ac\uace0 \uc11c\ubc84\uc640 \ud1b5\uc2e0\ud558\ub294 \ub370\uc774\ud130 \ubca0\uc774\uc2a4\ub97c \ud3ec\ud568\ud558\uc5ec, \ub2e4\uc591\ud55c \uc544\ud0a4\ud14d\ucc98\ub97c \uc9c0\uc6d0\ud569\ub2c8\ub2e4.<\/p>\n<h3>UI<\/h3>\n<p>PagedList\ud074\ub798\uc2a4\ub294 PagedListAdapter\uc640 \uac19\uc774 \ub3d9\uc791\ud558\uc5ec RecyclerView\uc5d0 \uc544\uc774\ud15c\ub4e4\uc744 \ud45c\ud604\ud558\uac8c \ub429\ub2c8\ub2e4. \uc774\ub7ec\ud55c \ud074\ub798\uc2a4\ub4e4\uc740 \ud568\uaed8 \ub3d9\uc791\ud558\uc5ec \uc774\ubbf8 \ub85c\ub529\ub41c \ub370\uc774\ud130\uac00 \uc788\uc73c\uba74 \uadf8\ub300\ub85c \ubcf4\uc5ec\uc8fc\uace0, \uadf8\ub807\uc9c0 \uc54a\uc73c\uba74 \ub370\uc774\ud130\ub97c \ubd88\ub7ec\uc640\uc11c \uc790\uc5f0\uc2a4\ub7fd\uac8c \ud654\uba74\uc5d0 \ud45c\uc2dc\ud574\uc90d\ub2c8\ub2e4.<br \/>\n\ud398\uc774\uc9d5 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub294 \ub2e4\ub978 Android Architecture Component\uc640 \uac19\uc774 \uc0ac\uc6a9\ud558\ub294\uac83\uc744 \uac15\ub825\ud558\uac8c \uad8c\uc7a5\ud569\ub2c8\ub2e4. \u00a0\ud398\uc774\uc9c0 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub294 \ud2b9\ud788 LiveData\ub098 RxJava \uac1d\uccb4\uac19\uc740 Observable \uac1d\uccb4\ub97c \ub2e4\ub8f9\ub2c8\ub2e4. PagedList\uc5d0\uc11c\ub294 \uc774\ub7ec\ud55c \uac1d\uccb4\ub97c \uc0dd\uc131\ud558\uc5ec UI\ub85c \ud45c\ud604\ud558\uac8c \ub418\uace0 \uadf8\ub7ec\ub294 \ub3d9\uc548\uc5d0\ub3c4 UI\ucee8\ud2b8\ub864\ub7ec\uc758 \uc0dd\uba85\uc8fc\uae30\ub97c \uc911\uc2dc\ud558\uc5ec \uc0dd\uba85\uc8fc\uae30\ub85c \ubd80\ud130 \uc0dd\uae30\ub294 \uc5d0\ub7ec\ub4f1\uc744 \ubbf8\uc5f0\uc5d0 \ubc29\uc9c0\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<br \/>\n&nbsp;<\/p>\n<h2>Room Database\ub97c \uc0ac\uc6a9\ud558\ub294 \uc608\uc81c<\/h2>\n<p>Room\uc5d0 \ub300\ud574\uc11c \ub354 \uc54c\uc544\ubcf4\uace0 \uc2f6\ub2e4\uba74 \uc544\ub798 \ub9c1\ud06c\ub97c \ucc38\uc870\ud574\uc8fc\uc138\uc694.<br \/>\n<a href=\"http:\/\/www.charlezz.com\/2018\/06\/20\/android-architecture-component-room\/\">Room \uc5d0 \ub300\ud574\uc11c \uc54c\uc544\ubcf4\uae30<\/a><\/p>\n<pre class=\"lang:java decode:true\">@Dao\ninterface ConcertDao {\n    @Query(\"SELECT * FROM user ORDER BY concert DESC\")\n    fun concertsByDate(): DataSource.Factory&lt;Int, Concert&gt;\n}<\/pre>\n<p>DataSource.Factory&lt;Int, *&gt;\uc5d0\uc11c Int\uc790\ub8cc\ud615 \uc778\uc790\ub294 \ub8f8\uc5d0\uac8c \uc5b4\ub5a4 \ud3ec\uc9c0\uc158\uc758 \ub370\uc774\ud130\ub97c \uc0ac\uc6a9\ud560 \uc9c0\uc5d0 \ub300\ud574 \uc54c\ub824\uc8fc\uac8c \ub429\ub2c8\ub2e4.<\/p>\n<pre class=\"lang:java decode:true\">class MyViewModel(concertDao: ConcertDao) : ViewModel() {\n    val concertList: LiveData&lt;PagedList&lt;Concert&gt;&gt; = LivePagedListBuilder(\n            concertDao.concertsByDate(),\n            \/* page size *\/ 20\n    ).build()\n}<\/pre>\n<p>View\uc5d0\uac8c \ub370\uc774\ud130\ub97c \uc804\ub2ec \ud560 ViewModel\uc5d0\uc11c\ub294 \ub370\uc774\ud130\ub97c \uac00\uc838\uc624\ub294 \uc791\uc5c5\uc744 \ud558\uac8c \ub429\ub2c8\ub2e4. Paging\uc744 \uc4f0\uae30 \uc704\ud574\uc11c\ub294 \ub370\uc774\ud130 \ucf5c\ub809\uc158 \ud0c0\uc785\uc774 \ubc18\ub4dc\uc2dc PageList\uc5ec\uc57c \ud569\ub2c8\ub2e4. PageList\ub294 LivePageListBuilder\ub97c \ud1b5\ud574 \ub9cc\ub4e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc704\uc758 \uc608\uc81c\uc5d0\uc11c\ub294 DataSource\uc640 \ud398\uc774\uc9c0 \uc0ac\uc774\uc988\ub97c \uc778\uc790\ub85c \ubc1b\uc544 \uc0dd\uc131\ud558\uace0 \uc788\uc73c\uba70, \ub354\ub9ce\uc740 \uc124\uc815\uc744 \uc704\ud574\uc11c\ub294 PagedList.Config\ub97c \ub9cc\ub4e4\uc5b4\uc11c \ube4c\ub354\ub97c \uc0dd\uc131\ud558\uba74 \ub429\ub2c8\ub2e4.<br \/>\n&nbsp;<\/p>\n<pre class=\"lang:java decode:true\">class MyActivity : AppCompatActivity() {\n    public override fun onCreate(savedState: Bundle?) {\n        super.onCreate(savedState)\n        val viewModel = ViewModelProviders.of(this)\n                .get(MyViewModel::class.java!!)\n        val recyclerView = findViewById(R.id.concert_list)\n        val adapter = ConcertAdapter()\n        viewModel.concertList.observe(this, { pagedList -&gt;\n                adapter.submitList(pagedList) })\n        recyclerView.setAdapter(adapter)\n    }\n}<\/pre>\n<p>\uc774\uc81c \uc561\ud2f0\ube44\ud2f0\ub97c \uc0b4\ud3b4\ubcf4\ub3c4\ub85d \ud558\uaca0\uc2b5\ub2c8\ub2e4. \uc561\ud2f0\ube44\ud2f0\uc5d0\uc11c\ub294 \uc77c\ubc18\uc801\uc73c\ub85c \ubdf0\ubaa8\ub378, \ub9ac\uc0ac\uc774\ud074\ub7ec\ubdf0, \uc5b4\ub311\ud130 \ub4f1\uc744 \uc124\uc815\ud574\uc8fc\uba74\ub429\ub2c8\ub2e4.<\/p>\n<pre class=\"lang:java decode:true\">class ConcertAdapter() :\n        PagedListAdapter&lt;Concert, ConcertViewHolder&gt;(DIFF_CALLBACK) {\n    fun onBindViewHolder(holder: ConcertViewHolder, position: Int) {\n        val concert = getItem(position)\n        if (concert != null) {\n            holder.bindTo(concert)\n        } else {\n            \/\/ Null\uc77c\uacbd\uc6b0 PagedListAdapter\ub294 \uc790\ub3d9\uc73c\ub85c \ub370\uc774\ud130\ubca0\uc774\uc2a4\ub85c\ubd80\ud130 \uc544\uc774\ud15c\uc744 \ub85c\ub4dc\ud558\uc5ec\n            \/\/ \ud574\ub2f9 \ud589\uc744 \uac31\uc2e0 \ud558\uac8c \ub429\ub2c8\ub2e4.\n            holder.clear()\n        }\n    }\n    companion object {\n        private val DIFF_CALLBACK = object : DiffUtil.ItemCallback&lt;Concert&gt;() {\n            override fun areItemsTheSame(oldConcert: Concert,\n                    newConcert: Concert): Boolean =\n                    oldConcert.id == newConcert.id\n            override fun areContentsTheSame(oldConcert: Concert,\n                    newConcert: Concert): Boolean =\n                    oldConcert == newConcert\n        }\n    }\n}<\/pre>\n<p>\ub9ac\uc2f8\uc774\ud074\ub7ec\ubdf0\uc5d0\uc11c \uac00\uc7a5 \uc911\uc694\ud55c \uc5b4\ub311\ud130 \ubd80\ubd84\uc785\ub2c8\ub2e4.<br \/>\n\ub9ac\uc2f8\uc774\ud074\ub7ec\ubdf0\uc758 \uc131\ub2a5\uc744 \uac1c\uc120\ud558\uae30 \uc704\ud574 DiffUtil.ItemCallback\uc744 \uc4f0\uc2e4\ud150\ub370\uc694.<br \/>\n\ud398\uc774\uc9d5 \ub77c\uc774\ube0c\ub7ec\ub9ac\uc5d0\uc11c\ub294\u00a0DiffUtil.ItemCallback \ubc18\ub4dc\uc2dc \uad6c\ud604\ud574\uc57c\ud569\ub2c8\ub2e4.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Paiging\ub77c\uc774\ube0c\ub7ec\ub9ac \uac1c\uc694 \ud398\uc774\uc9d5 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub294 \ub370\uc774\ud130 \ub85c\ub529\uc744 \uc27d\uac8c, \uc810\uc9c4\uc801\uc73c\ub85c \uadf8\ub9ac\uace0 \uc544\uc8fc \uc6b0\uc544\ud558\uac8c RecyclerView\uc640 \ud568\uaed8 \uc791\ub3d9\ud558\ub3c4\ub85d \ub3c4\uc640\uc8fc\ub294 \ub77c\uc774\ube0c\ub7ec\ub9ac\uc774\ub2e4. \ub9ce\uc740 \uc571\ub4e4\uc774 \ub9ce\uc740 \uc591\uc758 \ub370\uc774\ud0c0\ub97c \ub85c\ub529\ud574\ub450\uace0, \uc2e4\uc81c\ub85c\ub294 \uc804\uccb4\uc758 \uc77c\ubd80\ub9cc\uc744 \uc2e4\uc81c\ub85c \ubcf4\uc5ec\uc8fc\uac8c \ub41c\ub2e4. \ud398\uc774\uc9d5\ub77c\uc774\ube0c\ub7ec\ub9ac\ub294 \ud569\ub9ac\uc801\uc73c\ub85c \uc774\ub7f0 \ub370\uc774\ud130\uc758 \ubd80\ubd84\uc9d1\ud569\ub9cc\uc744 \ud45c\ud604\ud558\uace0 \uad00\ucc30\ud558\ub294\uac83\uc744 \ub3c4\uc640\uc900\ub2e4. \uc774\ub7f0 \uae30\ub2a5\uc740 \uba87\uba87 \uc7a5\uc810\uc744 \uac16\uac8c \ub41c\ub2e4. \ub370\uc774\ud130\ub97c \uc810\uc9c4\uc801\uc73c\ub85c \ub85c\ub529\ud558\uae30 \ub54c\ubb38\uc5d0 \ub124\ud2b8\uc6cc\ud06c \uc0ac\uc6a9\ub7c9 \ubc0f \uc2dc\uc2a4\ud15c [&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\/484"}],"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=484"}],"version-history":[{"count":0,"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/posts\/484\/revisions"}],"wp:attachment":[{"href":"https:\/\/charlezz.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=484"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/charlezz.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=484"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/charlezz.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=484"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}