From 31ed9cf156d963a95c0c6bf80d80d0539cf7ba02 Mon Sep 17 00:00:00 2001 From: lf_wannabe Date: Tue, 29 Aug 2017 02:09:09 +0900 Subject: [PATCH 1/6] Realm, ConstrainLayout --- RecyclerViewWithHeader/app/build.gradle | 3 +- .../app/src/main/AndroidManifest.xml | 1 + .../adapter/ListAdapterWithHeader.kt | 9 +++-- .../mim/recyclerview_header/model/Item.kt | 12 +++--- .../recyclerview_header/model/ItemHolder.kt | 1 + .../recyclerviewwithheader/BaseApplication.kt | 21 ++++++++++ .../recyclerviewwithheader/MainActivity.kt | 37 ++++++++++++++---- .../app/src/main/res/layout/activity_main.xml | 10 +++++ .../app/src/main/res/layout/list_content.xml | 13 ++++-- .../mipmap-mdpi/ic_add_circle_black_24dp.png | Bin 0 -> 222 bytes RecyclerViewWithHeader/build.gradle | 3 +- .../gradle/wrapper/gradle-wrapper.properties | 4 +- 12 files changed, 89 insertions(+), 25 deletions(-) create mode 100644 RecyclerViewWithHeader/app/src/main/java/com/example/lf_wannabe/recyclerviewwithheader/BaseApplication.kt create mode 100644 RecyclerViewWithHeader/app/src/main/res/mipmap-mdpi/ic_add_circle_black_24dp.png diff --git a/RecyclerViewWithHeader/app/build.gradle b/RecyclerViewWithHeader/app/build.gradle index 2721722..b9e1d4a 100644 --- a/RecyclerViewWithHeader/app/build.gradle +++ b/RecyclerViewWithHeader/app/build.gradle @@ -1,6 +1,7 @@ apply plugin: 'com.android.application' -apply plugin: 'kotlin-android' // 코틀린 플러그인을 적용합니다. +apply plugin: 'kotlin-android' // 코틀린 플러그인을 적용 apply plugin: 'kotlin-android-extensions' // 익스텐션 플러그인 적용 +apply plugin: 'realm-android' // Realm 플러그인 적용 android { compileSdkVersion 25 diff --git a/RecyclerViewWithHeader/app/src/main/AndroidManifest.xml b/RecyclerViewWithHeader/app/src/main/AndroidManifest.xml index f5b16e2..4070c42 100644 --- a/RecyclerViewWithHeader/app/src/main/AndroidManifest.xml +++ b/RecyclerViewWithHeader/app/src/main/AndroidManifest.xml @@ -3,6 +3,7 @@ package="com.example.lf_wannabe.recyclerviewwithheader" > = ArrayList() + private lateinit var list: RealmResults override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder = when(viewType){ @@ -39,7 +40,7 @@ abstract class ListAdapterWithHeader(val activity: FragmentActivity, protected v } } - fun setData(list: ArrayList){ + fun setData(list: RealmResults){ // null 체크 필요없나 ? this.list = list } @@ -49,9 +50,9 @@ abstract class ListAdapterWithHeader(val activity: FragmentActivity, protected v } override fun getItemCount(): Int { - return if (list != null) (list as ArrayList).size + (if (hasHeader) 1 else 0) else if (hasHeader) 1 else 0 + return if (list != null) list.size + (if (hasHeader) 1 else 0) else if (hasHeader) 1 else 0 } - private fun getItem(position: Int): Item? = list?.get(position - 1) + private fun getItem(position: Int): Item? = list[position - 1] } \ No newline at end of file diff --git a/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/model/Item.kt b/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/model/Item.kt index 44ebf8d..0a2f72d 100644 --- a/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/model/Item.kt +++ b/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/model/Item.kt @@ -1,10 +1,12 @@ package com.tutorial.mim.recyclerview_header.model +import io.realm.RealmObject + /** * Created by lf_wannabe on 27/08/2017. */ -class Item ( - var num: Int = 0, - var title: String = "TITLE", - var content: String = "CONTENT" -) \ No newline at end of file +open class Item( + open var num: Int = 0, + open var title: String = "TITLE", + open var content: String = "CONTENT" +): RealmObject() \ No newline at end of file diff --git a/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/model/ItemHolder.kt b/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/model/ItemHolder.kt index 2e11511..7476375 100644 --- a/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/model/ItemHolder.kt +++ b/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/model/ItemHolder.kt @@ -1,6 +1,7 @@ package com.tutorial.mim.recyclerview_header.model import android.content.Context +import android.util.Log import android.view.View import kotlinx.android.synthetic.main.list_content.view.* diff --git a/RecyclerViewWithHeader/app/src/main/java/com/example/lf_wannabe/recyclerviewwithheader/BaseApplication.kt b/RecyclerViewWithHeader/app/src/main/java/com/example/lf_wannabe/recyclerviewwithheader/BaseApplication.kt new file mode 100644 index 0000000..500f8a5 --- /dev/null +++ b/RecyclerViewWithHeader/app/src/main/java/com/example/lf_wannabe/recyclerviewwithheader/BaseApplication.kt @@ -0,0 +1,21 @@ +package com.example.lf_wannabe.recyclerviewwithheader + +import android.app.Application +import io.realm.Realm + +/** + * Created by lf_wannabe on 28/08/2017. + */ +class BaseApplication: Application() { + override fun onCreate() { + super.onCreate() + initRealm() + + } + + private fun initRealm(){ + // 초기화 필요없나? +// Realm.init + + } +} \ No newline at end of file diff --git a/RecyclerViewWithHeader/app/src/main/java/com/example/lf_wannabe/recyclerviewwithheader/MainActivity.kt b/RecyclerViewWithHeader/app/src/main/java/com/example/lf_wannabe/recyclerviewwithheader/MainActivity.kt index 21e08a6..414ee4a 100644 --- a/RecyclerViewWithHeader/app/src/main/java/com/example/lf_wannabe/recyclerviewwithheader/MainActivity.kt +++ b/RecyclerViewWithHeader/app/src/main/java/com/example/lf_wannabe/recyclerviewwithheader/MainActivity.kt @@ -5,29 +5,50 @@ import android.support.v7.app.AppCompatActivity import android.support.v7.widget.LinearLayoutManager import com.tutorial.mim.recyclerview_header.ex.ExAdapter import com.tutorial.mim.recyclerview_header.model.Item +import io.realm.Realm +import io.realm.RealmConfiguration import kotlinx.android.synthetic.main.activity_main.* +import kotlin.properties.Delegates class MainActivity : AppCompatActivity() { + var i: Int = 1 + + private var realm: Realm by Delegates.notNull() + private var realmConfig: RealmConfiguration by Delegates.notNull() + + var vAdapter: ExAdapter by Delegates.notNull() + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) - var vList: ArrayList = ArrayList() - for(i in 1..100){ - vList.add(Item(i, "TITLE", "CONTENT")) - } + realmConfig = RealmConfiguration.Builder(this).build() + realm = Realm.getInstance(realmConfig) - var vAdapter: ExAdapter = ExAdapter(this, true, Item()) - with(vAdapter){ - setData(vList) - } + vAdapter = ExAdapter(this, true, Item()) with(list){ setHasFixedSize(false) adapter = vAdapter layoutManager = LinearLayoutManager(this@MainActivity) } + + addBtn.setOnClickListener{ + realm.beginTransaction() + var tmp = realm.createObject(Item::class.java) + tmp.num = i++ + tmp.title = "TITLE" + tmp.content = "CONTENT" + realm.commitTransaction() + +// vAdapter.setData(realm.where(Item::class.java).findAll()) + } + } + override fun onResume() { + super.onResume() + vAdapter.setData(realm.where(Item::class.java).findAll()) + } } diff --git a/RecyclerViewWithHeader/app/src/main/res/layout/activity_main.xml b/RecyclerViewWithHeader/app/src/main/res/layout/activity_main.xml index 230c482..6b7897a 100644 --- a/RecyclerViewWithHeader/app/src/main/res/layout/activity_main.xml +++ b/RecyclerViewWithHeader/app/src/main/res/layout/activity_main.xml @@ -14,4 +14,14 @@ + + diff --git a/RecyclerViewWithHeader/app/src/main/res/layout/list_content.xml b/RecyclerViewWithHeader/app/src/main/res/layout/list_content.xml index 7879e82..3608d6a 100644 --- a/RecyclerViewWithHeader/app/src/main/res/layout/list_content.xml +++ b/RecyclerViewWithHeader/app/src/main/res/layout/list_content.xml @@ -1,18 +1,23 @@ - + android:layout_height="wrap_content" + /> + - \ No newline at end of file + \ No newline at end of file diff --git a/RecyclerViewWithHeader/app/src/main/res/mipmap-mdpi/ic_add_circle_black_24dp.png b/RecyclerViewWithHeader/app/src/main/res/mipmap-mdpi/ic_add_circle_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..ac376d05e3144898989d305f2adebbdfe5f7dfb1 GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_+irJgR1Ar*{!&pDoIQIKhWC@x;L zf5DGMFMNyz&d7FI1u2@gujq}}X5|%StE#j9xnH3_xa3U6x$Ie;Vy;Kz<9oKx?TT*V zZ~Og~gXv!71eW=Rol`AVJb2&meUsuwD<2~RlZfIlgQS;h5{_EkO+3(goZs=@bg?y> z+7cUXtyyp^=*>w7<-!#PouU=LUi_Th(4nHwvfXRjgNR@O#Y~Av%XPXuS3Kmt@ptYJ WIlAVJ(_Ns089ZJ6T-G@yGywpV!dJKe literal 0 HcmV?d00001 diff --git a/RecyclerViewWithHeader/build.gradle b/RecyclerViewWithHeader/build.gradle index 811b84a..2a641dc 100644 --- a/RecyclerViewWithHeader/build.gradle +++ b/RecyclerViewWithHeader/build.gradle @@ -6,8 +6,9 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:2.3.3' + classpath 'com.android.tools.build:gradle:3.0.0-beta2' classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.1.4-2' // 코틀린 플러그인 적용 + classpath "io.realm:realm-gradle-plugin:0.88.2" // Realm for Kotlin플러그인 적용 // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } diff --git a/RecyclerViewWithHeader/gradle/wrapper/gradle-wrapper.properties b/RecyclerViewWithHeader/gradle/wrapper/gradle-wrapper.properties index 9262ef9..6105d28 100644 --- a/RecyclerViewWithHeader/gradle/wrapper/gradle-wrapper.properties +++ b/RecyclerViewWithHeader/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Sun Aug 27 15:41:53 KST 2017 +#Mon Aug 28 22:31:21 KST 2017 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-rc-1-all.zip From a10e8f620ba1faecf1a32021635e9637b28f750e Mon Sep 17 00:00:00 2001 From: lf_wannabe Date: Wed, 30 Aug 2017 20:31:57 +0900 Subject: [PATCH 2/6] With ClickListener --- .../.idea/codeStyleSettings.xml | 229 ++++++++++++++++++ .../app/src/main/AndroidManifest.xml | 3 + .../adapter/ListAdapterWithHeader.kt | 49 +++- .../mim/recyclerview_header/ex/ExAdapter.kt | 5 +- .../model/BaseViewHolder.kt | 7 +- .../recyclerview_header/model/ItemHolder.kt | 2 +- .../recyclerviewwithheader/BaseApplication.kt | 15 +- .../recyclerviewwithheader/MainActivity.kt | 18 +- .../recyclerviewwithheader/PopupActivity.kt | 17 ++ .../app/src/main/res/layout/activity_main.xml | 4 +- .../src/main/res/layout/activity_popup.xml | 163 +++++++++++++ .../app/src/main/res/layout/list_content.xml | 11 +- .../app/src/main/res/layout/list_header.xml | 3 +- .../res/mipmap-mdpi/ic_delete_black_24dp.png | Bin 0 -> 111 bytes .../app/src/main/res/values/colors.xml | 6 + .../app/src/main/res/values/strings.xml | 12 + .../app/src/main/res/values/styles.xml | 21 ++ 17 files changed, 536 insertions(+), 29 deletions(-) create mode 100644 RecyclerViewWithHeader/.idea/codeStyleSettings.xml create mode 100644 RecyclerViewWithHeader/app/src/main/java/com/example/lf_wannabe/recyclerviewwithheader/PopupActivity.kt create mode 100644 RecyclerViewWithHeader/app/src/main/res/layout/activity_popup.xml create mode 100644 RecyclerViewWithHeader/app/src/main/res/mipmap-mdpi/ic_delete_black_24dp.png diff --git a/RecyclerViewWithHeader/.idea/codeStyleSettings.xml b/RecyclerViewWithHeader/.idea/codeStyleSettings.xml new file mode 100644 index 0000000..25a8b87 --- /dev/null +++ b/RecyclerViewWithHeader/.idea/codeStyleSettings.xml @@ -0,0 +1,229 @@ + + + + + + \ No newline at end of file diff --git a/RecyclerViewWithHeader/app/src/main/AndroidManifest.xml b/RecyclerViewWithHeader/app/src/main/AndroidManifest.xml index 4070c42..f1a3e83 100644 --- a/RecyclerViewWithHeader/app/src/main/AndroidManifest.xml +++ b/RecyclerViewWithHeader/app/src/main/AndroidManifest.xml @@ -16,6 +16,9 @@ + + \ No newline at end of file diff --git a/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/adapter/ListAdapterWithHeader.kt b/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/adapter/ListAdapterWithHeader.kt index 710f1b2..625d179 100644 --- a/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/adapter/ListAdapterWithHeader.kt +++ b/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/adapter/ListAdapterWithHeader.kt @@ -6,6 +6,7 @@ import android.view.ViewGroup import com.tutorial.mim.recyclerview_header.model.Item import android.view.LayoutInflater +import android.view.View import com.example.lf_wannabe.recyclerviewwithheader.R import com.tutorial.mim.recyclerview_header.model.ItemHolder import io.realm.RealmResults @@ -15,34 +16,60 @@ import io.realm.RealmResults * Created by lf_wannabe on 26/08/2017. */ -abstract class ListAdapterWithHeader(val activity: FragmentActivity, protected val hasHeader: Boolean) - : RecyclerView.Adapter(){ +abstract class ListAdapterWithHeader(val activity: FragmentActivity, + protected val hasHeader: Boolean) + : RecyclerView.Adapter() { private val HEADER_TYPE: Int = 0 private val ITEM_TYPE: Int = 1 private lateinit var list: RealmResults - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder - = when(viewType){ - HEADER_TYPE -> createHeaderView(activity.layoutInflater, parent) - else -> ItemHolder(activity.layoutInflater.inflate(R.layout.list_content, parent, false)) - } + companion object { + lateinit var mOnItemClickListener: OnItemClickListener + } + + interface OnItemClickListener { + fun onItemClick(v: View, position: Int) {} + } + + fun setOnItemClickListener(onItemClickListener: OnItemClickListener) { + mOnItemClickListener = onItemClickListener + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder = + when (viewType) { + HEADER_TYPE -> createHeaderView(activity.layoutInflater, parent) + else -> ItemHolder(activity.layoutInflater + .inflate(R.layout.list_content, parent, false)) + } - protected abstract fun createHeaderView(layoutInflater: LayoutInflater, parent: ViewGroup): RecyclerView.ViewHolder + protected abstract fun createHeaderView(layoutInflater: LayoutInflater, parent: ViewGroup) + : RecyclerView.ViewHolder protected abstract fun onBindHeaderView(holder: RecyclerView.ViewHolder, position: Int) override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { when (getItemViewType(position)) { HEADER_TYPE -> onBindHeaderView(holder, position) - ITEM_TYPE -> (holder as ItemHolder).onBind(getItem(position)) + ITEM_TYPE -> { +// (holder as ItemHolder).onBind(getItem(position)) + with(holder as ItemHolder){ + onBind(getItem(position)) + holder.itemView.setOnClickListener { + view -> + if (mOnItemClickListener != null) { + mOnItemClickListener.onItemClick(view, layoutPosition) + } + } + } + } } } - fun setData(list: RealmResults){ - // null 체크 필요없나 ? + fun setData(list: RealmResults) { this.list = list + notifyDataSetChanged() } override fun getItemViewType(position: Int): Int { diff --git a/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/ex/ExAdapter.kt b/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/ex/ExAdapter.kt index 619cdfa..dfe75b2 100644 --- a/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/ex/ExAdapter.kt +++ b/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/ex/ExAdapter.kt @@ -8,6 +8,7 @@ import com.example.lf_wannabe.recyclerviewwithheader.R import com.tutorial.mim.recyclerview_header.adapter.ListAdapterWithHeader import com.tutorial.mim.recyclerview_header.model.HeaderHolder import com.tutorial.mim.recyclerview_header.model.Item +import com.tutorial.mim.recyclerview_header.model.ItemHolder /** * Created by lf_wannabe on 27/08/2017. @@ -17,8 +18,8 @@ class ExAdapter(ac: FragmentActivity, hasHeader: Boolean, item: Item) var mItem: Item = item override fun createHeaderView(layoutInflater: LayoutInflater, parent: ViewGroup) - : RecyclerView.ViewHolder - = HeaderHolder(layoutInflater.inflate(R.layout.list_header, parent, false)) + : RecyclerView.ViewHolder = + HeaderHolder(layoutInflater.inflate(R.layout.list_header, parent, false)) override fun onBindHeaderView(holder: RecyclerView.ViewHolder, position: Int) { (holder as HeaderHolder).onBind(mItem) diff --git a/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/model/BaseViewHolder.kt b/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/model/BaseViewHolder.kt index 0f033b3..e9db335 100644 --- a/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/model/BaseViewHolder.kt +++ b/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/model/BaseViewHolder.kt @@ -7,9 +7,10 @@ import android.view.View /** * Created by lf_wannabe on 27/08/2017. */ -abstract class BaseViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { +abstract class BaseViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView){ - abstract fun onBind(item: Item?) + abstract fun onBind(item: T?) + + abstract fun onBind(data: T, onClickListener: View.OnClickListener, context: Context) - abstract fun onBind(data: Item, onClickListener: View.OnClickListener, context: Context) } diff --git a/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/model/ItemHolder.kt b/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/model/ItemHolder.kt index 7476375..11cced2 100644 --- a/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/model/ItemHolder.kt +++ b/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/model/ItemHolder.kt @@ -8,7 +8,7 @@ import kotlinx.android.synthetic.main.list_content.view.* /** * Created by lf_wannabe on 27/08/2017. */ -class ItemHolder(itemView: View) : BaseViewHolder(itemView) { +class ItemHolder(itemView: View) : BaseViewHolder(itemView) { override fun onBind(item: Item?) { with(itemView){ number.text = item?.num.toString() diff --git a/RecyclerViewWithHeader/app/src/main/java/com/example/lf_wannabe/recyclerviewwithheader/BaseApplication.kt b/RecyclerViewWithHeader/app/src/main/java/com/example/lf_wannabe/recyclerviewwithheader/BaseApplication.kt index 500f8a5..64aaeeb 100644 --- a/RecyclerViewWithHeader/app/src/main/java/com/example/lf_wannabe/recyclerviewwithheader/BaseApplication.kt +++ b/RecyclerViewWithHeader/app/src/main/java/com/example/lf_wannabe/recyclerviewwithheader/BaseApplication.kt @@ -2,20 +2,25 @@ package com.example.lf_wannabe.recyclerviewwithheader import android.app.Application import io.realm.Realm +import io.realm.RealmConfiguration +import kotlin.properties.Delegates /** * Created by lf_wannabe on 28/08/2017. */ class BaseApplication: Application() { + +// companion object { +// var realm: Realm by Delegates.notNull() +// var realmConfig: RealmConfiguration by Delegates.notNull() +// } override fun onCreate() { super.onCreate() - initRealm() - } - private fun initRealm(){ - // 초기화 필요없나? -// Realm.init +// realmConfig = RealmConfiguration.Builder(this).build() +// realm = Realm.getInstance(realmConfig) } + } \ No newline at end of file diff --git a/RecyclerViewWithHeader/app/src/main/java/com/example/lf_wannabe/recyclerviewwithheader/MainActivity.kt b/RecyclerViewWithHeader/app/src/main/java/com/example/lf_wannabe/recyclerviewwithheader/MainActivity.kt index 414ee4a..8a4f6a2 100644 --- a/RecyclerViewWithHeader/app/src/main/java/com/example/lf_wannabe/recyclerviewwithheader/MainActivity.kt +++ b/RecyclerViewWithHeader/app/src/main/java/com/example/lf_wannabe/recyclerviewwithheader/MainActivity.kt @@ -1,8 +1,13 @@ package com.example.lf_wannabe.recyclerviewwithheader +import android.content.Intent import android.os.Bundle import android.support.v7.app.AppCompatActivity import android.support.v7.widget.LinearLayoutManager +import android.util.Log +import android.view.View +import android.widget.Toast +import com.tutorial.mim.recyclerview_header.adapter.ListAdapterWithHeader import com.tutorial.mim.recyclerview_header.ex.ExAdapter import com.tutorial.mim.recyclerview_header.model.Item import io.realm.Realm @@ -14,6 +19,7 @@ class MainActivity : AppCompatActivity() { var i: Int = 1 + // by Delegates.notNull() => 멤버변수가 클래스 생성될때 초기화 되지않지만 변수 접근 전에 반드시 초기화되어야 한다! private var realm: Realm by Delegates.notNull() private var realmConfig: RealmConfiguration by Delegates.notNull() @@ -26,7 +32,14 @@ class MainActivity : AppCompatActivity() { realmConfig = RealmConfiguration.Builder(this).build() realm = Realm.getInstance(realmConfig) + i = realm.where(Item::class.java).findAll().size + 1 + vAdapter = ExAdapter(this, true, Item()) + vAdapter.setOnItemClickListener(object : ListAdapterWithHeader.OnItemClickListener { + override fun onItemClick(v: View, position: Int) { + Toast.makeText(applicationContext, position.toString() + "TOUCHED", Toast.LENGTH_SHORT).show() + } + }) with(list){ setHasFixedSize(false) @@ -35,6 +48,8 @@ class MainActivity : AppCompatActivity() { } addBtn.setOnClickListener{ + startActivity(Intent(this, PopupActivity::class.java)) + realm.beginTransaction() var tmp = realm.createObject(Item::class.java) tmp.num = i++ @@ -42,11 +57,10 @@ class MainActivity : AppCompatActivity() { tmp.content = "CONTENT" realm.commitTransaction() -// vAdapter.setData(realm.where(Item::class.java).findAll()) + vAdapter.setData(realm.where(Item::class.java).findAll()) } } - override fun onResume() { super.onResume() vAdapter.setData(realm.where(Item::class.java).findAll()) diff --git a/RecyclerViewWithHeader/app/src/main/java/com/example/lf_wannabe/recyclerviewwithheader/PopupActivity.kt b/RecyclerViewWithHeader/app/src/main/java/com/example/lf_wannabe/recyclerviewwithheader/PopupActivity.kt new file mode 100644 index 0000000..ac1b1fa --- /dev/null +++ b/RecyclerViewWithHeader/app/src/main/java/com/example/lf_wannabe/recyclerviewwithheader/PopupActivity.kt @@ -0,0 +1,17 @@ +package com.example.lf_wannabe.recyclerviewwithheader + +import android.os.Bundle +import android.os.PersistableBundle +import android.support.v7.app.AppCompatActivity + +/** + * Created by lf_wannabe on 30/08/2017. + */ +class PopupActivity : AppCompatActivity() { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_popup) + + } +} \ No newline at end of file diff --git a/RecyclerViewWithHeader/app/src/main/res/layout/activity_main.xml b/RecyclerViewWithHeader/app/src/main/res/layout/activity_main.xml index 6b7897a..dd38ac4 100644 --- a/RecyclerViewWithHeader/app/src/main/res/layout/activity_main.xml +++ b/RecyclerViewWithHeader/app/src/main/res/layout/activity_main.xml @@ -17,8 +17,8 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/RecyclerViewWithHeader/app/src/main/res/layout/list_content.xml b/RecyclerViewWithHeader/app/src/main/res/layout/list_content.xml index 3608d6a..19ede92 100644 --- a/RecyclerViewWithHeader/app/src/main/res/layout/list_content.xml +++ b/RecyclerViewWithHeader/app/src/main/res/layout/list_content.xml @@ -1,7 +1,7 @@ @@ -20,4 +20,11 @@ android:layout_marginStart="15dp" android:text="Hello World!" /> - \ No newline at end of file + + diff --git a/RecyclerViewWithHeader/app/src/main/res/layout/list_header.xml b/RecyclerViewWithHeader/app/src/main/res/layout/list_header.xml index 45258ea..f092b38 100644 --- a/RecyclerViewWithHeader/app/src/main/res/layout/list_header.xml +++ b/RecyclerViewWithHeader/app/src/main/res/layout/list_header.xml @@ -1,10 +1,11 @@ + android:layout_height="60dp"> diff --git a/RecyclerViewWithHeader/app/src/main/res/mipmap-mdpi/ic_delete_black_24dp.png b/RecyclerViewWithHeader/app/src/main/res/mipmap-mdpi/ic_delete_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..999aa4ccc3f87967d30bed76cd980653d9ad2e95 GIT binary patch literal 111 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_*1Gfx-CkP60R2`-1mhm42oHEI~1 zJY@V|=xk&fz~^CFA98pF+nfiYVNdl7vOlC(bh_?*uW)yDOtOuIF;OXk; Jvd$@?2>??mBq{&^ literal 0 HcmV?d00001 diff --git a/RecyclerViewWithHeader/app/src/main/res/values/colors.xml b/RecyclerViewWithHeader/app/src/main/res/values/colors.xml index 3ab3e9c..12d341f 100644 --- a/RecyclerViewWithHeader/app/src/main/res/values/colors.xml +++ b/RecyclerViewWithHeader/app/src/main/res/values/colors.xml @@ -3,4 +3,10 @@ #3F51B5 #303F9F #FF4081 + + #ffffff + #f5f5f5 + + #6d6d6d + #1b1b1b diff --git a/RecyclerViewWithHeader/app/src/main/res/values/strings.xml b/RecyclerViewWithHeader/app/src/main/res/values/strings.xml index 950cfa8..320519a 100644 --- a/RecyclerViewWithHeader/app/src/main/res/values/strings.xml +++ b/RecyclerViewWithHeader/app/src/main/res/values/strings.xml @@ -1,3 +1,15 @@ RecyclerViewWithHeader + + + User Info + Android O + BirthDay + Favorit + Age + City + AUG 23 + Soccer + 25 + Soeul diff --git a/RecyclerViewWithHeader/app/src/main/res/values/styles.xml b/RecyclerViewWithHeader/app/src/main/res/values/styles.xml index 5885930..a64e561 100644 --- a/RecyclerViewWithHeader/app/src/main/res/values/styles.xml +++ b/RecyclerViewWithHeader/app/src/main/res/values/styles.xml @@ -8,4 +8,25 @@ @color/colorAccent + + + + + + + + From bd3465c4799504f96d81e6d99952c7c4a45acc94 Mon Sep 17 00:00:00 2001 From: lf_wannabe Date: Thu, 31 Aug 2017 03:21:54 +0900 Subject: [PATCH 3/6] optimize the recyclerview --- .../adapter/ListAdapterWithHeader.kt | 64 ++++++++----------- .../mim/recyclerview_header/ex/ExAdapter.kt | 37 +++++++++-- .../model/BaseViewHolder.kt | 4 +- .../recyclerview_header/model/HeaderHolder.kt | 19 ------ .../recyclerview_header/model/ItemHolder.kt | 12 ++-- .../recyclerviewwithheader/MainActivity.kt | 2 +- .../app/src/main/res/layout/activity_main.xml | 21 +++--- .../app/src/main/res/layout/list_content.xml | 9 +-- .../app/src/main/res/layout/list_header.xml | 2 +- 9 files changed, 83 insertions(+), 87 deletions(-) delete mode 100644 RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/model/HeaderHolder.kt diff --git a/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/adapter/ListAdapterWithHeader.kt b/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/adapter/ListAdapterWithHeader.kt index 625d179..baf5baf 100644 --- a/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/adapter/ListAdapterWithHeader.kt +++ b/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/adapter/ListAdapterWithHeader.kt @@ -2,13 +2,9 @@ package com.tutorial.mim.recyclerview_header.adapter import android.support.v4.app.FragmentActivity import android.support.v7.widget.RecyclerView -import android.view.ViewGroup import com.tutorial.mim.recyclerview_header.model.Item - -import android.view.LayoutInflater import android.view.View -import com.example.lf_wannabe.recyclerviewwithheader.R -import com.tutorial.mim.recyclerview_header.model.ItemHolder +import com.tutorial.mim.recyclerview_header.model.BaseViewHolder import io.realm.RealmResults @@ -20,8 +16,8 @@ abstract class ListAdapterWithHeader(val activity: FragmentActivity, protected val hasHeader: Boolean) : RecyclerView.Adapter() { - private val HEADER_TYPE: Int = 0 - private val ITEM_TYPE: Int = 1 + protected val HEADER_TYPE: Int = 0 + protected val ITEM_TYPE: Int = 1 private lateinit var list: RealmResults @@ -36,36 +32,26 @@ abstract class ListAdapterWithHeader(val activity: FragmentActivity, fun setOnItemClickListener(onItemClickListener: OnItemClickListener) { mOnItemClickListener = onItemClickListener } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder = - when (viewType) { - HEADER_TYPE -> createHeaderView(activity.layoutInflater, parent) - else -> ItemHolder(activity.layoutInflater - .inflate(R.layout.list_content, parent, false)) - } - - protected abstract fun createHeaderView(layoutInflater: LayoutInflater, parent: ViewGroup) - : RecyclerView.ViewHolder - - protected abstract fun onBindHeaderView(holder: RecyclerView.ViewHolder, position: Int) - - override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { - when (getItemViewType(position)) { - HEADER_TYPE -> onBindHeaderView(holder, position) - ITEM_TYPE -> { -// (holder as ItemHolder).onBind(getItem(position)) - with(holder as ItemHolder){ - onBind(getItem(position)) - holder.itemView.setOnClickListener { - view -> - if (mOnItemClickListener != null) { - mOnItemClickListener.onItemClick(view, layoutPosition) - } - } - } - } - } - } +// +// protected abstract fun onBindHeaderView(holder: RecyclerView.ViewHolder, position: Int) +// +// override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { +// when (getItemViewType(position)) { +// HEADER_TYPE -> +// onBindHeaderView(holder, position) +// ITEM_TYPE -> { +// with(holder as BaseViewHolder){ +// onBind(getItem(position)) +// holder.itemView.setOnClickListener { +// view -> +// if (mOnItemClickListener != null) { +// mOnItemClickListener.onItemClick(view, layoutPosition) +// } +// } +// } +// } +// } +// } fun setData(list: RealmResults) { this.list = list @@ -77,9 +63,9 @@ abstract class ListAdapterWithHeader(val activity: FragmentActivity, } override fun getItemCount(): Int { - return if (list != null) list.size + (if (hasHeader) 1 else 0) else if (hasHeader) 1 else 0 + return list.size + if (hasHeader) 1 else 0 } - private fun getItem(position: Int): Item? = list[position - 1] + protected fun getItem(position: Int): Item? = list[position - if (hasHeader) 1 else 0] } \ No newline at end of file diff --git a/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/ex/ExAdapter.kt b/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/ex/ExAdapter.kt index dfe75b2..21f14ab 100644 --- a/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/ex/ExAdapter.kt +++ b/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/ex/ExAdapter.kt @@ -6,7 +6,7 @@ import android.view.LayoutInflater import android.view.ViewGroup import com.example.lf_wannabe.recyclerviewwithheader.R import com.tutorial.mim.recyclerview_header.adapter.ListAdapterWithHeader -import com.tutorial.mim.recyclerview_header.model.HeaderHolder +import com.tutorial.mim.recyclerview_header.model.BaseViewHolder import com.tutorial.mim.recyclerview_header.model.Item import com.tutorial.mim.recyclerview_header.model.ItemHolder @@ -17,12 +17,35 @@ class ExAdapter(ac: FragmentActivity, hasHeader: Boolean, item: Item) : ListAdapterWithHeader(ac, hasHeader) { var mItem: Item = item - override fun createHeaderView(layoutInflater: LayoutInflater, parent: ViewGroup) - : RecyclerView.ViewHolder = - HeaderHolder(layoutInflater.inflate(R.layout.list_header, parent, false)) +// override fun onBindHeaderView(holder: RecyclerView.ViewHolder, position: Int) { +// (holder as ItemHolder).onBindHeader(mItem) +// } - override fun onBindHeaderView(holder: RecyclerView.ViewHolder, position: Int) { - (holder as HeaderHolder).onBind(mItem) - } + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder = + when (viewType) { + HEADER_TYPE -> ItemHolder(LayoutInflater.from(parent.context) + .inflate(R.layout.list_header, parent, false)) + else -> ItemHolder(LayoutInflater.from(parent.context) + .inflate(R.layout.list_content, parent, false)) + } + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + when (getItemViewType(position)) { + HEADER_TYPE -> + (holder as ItemHolder).onBindHeader(mItem) + ITEM_TYPE -> { + with(holder as ItemHolder){ + onBind(getItem(position)) + // setOnClickListener를 부모에게 숨기고 싶다 + holder.itemView.setOnClickListener { + view -> + if (mOnItemClickListener != null) { + mOnItemClickListener.onItemClick(view, layoutPosition) + } + } + } + } + } + } } \ No newline at end of file diff --git a/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/model/BaseViewHolder.kt b/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/model/BaseViewHolder.kt index e9db335..90d1ad4 100644 --- a/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/model/BaseViewHolder.kt +++ b/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/model/BaseViewHolder.kt @@ -7,10 +7,10 @@ import android.view.View /** * Created by lf_wannabe on 27/08/2017. */ -abstract class BaseViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView){ +abstract class BaseViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView){ abstract fun onBind(item: T?) - abstract fun onBind(data: T, onClickListener: View.OnClickListener, context: Context) + abstract fun onBindHeader(header: H?) } diff --git a/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/model/HeaderHolder.kt b/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/model/HeaderHolder.kt deleted file mode 100644 index ef90865..0000000 --- a/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/model/HeaderHolder.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.tutorial.mim.recyclerview_header.model - -import android.content.Context -import android.view.View -import kotlinx.android.synthetic.main.list_header.view.* - -/** - * Created by lf_wannabe on 27/08/2017. - */ -class HeaderHolder(itemView: View) : BaseViewHolder(itemView){ - - override fun onBind(item: Item?) { - itemView.header.text = item?.title - } - - override fun onBind(data: Item, onClickListener: View.OnClickListener, context: Context) { - TODO("not implemented") //To change body of created functions use File | Settings | File Templates. - } -} \ No newline at end of file diff --git a/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/model/ItemHolder.kt b/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/model/ItemHolder.kt index 11cced2..56d49bc 100644 --- a/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/model/ItemHolder.kt +++ b/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/model/ItemHolder.kt @@ -1,14 +1,13 @@ package com.tutorial.mim.recyclerview_header.model -import android.content.Context -import android.util.Log import android.view.View import kotlinx.android.synthetic.main.list_content.view.* +import kotlinx.android.synthetic.main.list_header.view.* /** * Created by lf_wannabe on 27/08/2017. */ -class ItemHolder(itemView: View) : BaseViewHolder(itemView) { +class ItemHolder(itemView: View) : BaseViewHolder(itemView) { override fun onBind(item: Item?) { with(itemView){ number.text = item?.num.toString() @@ -16,7 +15,10 @@ class ItemHolder(itemView: View) : BaseViewHolder(itemView) { } } - override fun onBind(data: Item, onClickListener: View.OnClickListener, context: Context) { - TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + override fun onBindHeader(header: Item?) { + itemView.header.text = header?.title } + + + } \ No newline at end of file diff --git a/RecyclerViewWithHeader/app/src/main/java/com/example/lf_wannabe/recyclerviewwithheader/MainActivity.kt b/RecyclerViewWithHeader/app/src/main/java/com/example/lf_wannabe/recyclerviewwithheader/MainActivity.kt index 8a4f6a2..859d801 100644 --- a/RecyclerViewWithHeader/app/src/main/java/com/example/lf_wannabe/recyclerviewwithheader/MainActivity.kt +++ b/RecyclerViewWithHeader/app/src/main/java/com/example/lf_wannabe/recyclerviewwithheader/MainActivity.kt @@ -48,7 +48,7 @@ class MainActivity : AppCompatActivity() { } addBtn.setOnClickListener{ - startActivity(Intent(this, PopupActivity::class.java)) +// startActivity(Intent(this, PopupActivity::class.java)) realm.beginTransaction() var tmp = realm.createObject(Item::class.java) diff --git a/RecyclerViewWithHeader/app/src/main/res/layout/activity_main.xml b/RecyclerViewWithHeader/app/src/main/res/layout/activity_main.xml index dd38ac4..e2ff269 100644 --- a/RecyclerViewWithHeader/app/src/main/res/layout/activity_main.xml +++ b/RecyclerViewWithHeader/app/src/main/res/layout/activity_main.xml @@ -1,27 +1,30 @@ - + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginEnd="16dp" + android:layout_marginStart="16dp" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent"> + android:layout_marginEnd="24dp" + android:src="@mipmap/ic_add_circle_black_24dp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" /> diff --git a/RecyclerViewWithHeader/app/src/main/res/layout/list_content.xml b/RecyclerViewWithHeader/app/src/main/res/layout/list_content.xml index 19ede92..7cba304 100644 --- a/RecyclerViewWithHeader/app/src/main/res/layout/list_content.xml +++ b/RecyclerViewWithHeader/app/src/main/res/layout/list_content.xml @@ -1,16 +1,17 @@ - + xmlns:app="http://schemas.android.com/apk/res-auto"> + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> Date: Thu, 31 Aug 2017 18:05:51 +0900 Subject: [PATCH 4/6] =?UTF-8?q?RecyclerViewWithHeader=20=EC=B6=94=EC=83=81?= =?UTF-8?q?=ED=99=94=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adapter/ListAdapterWithHeader.kt | 34 ++++--------------- .../mim/recyclerview_header/ex/ExAdapter.kt | 9 ++--- .../recyclerviewwithheader/MainActivity.kt | 2 -- 3 files changed, 9 insertions(+), 36 deletions(-) diff --git a/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/adapter/ListAdapterWithHeader.kt b/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/adapter/ListAdapterWithHeader.kt index baf5baf..09da192 100644 --- a/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/adapter/ListAdapterWithHeader.kt +++ b/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/adapter/ListAdapterWithHeader.kt @@ -4,7 +4,6 @@ import android.support.v4.app.FragmentActivity import android.support.v7.widget.RecyclerView import com.tutorial.mim.recyclerview_header.model.Item import android.view.View -import com.tutorial.mim.recyclerview_header.model.BaseViewHolder import io.realm.RealmResults @@ -19,7 +18,7 @@ abstract class ListAdapterWithHeader(val activity: FragmentActivity, protected val HEADER_TYPE: Int = 0 protected val ITEM_TYPE: Int = 1 - private lateinit var list: RealmResults + private lateinit var list: RealmResults<*> companion object { lateinit var mOnItemClickListener: OnItemClickListener @@ -32,31 +31,6 @@ abstract class ListAdapterWithHeader(val activity: FragmentActivity, fun setOnItemClickListener(onItemClickListener: OnItemClickListener) { mOnItemClickListener = onItemClickListener } -// -// protected abstract fun onBindHeaderView(holder: RecyclerView.ViewHolder, position: Int) -// -// override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { -// when (getItemViewType(position)) { -// HEADER_TYPE -> -// onBindHeaderView(holder, position) -// ITEM_TYPE -> { -// with(holder as BaseViewHolder){ -// onBind(getItem(position)) -// holder.itemView.setOnClickListener { -// view -> -// if (mOnItemClickListener != null) { -// mOnItemClickListener.onItemClick(view, layoutPosition) -// } -// } -// } -// } -// } -// } - - fun setData(list: RealmResults) { - this.list = list - notifyDataSetChanged() - } override fun getItemViewType(position: Int): Int { return if (hasHeader && position == 0) HEADER_TYPE else ITEM_TYPE @@ -66,6 +40,10 @@ abstract class ListAdapterWithHeader(val activity: FragmentActivity, return list.size + if (hasHeader) 1 else 0 } - protected fun getItem(position: Int): Item? = list[position - if (hasHeader) 1 else 0] + protected fun getItem(position: Int): Any? = list[position - if (hasHeader) 1 else 0] + fun setData(list: RealmResults<*>) { + this.list = list + notifyDataSetChanged() + } } \ No newline at end of file diff --git a/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/ex/ExAdapter.kt b/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/ex/ExAdapter.kt index 21f14ab..c2aafc2 100644 --- a/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/ex/ExAdapter.kt +++ b/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/ex/ExAdapter.kt @@ -9,6 +9,7 @@ import com.tutorial.mim.recyclerview_header.adapter.ListAdapterWithHeader import com.tutorial.mim.recyclerview_header.model.BaseViewHolder import com.tutorial.mim.recyclerview_header.model.Item import com.tutorial.mim.recyclerview_header.model.ItemHolder +import io.realm.RealmResults /** * Created by lf_wannabe on 27/08/2017. @@ -17,10 +18,6 @@ class ExAdapter(ac: FragmentActivity, hasHeader: Boolean, item: Item) : ListAdapterWithHeader(ac, hasHeader) { var mItem: Item = item -// override fun onBindHeaderView(holder: RecyclerView.ViewHolder, position: Int) { -// (holder as ItemHolder).onBindHeader(mItem) -// } - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder = when (viewType) { HEADER_TYPE -> ItemHolder(LayoutInflater.from(parent.context) @@ -35,9 +32,9 @@ class ExAdapter(ac: FragmentActivity, hasHeader: Boolean, item: Item) (holder as ItemHolder).onBindHeader(mItem) ITEM_TYPE -> { with(holder as ItemHolder){ - onBind(getItem(position)) + onBind(getItem(position) as Item) - // setOnClickListener를 부모에게 숨기고 싶다 + // setOnClickListener를 부모에게 숨기고 싶다 holder.itemView.setOnClickListener { view -> if (mOnItemClickListener != null) { diff --git a/RecyclerViewWithHeader/app/src/main/java/com/example/lf_wannabe/recyclerviewwithheader/MainActivity.kt b/RecyclerViewWithHeader/app/src/main/java/com/example/lf_wannabe/recyclerviewwithheader/MainActivity.kt index 859d801..c43260a 100644 --- a/RecyclerViewWithHeader/app/src/main/java/com/example/lf_wannabe/recyclerviewwithheader/MainActivity.kt +++ b/RecyclerViewWithHeader/app/src/main/java/com/example/lf_wannabe/recyclerviewwithheader/MainActivity.kt @@ -1,10 +1,8 @@ package com.example.lf_wannabe.recyclerviewwithheader -import android.content.Intent import android.os.Bundle import android.support.v7.app.AppCompatActivity import android.support.v7.widget.LinearLayoutManager -import android.util.Log import android.view.View import android.widget.Toast import com.tutorial.mim.recyclerview_header.adapter.ListAdapterWithHeader From bb9f8df2547798faf4582b6a642b180784c70f04 Mon Sep 17 00:00:00 2001 From: lf_wannabe Date: Thu, 31 Aug 2017 18:35:59 +0900 Subject: [PATCH 5/6] add README.md --- RecyclerViewWithHeader/README.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/RecyclerViewWithHeader/README.md b/RecyclerViewWithHeader/README.md index a644534..f71bf2e 100644 --- a/RecyclerViewWithHeader/README.md +++ b/RecyclerViewWithHeader/README.md @@ -1 +1,24 @@ # RecyclerView with header +### abstract class for ++ recyclerview with header ++ handling click event on each item using itemClickListener interface ++ manage a list using Realm + +## Android Developer Version Info ++ Build Tool Version = 25.0.3 ++ Compile SDK Version = 25 ++ Target SDK Version = 25 ++ Android Studio 3.0 Beta 2 + +## User Library Version ++ Kotlin 1.1.4-2 ++ Realm 0.88.2 ++ support library Version = 25.3.1 + +## Dependencies +empty + +## Guide +#### Step1. Create Item class extends RealmObject +#### Step2. Create Item layout and ItemHolder which extends BaseViewHolder +#### Step3. Create Adapter which extends ListAdapterWithHeader From 35a166e54878dd818faa5b0d63b9d6e509e62e8a Mon Sep 17 00:00:00 2001 From: lf_wannabe Date: Sun, 3 Sep 2017 00:03:52 +0900 Subject: [PATCH 6/6] add Generic --- .../adapter/ListAdapterWithHeader.kt | 13 +++--- .../mim/recyclerview_header/ex/ExAdapter.kt | 46 +++++++++++++++---- .../model/BaseViewHolder.kt | 3 +- .../recyclerview_header/model/ItemHolder.kt | 3 -- .../recyclerviewwithheader/BaseApplication.kt | 2 +- .../recyclerviewwithheader/MainActivity.kt | 5 +- RecyclerViewWithHeader/build.gradle | 2 +- 7 files changed, 49 insertions(+), 25 deletions(-) diff --git a/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/adapter/ListAdapterWithHeader.kt b/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/adapter/ListAdapterWithHeader.kt index 09da192..44c3665 100644 --- a/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/adapter/ListAdapterWithHeader.kt +++ b/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/adapter/ListAdapterWithHeader.kt @@ -4,6 +4,7 @@ import android.support.v4.app.FragmentActivity import android.support.v7.widget.RecyclerView import com.tutorial.mim.recyclerview_header.model.Item import android.view.View +import io.realm.RealmObject import io.realm.RealmResults @@ -11,14 +12,14 @@ import io.realm.RealmResults * Created by lf_wannabe on 26/08/2017. */ -abstract class ListAdapterWithHeader(val activity: FragmentActivity, - protected val hasHeader: Boolean) - : RecyclerView.Adapter() { +abstract class ListAdapterWithHeader( + val activity: FragmentActivity, protected val hasHeader: Boolean) + : RecyclerView.Adapter() { protected val HEADER_TYPE: Int = 0 protected val ITEM_TYPE: Int = 1 - private lateinit var list: RealmResults<*> + private lateinit var list: RealmResults companion object { lateinit var mOnItemClickListener: OnItemClickListener @@ -40,9 +41,9 @@ abstract class ListAdapterWithHeader(val activity: FragmentActivity, return list.size + if (hasHeader) 1 else 0 } - protected fun getItem(position: Int): Any? = list[position - if (hasHeader) 1 else 0] + protected fun getItem(position: Int): T = list[position - if (hasHeader) 1 else 0] - fun setData(list: RealmResults<*>) { + fun setData(list: RealmResults) { this.list = list notifyDataSetChanged() } diff --git a/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/ex/ExAdapter.kt b/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/ex/ExAdapter.kt index c2aafc2..8b8e715 100644 --- a/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/ex/ExAdapter.kt +++ b/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/ex/ExAdapter.kt @@ -15,24 +15,24 @@ import io.realm.RealmResults * Created by lf_wannabe on 27/08/2017. */ class ExAdapter(ac: FragmentActivity, hasHeader: Boolean, item: Item) - : ListAdapterWithHeader(ac, hasHeader) { + : ListAdapterWithHeader(ac, hasHeader) { var mItem: Item = item - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder = - when (viewType) { - HEADER_TYPE -> ItemHolder(LayoutInflater.from(parent.context) + override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): ItemHolder = + when (viewType) { + HEADER_TYPE -> ItemHolder(LayoutInflater.from(parent!!.context) .inflate(R.layout.list_header, parent, false)) - else -> ItemHolder(LayoutInflater.from(parent.context) + else -> ItemHolder(LayoutInflater.from(parent!!.context) .inflate(R.layout.list_content, parent, false)) } - override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + override fun onBindViewHolder(holder: ItemHolder?, position: Int) { when (getItemViewType(position)) { HEADER_TYPE -> - (holder as ItemHolder).onBindHeader(mItem) + holder!!.onBindHeader(mItem) ITEM_TYPE -> { - with(holder as ItemHolder){ - onBind(getItem(position) as Item) + with(holder!!){ + onBind(getItem(position)) // setOnClickListener를 부모에게 숨기고 싶다 holder.itemView.setOnClickListener { @@ -45,4 +45,32 @@ class ExAdapter(ac: FragmentActivity, hasHeader: Boolean, item: Item) } } } + +// override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder = +// when (viewType) { +// HEADER_TYPE -> ItemHolder(LayoutInflater.from(parent.context) +// .inflate(R.layout.list_header, parent, false)) +// else -> ItemHolder(LayoutInflater.from(parent.context) +// .inflate(R.layout.list_content, parent, false)) +// } +// +// override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { +// when (getItemViewType(position)) { +// HEADER_TYPE -> +// (holder as ItemHolder).onBindHeader(mItem) +// ITEM_TYPE -> { +// with(holder as ItemHolder){ +// onBind(getItem(position) as Item) +// +// // setOnClickListener를 부모에게 숨기고 싶다 +// holder.itemView.setOnClickListener { +// view -> +// if (mOnItemClickListener != null) { +// mOnItemClickListener.onItemClick(view, layoutPosition) +// } +// } +// } +// } +// } +// } } \ No newline at end of file diff --git a/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/model/BaseViewHolder.kt b/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/model/BaseViewHolder.kt index 90d1ad4..c83e339 100644 --- a/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/model/BaseViewHolder.kt +++ b/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/model/BaseViewHolder.kt @@ -3,11 +3,12 @@ package com.tutorial.mim.recyclerview_header.model import android.content.Context import android.support.v7.widget.RecyclerView import android.view.View +import io.realm.RealmObject /** * Created by lf_wannabe on 27/08/2017. */ -abstract class BaseViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView){ +abstract class BaseViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView){ abstract fun onBind(item: T?) diff --git a/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/model/ItemHolder.kt b/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/model/ItemHolder.kt index 56d49bc..e671e5e 100644 --- a/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/model/ItemHolder.kt +++ b/RecyclerViewWithHeader/app/src/main/Kotlin/com/tutorial/mim/recyclerview_header/model/ItemHolder.kt @@ -18,7 +18,4 @@ class ItemHolder(itemView: View) : BaseViewHolder(itemView) { override fun onBindHeader(header: Item?) { itemView.header.text = header?.title } - - - } \ No newline at end of file diff --git a/RecyclerViewWithHeader/app/src/main/java/com/example/lf_wannabe/recyclerviewwithheader/BaseApplication.kt b/RecyclerViewWithHeader/app/src/main/java/com/example/lf_wannabe/recyclerviewwithheader/BaseApplication.kt index 64aaeeb..f50652e 100644 --- a/RecyclerViewWithHeader/app/src/main/java/com/example/lf_wannabe/recyclerviewwithheader/BaseApplication.kt +++ b/RecyclerViewWithHeader/app/src/main/java/com/example/lf_wannabe/recyclerviewwithheader/BaseApplication.kt @@ -16,7 +16,7 @@ class BaseApplication: Application() { // } override fun onCreate() { super.onCreate() - + Realm.init(this) // realmConfig = RealmConfiguration.Builder(this).build() // realm = Realm.getInstance(realmConfig) diff --git a/RecyclerViewWithHeader/app/src/main/java/com/example/lf_wannabe/recyclerviewwithheader/MainActivity.kt b/RecyclerViewWithHeader/app/src/main/java/com/example/lf_wannabe/recyclerviewwithheader/MainActivity.kt index c43260a..d3e76d4 100644 --- a/RecyclerViewWithHeader/app/src/main/java/com/example/lf_wannabe/recyclerviewwithheader/MainActivity.kt +++ b/RecyclerViewWithHeader/app/src/main/java/com/example/lf_wannabe/recyclerviewwithheader/MainActivity.kt @@ -9,7 +9,6 @@ import com.tutorial.mim.recyclerview_header.adapter.ListAdapterWithHeader import com.tutorial.mim.recyclerview_header.ex.ExAdapter import com.tutorial.mim.recyclerview_header.model.Item import io.realm.Realm -import io.realm.RealmConfiguration import kotlinx.android.synthetic.main.activity_main.* import kotlin.properties.Delegates @@ -19,7 +18,6 @@ class MainActivity : AppCompatActivity() { // by Delegates.notNull() => 멤버변수가 클래스 생성될때 초기화 되지않지만 변수 접근 전에 반드시 초기화되어야 한다! private var realm: Realm by Delegates.notNull() - private var realmConfig: RealmConfiguration by Delegates.notNull() var vAdapter: ExAdapter by Delegates.notNull() @@ -27,8 +25,7 @@ class MainActivity : AppCompatActivity() { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) - realmConfig = RealmConfiguration.Builder(this).build() - realm = Realm.getInstance(realmConfig) + realm = Realm.getDefaultInstance() i = realm.where(Item::class.java).findAll().size + 1 diff --git a/RecyclerViewWithHeader/build.gradle b/RecyclerViewWithHeader/build.gradle index 2a641dc..63b0edc 100644 --- a/RecyclerViewWithHeader/build.gradle +++ b/RecyclerViewWithHeader/build.gradle @@ -8,7 +8,7 @@ buildscript { dependencies { classpath 'com.android.tools.build:gradle:3.0.0-beta2' classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.1.4-2' // 코틀린 플러그인 적용 - classpath "io.realm:realm-gradle-plugin:0.88.2" // Realm for Kotlin플러그인 적용 + classpath "io.realm:realm-gradle-plugin:3.5.0" // Realm for Kotlin플러그인 적용 // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files }