質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

2回答

2790閲覧

RecyclerView でカスタマイズしたリストを表示したい

Aki_1988

総合スコア44

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2018/12/22 10:16

編集2018/12/22 16:33

前提・実現したいこと

RecycerView にタイトル + サブタイトルのように複数要素を表示させたいのですが、やり方がわからなかった。
たとえば、以下のような二行あるリストをイメージしてます。

--- タイトル 説明を書きます。 --- タイトル 説明を書きます。 ---

※実際は、4つほどの要素をリストに入れたいと考えています。

発生している問題・エラーメッセージ

現在、一つの要素を表示する、はできています。以下が自分で忘備録として書いたものです。動作確認済みです。
https://qiita.com/aki_design_1988/items/42efa57aa4d83d3aa850

以下の記事は画像+テキスト二つで構成されていました。参考に読んだのですが、具体的なイメージがあまりできませんでした。
https://qiita.com/saiki-ii/items/78ed73134784f3e5db7e

該当のソースコード

RecyclerViewActivity.kt

kotlin

1import androidx.appcompat.app.AppCompatActivity 2import android.os.Bundle 3import androidx.recyclerview.widget.LinearLayoutManager 4import kotlinx.android.synthetic.main.activity_recycle_view.* 5 6class RecycleViewActivity : AppCompatActivity() { 7 8 override fun onCreate(savedInstanceState: Bundle?) { 9 super.onCreate(savedInstanceState) 10 setContentView(R.layout.activity_recycle_view) 11 12 var itemList = arrayListOf<String>("item","item","item","item","item","item","item","item","item","item","item","item","item","item","item","item","item","item","item","item","item") 13 item_list.layoutManager = LinearLayoutManager(this) 14 item_list.adapter = itemListAdapter(itemList) 15 } 16}

itemListAdapter.kt

kotlin

1import android.view.ViewGroup 2import android.view.LayoutInflater 3import android.widget.TextView 4import androidx.recyclerview.widget.RecyclerView 5 6class itemListAdapter(private val myDataset: ArrayList<String>) : 7 RecyclerView.Adapter<itemListAdapter.ViewHolder>() { 8 9 class ViewHolder(val textView: TextView) : RecyclerView.ViewHolder(textView) 10 11 override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): itemListAdapter.ViewHolder { 12 val textView = LayoutInflater.from(parent.context) 13 .inflate(R.layout.listlayout, parent, false) as TextView 14 return ViewHolder(textView) 15 } 16 17 override fun onBindViewHolder(holder: ViewHolder, position: Int) { 18 holder.textView.text = myDataset[position] 19 } 20 21 override fun getItemCount() = myDataset.size 22}

リスト表示する xml は作成できています。

あとは、

  • 複数要素をもった配列を用意する
  • Adapter で、データとUIをひもづける

が必要な認識なのですが、具体的なやり方がわからず、という状況です。

補足情報

初心者のため、解決するに当たって必要な情報も理解しておりません。
回答に必要な情報がある場合、教えていただけますと幸いです。
どうぞよろしくお願いします..!

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

1.まず、一行ごとに表示したい情報(例えばtitleとdetail)を保持できるクラス(ここではPairを使ってますが自作してもらっても構いません。)のリストを用意します。

kotlin

1 var itemList = arrayListOf<Pair<String,String>>(Pair("item","detail"),Pair("item","detail"),Pair("item","detail"),Pair("item","detail")) 2

2.二つの情報を表示するのにTextViewが二つあったほうが嬉しいので、listlayout.xmlをTextView単体ではなく、LinearLayoutなどのViewGroupにし、二つのTextViewを内部に保持します。
その際、二つのTextViewを識別できるようにidを設定しておきます。

xml

1<!--listlayout.xml--> 2<?xml version="1.0" encoding="utf-8"?> 3<LinearLayout 4 xmlns:android="http://schemas.android.com/apk/res/android" 5 android:layout_width="match_parent" 6 android:layout_height="match_parent" 7 android:orientation="vertical"> 8 9 <TextView 10 <!--idを設定して識別--> 11 android:id="@+id/title" 12 android:layout_width="match_parent" 13 android:layout_height="wrap_content" 14 android:textSize="20sp" 15 android:padding="20dp" 16 android:text="item"/> 17 <TextView 18 <!--idを設定して識別--> 19 android:id="@+id/detail" 20 android:layout_width="match_parent" 21 android:layout_height="wrap_content" 22 android:textSize="20sp" 23 android:padding="20dp" 24 android:text="detail"/> 25 26</LinearLayout> 27

3.myDatasetの型を変更し、viewHolderもLinearLayoutと、その中のTextViewを保持できるように変更します。

kotlin

