{"id":10643,"date":"2020-11-21T15:34:05","date_gmt":"2020-11-21T06:34:05","guid":{"rendered":"http:\/\/www.gisdeveloper.co.kr\/?p=10643"},"modified":"2020-11-21T15:52:48","modified_gmt":"2020-11-21T06:52:48","slug":"android-recycleview-%ec%b6%94%ea%b0%80%ed%95%98%ea%b8%b0","status":"publish","type":"post","link":"http:\/\/www.gisdeveloper.co.kr\/?p=10643","title":{"rendered":"[Android] RecycleView \ucd94\uac00\ud558\uae30"},"content":{"rendered":"<p>\uba87\ubc88\uc744 \uc0ac\uc6a9\ud574\ub3c4 \ub9e8\ub0a0 \uc78a\ub294\ub2e4. \ucd94\ud6c4 \ub2e4\uc2dc RecycleView\ub97c \uc0ac\uc6a9\ud560\ub54c \ucc38\uc870\ud558\uae30 \uc704\ud574 \uc815\ub9ac\ud574 \ub454\ub2e4.<\/p>\n<p>\uba3c\uc800 \ub808\uc774\uc544\uc6c3 \uc694\uc18c\ub85c\uc11c \ucd94\uac00\ud55c\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"xml\">\r\n&lt;androidx.recyclerview.widget.RecyclerView\r\n    android:id=\"@+id\/rvCollectingData\"\r\n    android:layout_width=\"match_parent\"\r\n    android:layout_height=\"match_parent\" \/>\r\n<\/pre>\n<p>RecycleView\ub294 \uc720\uc0ac\ud55c \ub808\uc774\uc544\uc6c3\uc744 \uac16\ub294 \ub0b4\uc6a9\ub9cc \ub2e4\ub978 \ud56d\ubaa9\uc5d0 \ub300\ud55c \ub9ac\uc2a4\ud2b8 UI\uc778\ub370, \uba3c\uc800 \ud56d\ubaa9\uc744 \uad6c\uc131\ud558\ub294 \ub370\uc774\ud130 \ud074\ub798\uc2a4 \uc815\uc758\uac00 \ud544\uc694\ud558\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"kotlin\">\r\npackage geoservice.nexgen.collectingdata.datalistactivity\r\n\r\nimport geoservice.nexgen.collectingdata.DataCollectingDB\r\n\r\ndata class DataCollectingListItem(\r\n    val id: Int,\r\n    val link_id: Int,\r\n    val type: DataCollectingDB.Type,\r\n    val data: String,\r\n    val title: String,\r\n    val date: String\r\n)\r\n<\/pre>\n<p>\ud56d\ubaa9\uc5d0 \ub300\ud55c \ub808\uc774\uc544\uc6c3\ub3c4 \ud544\uc694\ud55c\ub370 \ub2e4\uc74c\uacfc \uac19\ub2e4. \ud30c\uc77c\uba85\uc740 data_collection_list_recycler_view_item.xml\ub85c \uc9c0\uc815\ud55c\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"xml\">\r\n&lt;?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n&lt;LinearLayout xmlns:android=\"http:\/\/schemas.android.com\/apk\/res\/android\"\r\n    xmlns:app=\"http:\/\/schemas.android.com\/apk\/res-auto\"\r\n    android:layout_width=\"match_parent\"\r\n    android:layout_height=\"44dp\"\r\n    android:paddingHorizontal=\"10dp\"\r\n    android:gravity=\"center_vertical\"\r\n    android:orientation=\"horizontal\">\r\n\r\n    &lt;ImageView\r\n        android:id=\"@+id\/ivIcon\"\r\n        android:src=\"@drawable\/ic_layers_black\"\r\n        android:layout_width=\"wrap_content\"\r\n        android:layout_height=\"wrap_content\"\r\n        app:tint=\"#444444\" \/>\r\n\r\n    &lt;TextView\r\n        android:textSize=\"@dimen\/normal_text_size\"\r\n        android:id=\"@+id\/tvCaption\"\r\n        android:layout_marginLeft=\"10dp\"\r\n        android:layout_width=\"match_parent\"\r\n        android:layout_weight=\"1\"\r\n        android:layout_height=\"wrap_content\" \/>\r\n\r\n    &lt;TextView\r\n        android:textSize=\"@dimen\/small_text_size\"\r\n        android:id=\"@+id\/tvDate\"\r\n        android:layout_width=\"100dp\"\r\n        android:textAlignment=\"center\"\r\n        android:layout_height=\"wrap_content\" \/>\r\n&lt;\/LinearLayout>\r\n<\/pre>\n<p>\uc774\uc81c \uc704\uc5d0\uc11c \uc815\uc758\ud55c \ucf54\ub4dc\uc640 \ub808\uc774\uc544\uc6c3\uc774 \uc801\uc6a9\ub41c Adapter \ud074\ub798\uc2a4\ub97c \ucd94\uac00\ud55c\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"kotlin\">\r\npackage geoservice.nexgen.collectingdata.datalistactivity\r\n\r\nimport android.view.LayoutInflater\r\nimport android.view.View\r\nimport android.view.ViewGroup\r\nimport android.widget.ImageView\r\nimport android.widget.TextView\r\nimport androidx.recyclerview.widget.RecyclerView\r\nimport geoservice.nexgen.R\r\nimport geoservice.nexgen.collectingdata.DataCollectingDB\r\n\r\nclass DataCollectingListRecyclerViewAdapter(val items: ArrayList&lt;DataCollectingListItem>) \r\n    : RecyclerView.Adapter&lt;RecyclerView.ViewHolder>() {\r\n    internal inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {\r\n        val ivIcon = itemView.findViewById&lt;ImageView>(R.id.ivIcon)\r\n        val tvCaption = itemView.findViewById&lt;TextView>(R.id.tvCaption)\r\n        val tvDate = itemView.findViewById&lt;TextView>(R.id.tvDate)\r\n    }\r\n\r\n    override fun onCreateViewHolder(viewGroup: ViewGroup, i: Int): RecyclerView.ViewHolder {\r\n        val view: View = LayoutInflater.from(viewGroup.context)\r\n                .inflate(R.layout.data_collection_list_recycler_view_item, viewGroup, false)\r\n        return ViewHolder(view)\r\n    }\r\n\r\n    override fun onBindViewHolder(viewHolder: RecyclerView.ViewHolder, i: Int) {\r\n        val holder = viewHolder as ViewHolder\r\n        val item = items[i]\r\n\r\n        when(item.type) {\r\n            DataCollectingDB.Type.FORM -> holder.ivIcon.setImageResource(R.drawable.ic_form_black)\r\n            DataCollectingDB.Type.MOVIE -> holder.ivIcon.setImageResource(R.drawable.ic_movie_black)\r\n            DataCollectingDB.Type.PHOTO -> holder.ivIcon.setImageResource(R.drawable.ic_photo_camera_black)\r\n        }\r\n\r\n        holder.tvCaption.text = item.title\r\n\r\n        holder.tvDate.text = item.date\r\n    }\r\n\r\n    override fun getItemCount(): Int {\r\n        return items.size\r\n    }\r\n}\r\n<\/pre>\n<p>\uc774\uc81c Activity\uc5d0\uc11c RecycleView\uc5d0 \ub300\ud55c \uc124\uc815 \ucf54\ub4dc\ub97c \uc791\uc131\ud558\ub294\ub370, \uba3c\uc800 \ub808\uc774\uc544\uc6c3\uc744 \uc7a1\ub294\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"kotlin\">\r\noverride fun onCreate(savedInstanceState: Bundle?) {\r\n    super.onCreate(savedInstanceState)\r\n\r\n    rvCollectingData.layoutManager = LinearLayoutManager(this)\r\n}\r\n<\/pre>\n<p>\ub2e4\uc74c\uc740 RecycleView\uc5d0 \ud45c\uc2dc\ub420 \ub370\uc774\ud130 \ud56d\ubaa9\uc744 \uad6c\uc131\ud558\uace0 Adapter\ub85c \uc9c0\uc815\ud558\ub294 \ucf54\ub4dc\uc774\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"kotlin\">\r\nprivate fun setupCollectionDataRecycleView(id: Int) {\r\n    var items: ArrayList&lt;DataCollectingListItem>? = null\r\n    val job = GlobalScope.launch(Dispatchers.IO) {\r\n        items = MainActivity.dataCollectingDB.getSubItems(id)\r\n    }\r\n\r\n    GlobalScope.launch(Dispatchers.Main) {\r\n        job.join()\r\n        items?.let {\r\n            rvCollectingData.adapter = DataCollectingListRecyclerViewAdapter(it)\r\n        }\r\n    }\r\n}\r\n<\/pre>\n<p>\uc880\ub354 \uc774\ud574\ub97c \ub3d5\uace0\uc790, \uc704\uc758 \ucf54\ub4dc \uc911 MainActivity.dataCollectingDB.getSubItems \ud568\uc218\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"kotlin\">\r\nfun getSubItems(link_id: Int): ArrayList&lt;DataCollectingListItem> {\r\n    val result = ArrayList&lt;DataCollectingListItem>()\r\n    val sql = \"SELECT id, type, data, title, date FROM sub_item WHERE link_id = $link_id\"\r\n    Log.v(\"DIP2K\", sql)\r\n    val stmt = db.prepare(sql)\r\n    while (stmt.step()) {\r\n        val id = stmt.column_int(0)\r\n        val type = stmt.column_string(1)\r\n        val data = stmt.column_string(2)\r\n        val title = stmt.column_string(3)\r\n        val date = stmt.column_string(4)\r\n\r\n        val item = DataCollectingListItem(id, link_id, Type.valueOf(type), data, title, date)\r\n        result.add(item)\r\n    }\r\n\r\n    return result\r\n}\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\uba87\ubc88\uc744 \uc0ac\uc6a9\ud574\ub3c4 \ub9e8\ub0a0 \uc78a\ub294\ub2e4. \ucd94\ud6c4 \ub2e4\uc2dc RecycleView\ub97c \uc0ac\uc6a9\ud560\ub54c \ucc38\uc870\ud558\uae30 \uc704\ud574 \uc815\ub9ac\ud574 \ub454\ub2e4. \uba3c\uc800 \ub808\uc774\uc544\uc6c3 \uc694\uc18c\ub85c\uc11c \ucd94\uac00\ud55c\ub2e4. &lt;androidx.recyclerview.widget.RecyclerView android:id=&#8221;@+id\/rvCollectingData&#8221; android:layout_width=&#8221;match_parent&#8221; android:layout_height=&#8221;match_parent&#8221; \/> RecycleView\ub294 \uc720\uc0ac\ud55c \ub808\uc774\uc544\uc6c3\uc744 \uac16\ub294 \ub0b4\uc6a9\ub9cc \ub2e4\ub978 \ud56d\ubaa9\uc5d0 \ub300\ud55c \ub9ac\uc2a4\ud2b8 UI\uc778\ub370, \uba3c\uc800 \ud56d\ubaa9\uc744 \uad6c\uc131\ud558\ub294 \ub370\uc774\ud130 \ud074\ub798\uc2a4 \uc815\uc758\uac00 \ud544\uc694\ud558\ub2e4. package geoservice.nexgen.collectingdata.datalistactivity import geoservice.nexgen.collectingdata.DataCollectingDB data class DataCollectingListItem( val id: Int, val link_id: Int, val type: DataCollectingDB.Type, val &hellip; <\/p>\n<p class=\"link-more\"><a href=\"http:\/\/www.gisdeveloper.co.kr\/?p=10643\" class=\"more-link\">\ub354 \ubcf4\uae30<span class=\"screen-reader-text\"> &#8220;[Android] RecycleView \ucd94\uac00\ud558\uae30&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[61],"tags":[],"class_list":["post-10643","post","type-post","status-publish","format-standard","hentry","category-android"],"_links":{"self":[{"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/posts\/10643","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=10643"}],"version-history":[{"count":9,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/posts\/10643\/revisions"}],"predecessor-version":[{"id":10653,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/posts\/10643\/revisions\/10653"}],"wp:attachment":[{"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=10643"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=10643"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=10643"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}