日々是好日

プログラミングについてのあれこれ、ムダ知識など

StickyListHeaders風のライブラリを自作する-1

StickyListHeadersが数年前からメンテ停止しているので、RecyclerView を拡張してそれっぽい View のライブラリを作ってみようという闇の計画。

現時点で、計画が成就するのかマジでわからない。 そして誰得でもある。

github.com

Android ライブラリとは

developer.android.com

Android ライブラリは、構造上は Android アプリモジュールと同じです。

ソースコードファイルもあるし res もあるし、パッと見本当に一緒です。

個人的に、「そもそもモジュールってなんだ全然わからん」状態だったので、そこから調べてみた。 いかに基礎が分かっていないかバレてしまいますねヾ(:3ノシヾ)ノシ

モジュールとは

developer.android.com

モジュールとはソースファイルとビルド設定のコレクションであり、モジュールによって機能ごとにプロジェクトを分割できます。プロジェクトには 1 つまたは多数のモジュールを含めることができ、モジュールは別のモジュールを依存関係として使用できます。各モジュールは個別にビルド、テスト、デバッグを実行できます。

ある機能をどこからでも利用するために分割されたソースコードの塊、といった感じか。app もモジュールなんですよね。

モジュールを作って参照してみる

最初から「よっしゃオリジナルな RecyclerView 作ったるで!!」って意気込んだら速攻で挫折したので、おとなしく RecyclerView をラップしただけのモジュールを作って app モジュールから参照してみました。

モジュールの生成

  1. File → New → New Module... の順にクリック
  2. Android Library を選択して Next をクリック

ライブラリの名称とかの入力が出てくるので、次のとおりに入力。

item 入力値
Apprication/Library Name MyRecyclerView
Module Name myrecyclerview
Package Name work.kcs_labo.myrecyclerview

すると、左側の Project に myrecyclerview というモジュールが生成されると思います。こんな感じ。

f:id:kcpoipoi:20190623001631p:plain

なお、今後のライブラリ公開を考えるならば、入力値はこちらの Qiita を参考にしてください。

qiita.com

MyRecyclerView を作る

myrecyclerviewapp と同じくソースコードファイルを入れるパッケージがあるので、Kotlin ファイル作って次のコードを記述する。

package work.kcs_labo.myrecyclerview

import android.content.Context
import android.util.AttributeSet
import androidx.recyclerview.widget.RecyclerView

class MyRecyclerView: RecyclerView {
  constructor(context: Context): super(context)
  constructor(context: Context, attrs: AttributeSet): super(context, attrs)
  constructor(context: Context, attrs: AttributeSet, defStyle: Int): super(context, attrs, defStyle)
}

RecyclerView を継承した MyRecyclerView を作っただけ。 さっそくこれを app モジュールに依存関係指定して import してみる。

app から参照してみる

build.gradle に次のとおり依存関係を指定。

dependencies {
  implementation project(':myrecyclerview')
}

このへんの Gradle の記述はてくぶさんの記事を参照。

techbooster.org

んで、MainActivity なんかで次のとおり記述すると参照できていることがわかる。

import work.kcs_labo.myrecyclerview.MyRecyclerView

class MainActivity : AppCompatActivity() {

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

    val hoge = MyRecyclerView(this)
  }
}

まとめ

New Module... でモジュール作って Gradle で参照してみましょう!というだけの記事でした(ぇ

RecyclerView の実装はやったことあるけど、ライブラリとして機能を提供するのってどうやるんだ……?????

って小一時間以上悩んでもうつらみしかない。

次は、ごく簡単な機能を提供する記事を書きたい。