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

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

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

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

Q&A

2回答

2709閲覧

RecyclerViewのViewを直接タップせずにViewの背景カラーを変えたい

yukari00

総合スコア5

Kotlin

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

0グッド

0クリップ

投稿2020/06/16 10:13

こんにちは。
今、RecycleViewとcardViewを使って個人アプリ開発をしています。(初心者です)

RecyclerViewにあるcardViewをタップ時にcardViewの中にあるtextViewやbackgroundを変えたりする方法はわかりますが、cardViewに直接触れずに、recyclerViewの外側にあるボタンをタップした時にcardViewの中にある情報の変更を行いたいです。

<自分で試してみたこと>
・変化を起こしたいcardViewの中にあるtextViewと同じワードをアダプタークラスに取り入れ、そのワードをもとにholderを取得しようとしたが結局方法が見つからない。(cardViewの中の情報に触れるには、そのカードビューのViewholderを取得しなければならないと認識しています)
holderをItemViewの情報から特定できれば解決すると思っています。

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

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

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

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

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

guest

回答2

0

Adapter内でデータを更新し、更新した行に対してRecyclerView#Adapter#notifyItemChangedメソッドを呼び出せば、その行に対してRecyclerView#Adapter#onBindViewHolderメソッドが呼び出されるので、ビューの更新を行います。

kotlin

1package com.example.test0617a 2 3import android.os.Bundle 4import androidx.appcompat.app.AppCompatActivity 5import androidx.recyclerview.widget.RecyclerView 6import android.content.Context 7import android.view.View 8import android.widget.TextView 9import androidx.recyclerview.widget.LinearLayoutManager; 10import android.view.ViewGroup 11import android.view.LayoutInflater 12import android.widget.Button 13import android.graphics.Color 14 15class MainActivity : AppCompatActivity() 16{ 17 override fun onCreate(savedInstanceState: Bundle?) 18 { 19 super.onCreate(savedInstanceState) 20 this.setContentView(R.layout.main_activity) 21 22 val recyclerView: RecyclerView = this.findViewById(R.id.recycler_view) 23 recyclerView.setLayoutManager(LinearLayoutManager(this)) 24 recyclerView.setAdapter(MyAdapter(this)) 25 26 this.findViewById<Button>(R.id.button).setOnClickListener({ 27 val textView = this@MainActivity.findViewById<TextView>(R.id.target) 28 val target: String = textView.getText().toString() 29 val adapter = recyclerView.getAdapter() as MyAdapter 30 adapter.countTarget(target) 31 }) 32 } 33 34 class MyAdapter(private val context: Context) : RecyclerView.Adapter<MyAdapter.MyViewHolder>() 35 { 36 class Item(val label: String) 37 { 38 var count = 0 39 } 40 41 var items = arrayOf<Item>() 42 43 init { 44 this.items += Item("hoge") 45 this.items += Item("piyo") 46 this.items += Item("fuga") 47 } 48 49 class MyViewHolder(view: View) : RecyclerView.ViewHolder(view) 50 { 51 } 52 53 override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) : MyViewHolder 54 { 55 return MyViewHolder(LayoutInflater.from(this.context).inflate(android.R.layout.simple_list_item_1, parent, false)); 56 } 57 58 override fun onBindViewHolder(viewHolder: MyViewHolder, position: Int) 59 { 60 val item = this.items[position] 61 val textView: TextView = viewHolder.itemView.findViewById(android.R.id.text1) 62 textView.setText(item.label + " " + item.count.toString()) 63 viewHolder.itemView.setBackgroundColor(if (item.count % 2 == 0) Color.RED else Color.GREEN) 64 } 65 66 override fun getItemCount() : Int 67 { 68 return this.items.size 69 } 70 71 // 渡された文字列にあった行をカウントアップ 72 fun countTarget(target: String) : Unit 73 { 74 for ((index, item) in this.items.withIndex()) { 75 if (item.label == target) { 76 item.count += 1 77 this.notifyItemChanged(index) 78 } 79 } 80 } 81 } 82} 83

(勉強がてら初めてkotlinで書いたので、kotlinの文法は参考にしないように(笑))
(編集: せっかくなので、背景色を変えてみた)

後はnotifyItemChangedでググれば他にも情報が出てくると思います。

投稿2020/06/17 14:06

編集2020/06/17 14:19
katsuko

総合スコア3538

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

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

0

ざっくりですが、以下でどうですかね?

  1. RecyclerViewにsetしているAdapterにcardViewを変更するメソッドを作る。
  2. RecyclerView外のボタンをタップした際に上記のメソッドを呼ぶ

Viewholderを取得しなければならないと認識しています

その必要はないですね。ViewHoloderはアダプターにセットしているデータを元に表示しているのでデータの情報を変えた後にAdapterを更新すればいいのです。参考サイト

投稿2020/06/17 05:40

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問