1class itemListAdapter(private val myDataset: ArrayList<Pair<String,String>/*String*/>) : 2 RecyclerView.Adapter<itemListAdapter.ViewHolder>() { 3 4 class ViewHolder(val linearLayout:LinearLayout/*val textView: TextView*/) : RecyclerView.ViewHolder(linearLayout/*textView*/){ 5 //findViewで二つのTextViewをプロパティとして保持 6 val titleTextView = linearLayout.findViewById<TextView>(R.id.title) 7 val detailTextView = linearLayout.findViewById<TextView>(R.id.detail) 8 } 9 10 override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): itemListAdapter.ViewHolder { 11 val linearLayout/*textView*/ = LayoutInflater.from(parent.context) 12 .inflate(R.layout.listlayout, parent, false) as LinearLayout/*TextView*/ 13 return ViewHolder(linearLayout) 14 } 15 16 override fun onBindViewHolder(holder: ViewHolder, position: Int) { 17 //holder.textView.text = myDataset[position] 18 //二つのTextViewのテキストを変更 19 holder.titleTextView.text = myDataset[position].first 20 holder.detailTextView.text = myDataset[position].second 21 } 22 23 override fun getItemCount() = myDataset.size 24}

これで今度こそ、、、

投稿2018/12/22 17:51

shal0ne

総合スコア51

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Aki_1988

2018/12/23 02:30

なるほど!理解できました! 丁寧にご説明いただきありがとうございました!
shal0ne

2018/12/23 07:19

解決できてよかったです、
guest

0

  • 複数要素をもった配列を用意する

というのは

kotlin

1 var itemList = arrayListOf<String>("item","item","item","item","item","item","item","item","item","item","item","item","item","item","item","item","item","item","item","item","item")

のところで用意できていますので、おそらく

  • Adapter で、データとUIをひもづける

が終わっていない状況だと思います。

で、このコードですがAndroidStudioに貼り付けるとitem_listの部分が赤くなり、コードが動かないと思うのですが、、、

おそらくこのコードの元データにはその上部に

kotlin

1val item_list = findViewById<RecyclerView>(R.id.recyclerViewId)

というのがあって、逆にこれがないとコードが動きません。

非常に紛らわしいので、上記コードを補完した上でitem_listの部分をrecyclerViewに置き換えて軽く説明すると、

Kotlin

1 var itemList = arrayListOf<String>("item","item","item","item","item","item","item","item","item","item","item","item","item","item","item","item","item","item","item","item","item") 2 //ここに上記のRecyclerViewのインスタンスを用意 3 val recyclerView = findViewById<RecyclerView>(R.id.recyclerViewId) 4 //RecyclerViewの中に、RecyclerViewを制御する人を配置 5 recyclerView.layoutManager = LinearLayoutManager(this) 6 //RecyclerViewの中に、itemListをRecyclerViewに供給する人(itemListAdapter)を配置 7 recyclerView.adapter = itemListAdapter(itemList)

これでおそらく動くと思われます。(ダメだったら言ってください)

おそらく私と同じAndroid初心者だと思うのですが、初学の場合はこういったサイトは避けたほうがいいです。
ある程度相手が習熟していることを想定して書かれていますので、今回のように(recyclerViewのインスタンスが必要だけど、そんなことは書かなくてもわかるよね)みたいなのがザラにあります。
私も書籍代数千円をケチって完全独学でネットで学習しましたが、膨大な時間を無駄にしました。
あとでどうしても解決できない問題が出てきて結局買いましたし、これなら数時間働く時間を増やして最初から買っておけばよかったと思っています。

ステマじゃないですが、下の参考書はある程度の知識を網羅していますので、おすすめです。
「基礎&応用力をしっかり育成! Androidアプリ開発の教科書 なんちゃって開発者にならないための実践ハンズオン」

あと、どうしてもお金をかけたくない場合は主張に反しますが、下記のサイトがおすすめです。
「nyan のアプリ開発」

投稿2018/12/22 14:40

shal0ne

総合スコア51

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Aki_1988

2018/12/22 16:36

おぉ、すみません。。ひとつめの Qiita は自分でメモとして書いたものなんです。。 たぶん、id 指定が誤っているのかなと。Qiita に転機するときに、id を汎用的なものに変えたのですが、ミスしたみたいです。 そして、複数要素は複数のリストがある、ではなく、ひとつのリストに複数要素がある、でした。 わかりづらい文章でしたので、本文を書き直しました! 書籍は確かにですね。おすすめの書籍チェックしてみますね。
Aki_1988

2018/12/22 16:41

ご指摘いただいた `val recyclerView = findViewById<RecyclerView>(R.id.recyclerViewId)` ですが、この部分は、ひとつめの Qiita のように、`xmlで指定したid.layoutManager = LinearLayoutManager(this)` でも指定することが、可能かと思われます。ぼくの環境では、動作しておりますので。念の為、補足になります。 (丁寧に回答くださって、ありがとうございます!)
shal0ne

2018/12/22 17:53

すみません、見落としてましたしめっちゃ勘違いしてました。 一応別に回答アップしたので、それを元に解決できたらと思います。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問