Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
229 changes: 229 additions & 0 deletions RecyclerViewWithHeader/.idea/codeStyleSettings.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

23 changes: 23 additions & 0 deletions RecyclerViewWithHeader/README.md
Original file line number Diff line number Diff line change
@@ -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
3 changes: 2 additions & 1 deletion RecyclerViewWithHeader/app/build.gradle
Original file line number Diff line number Diff line change
@@ -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
Expand Down
4 changes: 4 additions & 0 deletions RecyclerViewWithHeader/app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
package="com.example.lf_wannabe.recyclerviewwithheader" >

<application
android:name=".BaseApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
Expand All @@ -15,6 +16,9 @@
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

<activity android:name=".PopupActivity"
android:theme="@style/AppTheme.PopUpDialog" />
</application>

</manifest>
Original file line number Diff line number Diff line change
Expand Up @@ -2,56 +2,49 @@ 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 com.example.lf_wannabe.recyclerviewwithheader.R
import com.tutorial.mim.recyclerview_header.model.ItemHolder
import android.view.View
import io.realm.RealmObject
import io.realm.RealmResults


/**
* Created by lf_wannabe on 26/08/2017.
*/

abstract class ListAdapterWithHeader(val activity: FragmentActivity, protected val hasHeader: Boolean)
: RecyclerView.Adapter<RecyclerView.ViewHolder>(){

private val HEADER_TYPE: Int = 0
private val ITEM_TYPE: Int = 1
abstract class ListAdapterWithHeader<T: RealmObject, VH: RecyclerView.ViewHolder>(
val activity: FragmentActivity, protected val hasHeader: Boolean)
: RecyclerView.Adapter<VH>() {

private var list: ArrayList<Item> = ArrayList()
protected val HEADER_TYPE: Int = 0
protected val ITEM_TYPE: Int = 1

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))
}
private lateinit var list: RealmResults<T>

protected abstract fun createHeaderView(layoutInflater: LayoutInflater, parent: ViewGroup): RecyclerView.ViewHolder

protected abstract fun onBindHeaderView(holder: RecyclerView.ViewHolder, position: Int)
companion object {
lateinit var mOnItemClickListener: OnItemClickListener
}

override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
when (getItemViewType(position)) {
HEADER_TYPE -> onBindHeaderView(holder, position)
ITEM_TYPE -> (holder as ItemHolder).onBind(getItem(position))
}
interface OnItemClickListener {
fun onItemClick(v: View, position: Int) {}
}

fun setData(list: ArrayList<Item>){
// null 체크 필요없나 ?
this.list = list
fun setOnItemClickListener(onItemClickListener: OnItemClickListener) {
mOnItemClickListener = onItemClickListener
}

override fun getItemViewType(position: Int): Int {
return if (hasHeader && position == 0) HEADER_TYPE else ITEM_TYPE
}

override fun getItemCount(): Int {
return if (list != null) (list as ArrayList).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?.get(position - 1)
protected fun getItem(position: Int): T = list[position - if (hasHeader) 1 else 0]

fun setData(list: RealmResults<T>) {
this.list = list
notifyDataSetChanged()
}
}
Loading