RecyclerView 구현

 왜 RecyclerView가 필요합니까?



ListView를 설정한 View에 CoordinatorLayout을 적용할 필요가 있었기 때문에,
ListView를 RecyclerView로 마이그레이션했습니다.
CoordinatorLayout과의 협력은 또 다른 기회에.

헤더, 바닥글, 섹션 버전을 추가했습니다.
RecyclerView 헤더, 바닥글, 섹션

RecyclerView와 CoordinatorLayout과의 연계, 추가했습니다.
RecyclerView 및 CoordinatorLayout

구현



gradle



build.gradle(app)
dependencies {
    - 省略 -
    compile 'com.android.support:recyclerview-v7:26.0.1'
}

 Activity



간단한 Acitivity

activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/mainRecycler"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scrollbars="vertical"/>

</FrameLayout>

이번에는 11 개의 테스트 데이터를 작성하고 배치

MainActivity.kt
class MainActivity : AppCompatActivity() {
  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    val states = arrayListOf<RecyclerState>()
    for(i in 0..10){
      val state = RecyclerState()
      state.text = "$i 件目"
      states.add(state)
    }
    val adapter = RecyclerAdapter(this, states)

    val recycler = findViewById<RecyclerView>(R.id.mainRecycler)
    recycler.layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)
    recycler.adapter = adapter
  }
}

어댑터



RecyclerView 어댑터

RecyclerAdapter.kt
class RecyclerAdapter(
  private val context: Context,
  private val states: List<RecyclerState>) :
  RecyclerView.Adapter<RecyclerView.ViewHolder>() {

  override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
    val view = RecyclerItemView(context)
    return RecyclerItemViewHolder(view)
  }

  override fun onBindViewHolder(viewHolder: RecyclerView.ViewHolder, position: Int) {
    if(viewHolder is RecyclerItemViewHolder){
      viewHolder.update(states[position])
    }
  }

  override fun getItemCount(): Int {
    return states.count()
  }
}

ViewHolder



레이아웃을 조작하는 클래스

RecyclerItemViewHolder.kt
class RecyclerItemViewHolder(private val view: RecyclerItemView) : RecyclerView.ViewHolder(view) {
  fun update(state: RecyclerState){
    view.update(state)
  }
}

Custom View



셀 하나 하나의 레이아웃입니다.
없어도 ViewHolder에서 xml을 직접 설정하여 조작하는 것도 가능하지만, 만드는 편이 편리

recycler_item_view.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="50dp">

    <TextView
        android:id="@+id/recyclerItemText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:textSize="20sp"
        android:scrollbars="vertical"/>

    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:layout_gravity="bottom"
        android:background="@android:color/darker_gray"/>

</FrameLayout>

RecyclerItemView.kt
class RecyclerItemView constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : FrameLayout(context, attrs, defStyleAttr){
  private val textView: TextView

  init {
    val rootView = LayoutInflater.from(context).inflate(R.layout.recycler_item_view, this)
    textView = rootView.findViewById(R.id.recyclerItemText)
    setOnClickListener {
      // クリック処理
    }
  }

  fun update(state: RecyclerState){
    textView.text = state.text
  }
}

완성





주의점



RecyclerAdapter.kt
    recycler.layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)

이것이 없으면 아무것도 표시되지 않고 작은 공황이됩니다.

대신 xml에 layoutManager를 추가하여 대응하는 것도 가능

activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/mainRecycler"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scrollbars="vertical"
        app:layoutManager="android.support.v7.widget.LinearLayoutManager"/>

</FrameLayout>


요약



ListView는 간단하고 좋았습니다.
특히 header, footer, 섹션을 자동으로 해주지 않는 점은 불편하고,
RecyclerView는 자체 구현해야합니다.

좋은 웹페이지 즐겨찾기