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

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

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

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

Android Studio

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

Kotlin

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

Q&A

1回答

723閲覧

【kotlin】Fragmentを継承したクラスでRecyclerViewにセットするAdapterを作りたい

takk_014

総合スコア53

Android

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

Android Studio

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

Kotlin

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

0グッド

0クリップ

投稿2023/03/23 01:04

編集2023/03/23 01:16

実現したいこと

Fragmentを継承したクラスでRecyclerViewにセットするAdapterを作りたい

前提

Bluetoothデバイスをスキャンした際に取得したデバイス名を画面のリストに表示するアプリを作っています。
スキャンしてデバイス情報を取得時にFragmentを継承したクラスでデリゲート関数が発動してその中でRecyclerViewの要素を更新する処理をしようとしています。
その際にArrayAdapterでアダプターを作ろうとしたらエラーが発生しました。

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

None of the following functions can be called with the arguments supplied. <init>(Context, Int, Array<(out) TypeVariable(T)!>)   where T = TypeVariable(T) for   constructor ArrayAdapter<T : Any!>(context: Context, resource: Int, objects: Array<(out) T!>) defined in android.widget.ArrayAdapter <init>(Context, Int, Int)   where T = TypeVariable(T) for   constructor ArrayAdapter<T : Any!>(context: Context, resource: Int, textViewResourceId: Int) defined in android.widget.ArrayAdapter <init>(Context, Int, (Mutable)List<TypeVariable(T)!>)   where T = TypeVariable(T) for   constructor ArrayAdapter<T : Any!>(context: Context, resource: Int, objects: (Mutable)List<T!>) defined in android.widget.ArrayAdapter

該当のソースコード

kotlin

1// BLEデバイスが新たに発見された時に呼ばれるデリゲート関数 2 override fun didDiscoverDevice( deviceName: String ) { 3 // ここでリサイクルビューの要素を更新したい 4 val bleListStr = bleManager.deviceArray.toString() 5 val bleStrArray = bleListStr.split(",") 6 // ArrayAdapterに赤波下線が表示されてエラーとなっている 7 val arrayAdapter = ArrayAdapter(activity, binding?.rvMainMenu, bleStrArray) } 8 binding?.rvMainMenu?.adapter = arrayAdapter 9 }

試したこと

ArrayAdapterに用いている引数に問題があると思い、第一引数はFragmentでContextを取得するために「getActivity」にしたところ自動変換で「avtivity」になりました。
第二引数は通常ならば「R.id.〜〜〜」と取得しますがFragmentではそれではUIパーツが取得できないため「binding」を用いてレイアウトファイルにあるリサイクルビューのIDを指定して取得しています。
第三引数はコードを見て分かるようにデバイス情報リストを文字列化したものをカンマで区切って配列にした文字列の配列を用いています。

補足情報(FW/ツールのバージョンなど)

Android Studio Electric Eel | 2022.1.1 Patch 1
Build #AI-221.6008.13.2211.9514443, built on January 21, 2023

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

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

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

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

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

jimbe

2023/03/23 04:58 編集

Bluetooth とかデバイス情報リストとか関係なく、単に ArrayAdapter のコンストラクトの Kotlin での書き方が分からないということでしょうか。 ※以下間違い 公式のドキュメントにもサンプルは有るでしょうし、 Kotlin で ArrayAdapter を使った RecyclerView の紹介記事なら結構ありそうですが、そのようなものは探されましたか。
hoshi-takanori

2023/03/23 03:20

RecyclerView の adapter には ArrayAdapter は使えなかったような…。 また、ArrayAdapter の第二引数は R.id.〜 ではなく R.layout.〜 (リストの一項目のレイアウト) ですね。
jimbe

2023/03/23 03:59 編集

>RecyclerView の adapter には ArrayAdapter は使えなかったような…。 そうでした、失礼しました。 RecyclerView.Adapter を実装したアダプタクラスを作る必要があります。
takk_014

2023/03/23 04:28

お二人ともありがとうございます。 RecyclerView の adapter には ArrayAdapterが使えないとは知りませんでした。 RecyclerView.Adapter を実装したアダプタクラスを作ってみます!
guest

回答1

0

kotlin で Fragment で RecycleView というと最小はこんな感じでしょうか。

MainActivity.kt

kotlin

1import androidx.appcompat.app.AppCompatActivity 2import android.os.Bundle 3 4class MainActivity : AppCompatActivity() { 5 override fun onCreate(savedInstanceState: Bundle?) { 6 super.onCreate(savedInstanceState) 7 setContentView(R.layout.activity_main) 8 9 if(savedInstanceState == null) { 10 supportFragmentManager.beginTransaction() 11 .replace(R.id.fragment_container_view, MainFragment()) 12 .commit() 13 } 14 } 15}

res/layout/activity_main.xml

xml

1<?xml version="1.0" encoding="utf-8"?> 2<androidx.fragment.app.FragmentContainerView xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:tools="http://schemas.android.com/tools" 4 android:id="@+id/fragment_container_view" 5 android:layout_width="match_parent" 6 android:layout_height="match_parent" 7 tools:context=".MainActivity" />

MainFragment.kt

kotlin

1import android.os.Bundle 2import android.view.LayoutInflater 3import androidx.fragment.app.Fragment 4import android.view.View 5import android.view.ViewGroup 6import android.widget.TextView 7import androidx.recyclerview.widget.RecyclerView 8 9class MainFragment : Fragment(R.layout.fragment_main) { 10 override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 11 super.onViewCreated(view, savedInstanceState) 12 13 val recyclerView:RecyclerView = view.findViewById(R.id.recyclerView) 14 recyclerView.adapter = MyAdapter(arrayOf("test1","test2","test3")) 15 } 16 17 private inner class MyAdapter(val datas: Array<String>) : RecyclerView.Adapter<MyAdapter.ViewHolder>() { 18 private inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { 19 val textView: TextView 20 init { 21 textView = itemView.findViewById(android.R.id.text1) 22 } 23 } 24 override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { 25 return ViewHolder(LayoutInflater.from(parent.context).inflate(android.R.layout.simple_list_item_1, parent, false)) 26 } 27 override fun getItemCount(): Int = datas.size 28 override fun onBindViewHolder(holder: ViewHolder, position: Int) { 29 holder.textView.text = datas[position] 30 } 31 } 32}

res/layout/fragment_main.xml

xml

1<?xml version="1.0" encoding="utf-8"?> 2<androidx.recyclerview.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:app="http://schemas.android.com/apk/res-auto" 4 android:id="@+id/recyclerView" 5 android:layout_width="match_parent" 6 android:layout_height="match_parent" 7 app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />

実行結果
エミュレータスクリーンショット

投稿2023/03/23 07:31

jimbe

総合スコア12863

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.44%

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

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

質問する

関連した質問