RecyclerView를 쉽게 수행할 수 있는 Epoxy 라이브러리 사용 시도
18647 단어 RecyclerViewAndroidKotlinairbnb
개요
Epoxy는 Airbnb에서 생산하는 라이브러리입니다.특히, 여러 ViewType 유형의 RecyclerView를 쉽게 구현할 수 있습니다.
배치
build.gradle에 다음 내용을 추가합니다.apply plugin: 'kotlin-kapt'
dependencies {
// epoxy
compile 'com.airbnb.android:epoxy:2.7.3'
kapt 'com.airbnb.android:epoxy-processor:2.7.3'
compile 'com.airbnb.android:epoxy-databinding:2.7.3'
}
kapt {
correctErrorTypes = true
}
레이아웃 디자인
RecyclerView를 사용하여 헤더 2종, 콘텐츠 2종 등 총 4가지 레이아웃을 포함하는 다음과 같은 화면을 만듭니다.
Epoxy를 사용하지 않는 경우 RecyclerView와 연결된 Adapter에서 4가지 ViewType에 따라 분리된 설치가 필요하다고 판단됩니다.
주 레이아웃
<layout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent" >
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view"
app:layoutManager="android.support.v7.widget.LinearLayoutManager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
</layout>
header1 레이아웃
<layout xmlns:android="http://schemas.android.com/apk/res/android" >
<data>
<variable name="title" type="String" />
</data>
<LinearLayout
android:background="#ff0000"
android:gravity="left|center_vertical"
android:layout_width="match_parent"
android:layout_height="100dp">
<TextView
android:text="@{title}"
android:textStyle="bold"
android:layout_marginLeft="20dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</layout>
header2 레이아웃
<layout xmlns:android="http://schemas.android.com/apk/res/android" >
<data>
<variable name="title" type="String" />
</data>
<LinearLayout
android:background="#00ff00"
android:gravity="right|center_vertical"
android:layout_width="match_parent"
android:layout_height="80dp">
<TextView
android:text="@{title}"
android:textStyle="italic"
android:layout_marginRight="20dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</layout>
contents1 레이아웃
<layout xmlns:android="http://schemas.android.com/apk/res/android" >
<data>
<variable name="text" type="String" />
</data>
<LinearLayout
android:gravity="center"
android:background="#eeeeee"
android:layout_width="match_parent"
android:layout_height="50dp">
<TextView
android:text="@{text}"
android:textSize="35sp"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</layout>
contents2 레이아웃
<layout xmlns:android="http://schemas.android.com/apk/res/android" >
<data>
<variable name="text" type="String" />
</data>
<LinearLayout
android:gravity="center"
android:background="#888888"
android:layout_width="match_parent"
android:layout_height="50dp">
<TextView
android:text="@{text}"
android:textSize="18sp"
android:fontFamily="serif-monospace"
android:textColor="#ffffff"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</layout>
package-info.java
레이아웃 파일에서 Epoxy로 BindingModel_클래스를 자동으로 생성하기 위해, 패키지-info.자바를 만듭니다. 아래와 같습니다.@EpoxyDataBindingLayouts({
R.layout.header1,
R.layout.header2,
R.layout.contents1,
R.layout.contents2
})
package example.test.epoxytest;
import com.airbnb.epoxy.EpoxyDataBindingLayouts;
만든 패키지-info.java는 다음과 같이 설정됩니다.
지금까지 Header1BindingModel_을 구축하여Contents1BindingModel_, Header2BindingModel_, Contents2BindingModel_Epoxy에서 자동으로 생성됩니다.
데이터 클래스 생성
내용 데이터를 저장하는 클래스를 만듭니다.class Data(val header1: String, val contents1: List<String>, val header2: String, val contents2: List<String>)
컨트롤러 생성
Adapter 대신 컨트롤러를 생성합니다.class TestController : TypedEpoxyController<Data>() {
override fun buildModels(data: Data) {
Header1BindingModel_()
.title(data.header1)
.id(modelCountBuiltSoFar)
.addTo(this)
for (item in data.contents1) {
Contents1BindingModel_()
.text(item)
.id(modelCountBuiltSoFar)
.addTo(this)
}
Header2BindingModel_()
.title(data.header2)
.id(modelCountBuiltSoFar)
.addTo(this)
for (item in data.contents2) {
Contents2BindingModel_()
.text(item)
.id(modelCountBuiltSoFar)
.addTo(this)
}
}
}
Adapter를 설치하는 것보다 간결합니다.
MainActivity class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)
val controller = TestController()
controller.setData(Data("header1", listOf("aa", "ab", "ac"),
"header2", listOf("ba", "bb", "bc", "bd", "be", "bf")))
binding.recyclerView.adapter = controller.adapter
binding.recyclerView.addItemDecoration(DividerItemDecoration(this, DividerItemDecoration.VERTICAL))
}
}
데이터를 컨트롤러로 설정하고 컨트롤러 내부에서 생성된 adapter를 RecyclerView와 연결합니다.
총결산
Epoxy를 사용하면 보일러판 코드가 줄어들어 여러 개의viewType를 가진RecyclerView를 비교적 적은 기술로 설치할 수 있습니다
Reference
이 문제에 관하여(RecyclerView를 쉽게 수행할 수 있는 Epoxy 라이브러리 사용 시도), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/tomo1139/items/2e3eb25cb81aa741f491
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
build.gradle에 다음 내용을 추가합니다.
apply plugin: 'kotlin-kapt'
dependencies {
// epoxy
compile 'com.airbnb.android:epoxy:2.7.3'
kapt 'com.airbnb.android:epoxy-processor:2.7.3'
compile 'com.airbnb.android:epoxy-databinding:2.7.3'
}
kapt {
correctErrorTypes = true
}
레이아웃 디자인
RecyclerView를 사용하여 헤더 2종, 콘텐츠 2종 등 총 4가지 레이아웃을 포함하는 다음과 같은 화면을 만듭니다.
Epoxy를 사용하지 않는 경우 RecyclerView와 연결된 Adapter에서 4가지 ViewType에 따라 분리된 설치가 필요하다고 판단됩니다.
주 레이아웃
<layout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent" >
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view"
app:layoutManager="android.support.v7.widget.LinearLayoutManager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
</layout>
header1 레이아웃
<layout xmlns:android="http://schemas.android.com/apk/res/android" >
<data>
<variable name="title" type="String" />
</data>
<LinearLayout
android:background="#ff0000"
android:gravity="left|center_vertical"
android:layout_width="match_parent"
android:layout_height="100dp">
<TextView
android:text="@{title}"
android:textStyle="bold"
android:layout_marginLeft="20dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</layout>
header2 레이아웃
<layout xmlns:android="http://schemas.android.com/apk/res/android" >
<data>
<variable name="title" type="String" />
</data>
<LinearLayout
android:background="#00ff00"
android:gravity="right|center_vertical"
android:layout_width="match_parent"
android:layout_height="80dp">
<TextView
android:text="@{title}"
android:textStyle="italic"
android:layout_marginRight="20dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</layout>
contents1 레이아웃
<layout xmlns:android="http://schemas.android.com/apk/res/android" >
<data>
<variable name="text" type="String" />
</data>
<LinearLayout
android:gravity="center"
android:background="#eeeeee"
android:layout_width="match_parent"
android:layout_height="50dp">
<TextView
android:text="@{text}"
android:textSize="35sp"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</layout>
contents2 레이아웃
<layout xmlns:android="http://schemas.android.com/apk/res/android" >
<data>
<variable name="text" type="String" />
</data>
<LinearLayout
android:gravity="center"
android:background="#888888"
android:layout_width="match_parent"
android:layout_height="50dp">
<TextView
android:text="@{text}"
android:textSize="18sp"
android:fontFamily="serif-monospace"
android:textColor="#ffffff"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</layout>
package-info.java
레이아웃 파일에서 Epoxy로 BindingModel_클래스를 자동으로 생성하기 위해, 패키지-info.자바를 만듭니다. 아래와 같습니다.@EpoxyDataBindingLayouts({
R.layout.header1,
R.layout.header2,
R.layout.contents1,
R.layout.contents2
})
package example.test.epoxytest;
import com.airbnb.epoxy.EpoxyDataBindingLayouts;
만든 패키지-info.java는 다음과 같이 설정됩니다.
지금까지 Header1BindingModel_을 구축하여Contents1BindingModel_, Header2BindingModel_, Contents2BindingModel_Epoxy에서 자동으로 생성됩니다.
데이터 클래스 생성
내용 데이터를 저장하는 클래스를 만듭니다.class Data(val header1: String, val contents1: List<String>, val header2: String, val contents2: List<String>)
컨트롤러 생성
Adapter 대신 컨트롤러를 생성합니다.class TestController : TypedEpoxyController<Data>() {
override fun buildModels(data: Data) {
Header1BindingModel_()
.title(data.header1)
.id(modelCountBuiltSoFar)
.addTo(this)
for (item in data.contents1) {
Contents1BindingModel_()
.text(item)
.id(modelCountBuiltSoFar)
.addTo(this)
}
Header2BindingModel_()
.title(data.header2)
.id(modelCountBuiltSoFar)
.addTo(this)
for (item in data.contents2) {
Contents2BindingModel_()
.text(item)
.id(modelCountBuiltSoFar)
.addTo(this)
}
}
}
Adapter를 설치하는 것보다 간결합니다.
MainActivity class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)
val controller = TestController()
controller.setData(Data("header1", listOf("aa", "ab", "ac"),
"header2", listOf("ba", "bb", "bc", "bd", "be", "bf")))
binding.recyclerView.adapter = controller.adapter
binding.recyclerView.addItemDecoration(DividerItemDecoration(this, DividerItemDecoration.VERTICAL))
}
}
데이터를 컨트롤러로 설정하고 컨트롤러 내부에서 생성된 adapter를 RecyclerView와 연결합니다.
총결산
Epoxy를 사용하면 보일러판 코드가 줄어들어 여러 개의viewType를 가진RecyclerView를 비교적 적은 기술로 설치할 수 있습니다
Reference
이 문제에 관하여(RecyclerView를 쉽게 수행할 수 있는 Epoxy 라이브러리 사용 시도), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/tomo1139/items/2e3eb25cb81aa741f491
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
<layout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent" >
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view"
app:layoutManager="android.support.v7.widget.LinearLayoutManager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
</layout>
<layout xmlns:android="http://schemas.android.com/apk/res/android" >
<data>
<variable name="title" type="String" />
</data>
<LinearLayout
android:background="#ff0000"
android:gravity="left|center_vertical"
android:layout_width="match_parent"
android:layout_height="100dp">
<TextView
android:text="@{title}"
android:textStyle="bold"
android:layout_marginLeft="20dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</layout>
<layout xmlns:android="http://schemas.android.com/apk/res/android" >
<data>
<variable name="title" type="String" />
</data>
<LinearLayout
android:background="#00ff00"
android:gravity="right|center_vertical"
android:layout_width="match_parent"
android:layout_height="80dp">
<TextView
android:text="@{title}"
android:textStyle="italic"
android:layout_marginRight="20dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</layout>
<layout xmlns:android="http://schemas.android.com/apk/res/android" >
<data>
<variable name="text" type="String" />
</data>
<LinearLayout
android:gravity="center"
android:background="#eeeeee"
android:layout_width="match_parent"
android:layout_height="50dp">
<TextView
android:text="@{text}"
android:textSize="35sp"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</layout>
<layout xmlns:android="http://schemas.android.com/apk/res/android" >
<data>
<variable name="text" type="String" />
</data>
<LinearLayout
android:gravity="center"
android:background="#888888"
android:layout_width="match_parent"
android:layout_height="50dp">
<TextView
android:text="@{text}"
android:textSize="18sp"
android:fontFamily="serif-monospace"
android:textColor="#ffffff"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</layout>
레이아웃 파일에서 Epoxy로 BindingModel_클래스를 자동으로 생성하기 위해, 패키지-info.자바를 만듭니다. 아래와 같습니다.
@EpoxyDataBindingLayouts({
R.layout.header1,
R.layout.header2,
R.layout.contents1,
R.layout.contents2
})
package example.test.epoxytest;
import com.airbnb.epoxy.EpoxyDataBindingLayouts;
만든 패키지-info.java는 다음과 같이 설정됩니다.지금까지 Header1BindingModel_을 구축하여Contents1BindingModel_, Header2BindingModel_, Contents2BindingModel_Epoxy에서 자동으로 생성됩니다.
데이터 클래스 생성
내용 데이터를 저장하는 클래스를 만듭니다.class Data(val header1: String, val contents1: List<String>, val header2: String, val contents2: List<String>)
컨트롤러 생성
Adapter 대신 컨트롤러를 생성합니다.class TestController : TypedEpoxyController<Data>() {
override fun buildModels(data: Data) {
Header1BindingModel_()
.title(data.header1)
.id(modelCountBuiltSoFar)
.addTo(this)
for (item in data.contents1) {
Contents1BindingModel_()
.text(item)
.id(modelCountBuiltSoFar)
.addTo(this)
}
Header2BindingModel_()
.title(data.header2)
.id(modelCountBuiltSoFar)
.addTo(this)
for (item in data.contents2) {
Contents2BindingModel_()
.text(item)
.id(modelCountBuiltSoFar)
.addTo(this)
}
}
}
Adapter를 설치하는 것보다 간결합니다.
MainActivity class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)
val controller = TestController()
controller.setData(Data("header1", listOf("aa", "ab", "ac"),
"header2", listOf("ba", "bb", "bc", "bd", "be", "bf")))
binding.recyclerView.adapter = controller.adapter
binding.recyclerView.addItemDecoration(DividerItemDecoration(this, DividerItemDecoration.VERTICAL))
}
}
데이터를 컨트롤러로 설정하고 컨트롤러 내부에서 생성된 adapter를 RecyclerView와 연결합니다.
총결산
Epoxy를 사용하면 보일러판 코드가 줄어들어 여러 개의viewType를 가진RecyclerView를 비교적 적은 기술로 설치할 수 있습니다
Reference
이 문제에 관하여(RecyclerView를 쉽게 수행할 수 있는 Epoxy 라이브러리 사용 시도), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/tomo1139/items/2e3eb25cb81aa741f491
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
class Data(val header1: String, val contents1: List<String>, val header2: String, val contents2: List<String>)
Adapter 대신 컨트롤러를 생성합니다.
class TestController : TypedEpoxyController<Data>() {
override fun buildModels(data: Data) {
Header1BindingModel_()
.title(data.header1)
.id(modelCountBuiltSoFar)
.addTo(this)
for (item in data.contents1) {
Contents1BindingModel_()
.text(item)
.id(modelCountBuiltSoFar)
.addTo(this)
}
Header2BindingModel_()
.title(data.header2)
.id(modelCountBuiltSoFar)
.addTo(this)
for (item in data.contents2) {
Contents2BindingModel_()
.text(item)
.id(modelCountBuiltSoFar)
.addTo(this)
}
}
}
Adapter를 설치하는 것보다 간결합니다.MainActivity class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)
val controller = TestController()
controller.setData(Data("header1", listOf("aa", "ab", "ac"),
"header2", listOf("ba", "bb", "bc", "bd", "be", "bf")))
binding.recyclerView.adapter = controller.adapter
binding.recyclerView.addItemDecoration(DividerItemDecoration(this, DividerItemDecoration.VERTICAL))
}
}
데이터를 컨트롤러로 설정하고 컨트롤러 내부에서 생성된 adapter를 RecyclerView와 연결합니다.
총결산
Epoxy를 사용하면 보일러판 코드가 줄어들어 여러 개의viewType를 가진RecyclerView를 비교적 적은 기술로 설치할 수 있습니다
Reference
이 문제에 관하여(RecyclerView를 쉽게 수행할 수 있는 Epoxy 라이브러리 사용 시도), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/tomo1139/items/2e3eb25cb81aa741f491
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)
val controller = TestController()
controller.setData(Data("header1", listOf("aa", "ab", "ac"),
"header2", listOf("ba", "bb", "bc", "bd", "be", "bf")))
binding.recyclerView.adapter = controller.adapter
binding.recyclerView.addItemDecoration(DividerItemDecoration(this, DividerItemDecoration.VERTICAL))
}
}
Epoxy를 사용하면 보일러판 코드가 줄어들어 여러 개의viewType를 가진RecyclerView를 비교적 적은 기술로 설치할 수 있습니다
Reference
이 문제에 관하여(RecyclerView를 쉽게 수행할 수 있는 Epoxy 라이브러리 사용 시도), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/tomo1139/items/2e3eb25cb81aa741f491텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)