アプリ開発#0 「お買い物リスト」

アプリ開発

android app.です。
こちらはkotlinで開発しました。

アプリ紹介

該当アプリはこちらになります。
Google Play で手に入れよう

紹介動画です。

苦労した点

連想配列

アプリの中で連想配列を使い、商品を売り場ごとに仕分けることを考えました。スマートにcsvで予め配列を作り、android SDK側から読み込ませようとしましたが、どうにもうまくいかない。そこで泥臭く配列を以下のように自作しました。これでやりたいことはできているので結果オーライです。かなり地味です。

var shelters_1_map : MutableMap<String?,String?>
       = mutableMapOf(
        "あさつき" to "野菜" ,
        "あしたば" to "野菜" ,
        "あまなつ" to "野菜" ,
        "アスパラガス" to "野菜" ,
        "アロエ" to "野菜" ,
        "アボカド" to "野菜" ,
        "イタリアンパセリ" to "野菜" )

配列をintentに載せる

ぱっと調べたところ配列をintentに載せる方法がなく、拙い知識で色々考えました。結果、ある文字で区切れば、「split」で分裂できることが分かり、配列を一つのデータとして保存することにしました。配列をまずは「join」で結合し、intent、受け取った際は「split」で分割して配列に。

//配列の結合
val join_name=name_of_shelters_3.joinToString(",")
val join_type=type_of_shelters_3.joinToString(",")
intent.putExtra("shelters_fin_name",join_name)
intent.putExtra("shelters_fin_type",join_type)
startActivity(intent)

//配列の分割
val text_no1=intent.getStringExtra("text_no1")
val text_no2 = text_no1.split(".", ",","、","\n")

リストビューにチェックボックス

こちらが一番やっかいでした。simple adapterにtext viewとcheck boxを入れて、リストビューを作成したところ、スクロールした際にチェックが変な位置にいってしまいました。ちょっと動画に保存できていないですが、経験した人には分かる現象になります。回避の方法もそれなりにweb上にありますが、初心者には解読が難しかったです。それでもどうにかやりとげました。

    private class MyAdapter(
        context: Context?,
        data: List<MutableMap<String?, *>?>,
        resource: Int,
        from: Array<String>,
        to: IntArray?
    ) :
        SimpleAdapter(context, data, resource, from, to) {

        // 外部から呼び出し可能なマップ
        var checkList: MutableMap<Int, Boolean?> = HashMap()
        override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {

            val view: View = super.getView(position, convertView, parent)
            val l=view as LinearLayout
            val ch: CheckBox = l.findViewById(R.id.name_check)
            // チェックの状態が変化した場合はマップに記憶する
            ch.setOnCheckedChangeListener { buttonView, isChecked ->
                checkList[position] = ch.isChecked
            }

            if (checkList[position]==true) {
                ch.isChecked=true
            }else
            {
                ch.isChecked=false
            }

            return view
        }

    }

まとめ

これでどうにかやりたいことはできました。こんなアプリでも結構作成が大変。使ってみると、色々気づくことがあった。初めてのアプリリリース作品。