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

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

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

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

Android Studio

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

Kotlin

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

Q&A

1回答

230閲覧

RecyclerViewのViewHolderでビューバインド

kmhong

総合スコア5

Android

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

Android Studio

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

Kotlin

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

0グッド

0クリップ

投稿2023/06/06 04:41

編集2023/06/06 10:30

実現したいこと

RecyclerViewのViewHolderで対応するXMLのビューをビューバインドで取得するにはどのようにすればよいでしょうか?

試したこと

ViewHolderで取得したいビューのXMLは、one_layout.xmlとして作成しました。
その中にTextViewを配置しています。
findViewByIdを使う方法であれば実装できました。

Koitlin

1import android.view.View 2import android.widget.TextView 3import androidx.recyclerview.widget.RecyclerView 4 5class ViewHolderItem (itemView: View): RecyclerView.ViewHolder(itemView){ 6 val itemName:TextView = itemView.findViewById(R.id.myTextView) 7}

ただし、findViewByIdは非推奨らしいので、後継のビューバインドを使って実装したいです。
試しに、以下のように記述してみたところ、

Koitlin

1import android.view.View 2import android.widget.TextView 3import androidx.recyclerview.widget.RecyclerView 4import com.xxxx.xxxx.databinding.OneLayoutBinding 5 6class ViewHolderItem (itemView: View): RecyclerView.ViewHolder(itemView){ 7 private lateinit var binding: OneLayoutBinding 8 binding = OneLayoutBinding.inflate(layoutInflator) 9}

以下のようなエラーとなってしまいました。

Expecting member declaration

ここに問題に対して試したことを記載してください。

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

Android Studio Flamingo | 2022.2.1

追記

コンストラクタで処理を書くことを試しました。

import android.view.LayoutInflater import android.view.View import androidx.recyclerview.widget.RecyclerView import com.mytest.kotlinapp01.databinding.OneLayoutBinding import kotlin.coroutines.jvm.internal.CompletedContinuation.context class ViewHolderItem (itemView: View): RecyclerView.ViewHolder(itemView){ private lateinit var binding: OneLayoutBinding init{ val layoutInflater = LayoutInflater.from(context) binding = OneLayoutBinding.inflate(layoutInflator) } }

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

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

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

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

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

guest

回答1

0

binding = OneLayoutBinding.inflate(layoutInflator)

はそこには書けません。
コンストラクタ内等、メソッド内に書いてください。

ついでにですが、何かを変えようというのであれば元を置き換えるだけとは思わないほうが良いと思います。
また、メッセージ Expecting member declaration で検索するだけでも例えば過去の teratail の質問 https://teratail.com/questions/247788 が引っかかり、「書く場所が違う」と指摘を受けて解決しています。

投稿2023/06/06 09:37

jimbe

総合スコア12646

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

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

kmhong

2023/06/06 10:32

ご回答ありがとうございます。 Expecting member declarationのエラーメッセージについて理解しました。 コンストラクタで処理を書くことを試しているのですが、layoutInflatorが認識しなく、解決方法はご存知ですか? layoutInflatorについては、以下のサイトも参考にしましたが、エラーとなってしまう状況です。 https://torajirousan.hatenadiary.jp/entry/2020/01/18/220848
jimbe

2023/06/06 11:27 編集

>layoutInflatorが認識しなく RecyclerView.ViewHolder には context プロパティはありませんので、 LayoutInflater.from(context) は期待通りには動作しないのではないでしょうか。 得るとすればパラメータの itemView に context プロパティがあります。 ようやく状況が分かってきました。 itemView.findViewById が動作しているということは、 この ViewHolderItem の生成時には既に(呼び出し側で)レイアウトの infrate は行っているということですね。 それなら ViewHolderItem で infrate する意味はありません。というより ViewHolderItem 内で infrate したレイアウトの各 view をどうこうした所で、パラメータの itemView とは関係ありません。 やりたいことが findViewById を使わないということであれば、 ViewHolderItem のコンストラクトパラメータを (itemView: View では無く) binding: OneLayoutBinding にして呼び出し側で infrate した binding オブジェクトをそのまま貰っては如何でしょうか。 super クラスのコンストラクタには binding.root を渡せば良いはずです。 例えば呼び出し側で val binding = OneLayoutBinding.inflate(LayoutInflater.from(context)) val viewholder = ViewHolderItem(binding.root) のように書いていたとしたら val binding = OneLayoutBinding.inflate(LayoutInflater.from(context)) val viewholder = ViewHolderItem(binding) として class ViewHolderItem(val binding: OneLayoutBinding): RecyclerView.ViewHolder(binding.root){ する感じでしょうか。(イメージです。)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問