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

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

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

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

Kotlin

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

ArrayList

Java用のタグです。arrayListはListインターフェースを実装した、リサイズ可能な配列用クラスです。

Q&A

解決済

1回答

607閲覧

受け渡したArrayListのうち最初のデータしかRecyclerViewで表示されない

akira3213

総合スコア1

Android Studio

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

Kotlin

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

ArrayList

Java用のタグです。arrayListはListインターフェースを実装した、リサイズ可能な配列用クラスです。

0グッド

0クリップ

投稿2021/05/06 15:30

前提・実現したいこと

プレイヤーの名前を追加していける画面と、その画面上でボタンが押されたのちに、入力されたプレイヤー名を受け取り表示する画面を作成しています。

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

・ボタンを押したのちにプレイヤー名をArrayListで渡すところまではできたのですが、受け渡したデータの最初の一行目のデータしか表示されません。

該当のソースコード

ScoreBook

kotlin

1 2import android.os.Bundle 3import android.view.View 4import android.widget.Button 5import androidx.appcompat.app.AppCompatActivity 6import androidx.recyclerview.widget.LinearLayoutManager 7import androidx.recyclerview.widget.RecyclerView 8 9class ScoreBook : AppCompatActivity() { 10 11 private lateinit var recyclerView : RecyclerView 12 private lateinit var viewAdapter : RecyclerView.Adapter<*> 13 14 override fun onCreate(savedInstanceState: Bundle?) { 15 super.onCreate(savedInstanceState) 16 setContentView(R.layout.activity_score_book) 17 18 val playerList: ArrayList<String> = ArrayList(intent.getStringArrayListExtra("playerList")) 19 20 viewAdapter = PlayerScoreAdapter(playerList) 21 recyclerView = findViewById<RecyclerView>(R.id.player_score_name) 22 recyclerView.adapter = viewAdapter 23 recyclerView.layoutManager = LinearLayoutManager(this) 24 25 findViewById<Button>(R.id.back_to_playerList).setOnClickListener(backToPlayer()) 26 27 } 28 29 private inner class backToPlayer : View.OnClickListener{ 30 override fun onClick(view: View) { 31 finish() 32 } 33 } 34}

PlayerScoreAdapter

kotlin

1import android.view.LayoutInflater 2import android.view.View 3import android.view.ViewGroup 4import android.widget.TextView 5import androidx.recyclerview.widget.RecyclerView 6 7class PlayerScoreAdapter(private val data: ArrayList<String>) : RecyclerView.Adapter<PlayerScoreAdapter.PlayerScoreViewHolder>() { 8 9 // 2: ViewHolderの宣言 10 class PlayerScoreViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) 11 12 // 3: ViewHolderが初めて作られたときの処理 13 override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PlayerScoreViewHolder { 14 val itemView = LayoutInflater.from(parent.context) 15 .inflate(R.layout.player_score_view, parent, false) 16 return PlayerScoreViewHolder(itemView) 17 } 18 19 // 4: ViewHolderが表示されるときの処理 20 override fun onBindViewHolder(holder: PlayerScoreViewHolder, position: Int) { 21 val name = data[position] 22 holder.itemView.findViewById<TextView>(R.id.player_name).text = name 23 } 24 25 // 5: 表示するアイテムの個数を返す処理 26 override fun getItemCount(): Int { 27 return data.size 28 } 29}

MainActivity

kotlin

1import android.content.Intent 2import android.graphics.Canvas 3import android.graphics.Color 4import android.graphics.drawable.ColorDrawable 5import androidx.appcompat.app.AppCompatActivity 6import android.os.Bundle 7import android.view.View 8import android.widget.* 9import androidx.recyclerview.widget.DividerItemDecoration 10import androidx.recyclerview.widget.ItemTouchHelper 11import androidx.recyclerview.widget.LinearLayoutManager 12import androidx.recyclerview.widget.RecyclerView 13 14class MainActivity : AppCompatActivity() { 15 16 private val playerList = ArrayList<String>() 17 private lateinit var itemTouchHelper : ItemTouchHelper 18 private lateinit var recyclerView : RecyclerView 19 private lateinit var viewAdapter : RecyclerView.Adapter<*> 20 21 override fun onCreate(savedInstanceState: Bundle?) { 22 super.onCreate(savedInstanceState) 23 setContentView(R.layout.activity_main) 24 25 viewAdapter = PlayerAdapter(playerList) 26 recyclerView = findViewById<RecyclerView>(R.id.playerList) 27 28 val dividerItemDecoration = DividerItemDecoration(this, LinearLayoutManager(this).getOrientation()) 29 recyclerView.addItemDecoration(dividerItemDecoration) 30 31 recyclerView.adapter = viewAdapter 32 recyclerView.layoutManager = LinearLayoutManager(this) 33 34 itemTouchHelper = ItemTouchHelper(getRecyclerViewSimpleCallBack()) 35 itemTouchHelper.attachToRecyclerView(recyclerView) 36 37 //リスナー 38 findViewById<Button>(R.id.addPlayerBtn).setOnClickListener(addPlayer()) 39 findViewById<Button>(R.id.startGame).setOnClickListener(startGame()) 40 } 41 42 private inner class addPlayer : View.OnClickListener { 43 override fun onClick(view: View) { 44 45 val newPlayerName = findViewById<EditText>(R.id.newPlayerName) 46 if (viewAdapter.getItemCount() <= 3) { 47 if (newPlayerName.toString().isNotBlank()) { 48 playerList.add(newPlayerName.text.toString()) 49 findViewById<RecyclerView>(R.id.playerList).adapter = PlayerAdapter(playerList) 50 newPlayerName.setText("") 51 } 52 }else{ 53 Toast.makeText(this@MainActivity, "登録可能人数は4人までです",Toast.LENGTH_SHORT).show() 54 } 55 } 56 } 57 58 59 private fun getRecyclerViewSimpleCallBack() = 60 // 引数で、上下のドラッグ、および左方向のスワイプを有効にしている。 61 object : ItemTouchHelper.SimpleCallback(ItemTouchHelper.UP or ItemTouchHelper.DOWN, 62 ItemTouchHelper.LEFT) { 63 64 // ドラッグしたときに呼ばれる 65 override fun onMove(p0: RecyclerView, p1: RecyclerView.ViewHolder, p2: RecyclerView.ViewHolder): Boolean { 66 67 // どこからどこへアイテムが移動するのかa 68 val fromPosition = p1.adapterPosition 69 val toPosition = p2.adapterPosition 70 71 if (p1.itemViewType == p2.itemViewType) { 72 // Adapter の持つ実データセットを操作している 73 playerList.add(toPosition, playerList.removeAt(fromPosition)) 74 // Adapter にアイテムが移動したことを通知 75 viewAdapter.notifyItemMoved(fromPosition, toPosition) 76 } 77 return true 78 } 79 80 // スワイプしたとき 81 override fun onSwiped(p0: RecyclerView.ViewHolder, p1: Int) { 82 p0.let { 83 // 実データセットからアイテムを削除 84 playerList.removeAt(p0.adapterPosition) 85 // adapter に通知 86 viewAdapter.notifyItemRemoved(p0.adapterPosition) 87 } 88 } 89 90 override fun onChildDraw( 91 c: Canvas, 92 recyclerView: RecyclerView, 93 viewHolder: RecyclerView.ViewHolder, 94 dX: Float, 95 dY: Float, 96 actionState: Int, 97 isCurrentlyActive: Boolean 98 ) { 99 super.onChildDraw( 100 c, 101 recyclerView, 102 viewHolder, 103 dX, 104 dY, 105 actionState, 106 isCurrentlyActive 107 ) 108 val itemView = viewHolder.itemView 109 val background = ColorDrawable() 110 background.color = Color.parseColor("#f44336") 111 if (dX < 0) 112 background.setBounds( 113 itemView.right + dX.toInt(), 114 itemView.top, 115 itemView.right, 116 itemView.bottom 117 ) 118 else 119 background.setBounds( 120 itemView.left, 121 itemView.top, 122 itemView.left + dX.toInt(), 123 itemView.bottom 124 ) 125 126 background.draw(c) 127 } 128 } 129 130 //スタートボタン押されたとき 131 private inner class startGame : View.OnClickListener{ 132 override fun onClick(view: View) { 133 val intentGame = Intent(this@MainActivity, ScoreBook::class.java) 134 intentGame.putStringArrayListExtra("playerList",playerList) 135 startActivity(intentGame) 136 } 137 } 138}

PlayerAdapter

kotlin

1import android.view.LayoutInflater 2import android.view.View 3import android.view.ViewGroup 4import android.widget.TextView 5import androidx.recyclerview.widget.RecyclerView 6 7class PlayerAdapter(private val data: ArrayList<String>) : RecyclerView.Adapter<PlayerAdapter.MyViewHolder>() { 8 9 // 2: ViewHolderの宣言 10 class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) 11 12 // 3: ViewHolderが初めて作られたときの処理 13 override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder { 14 val itemView = LayoutInflater.from(parent.context) 15 .inflate(R.layout.player_item_view, parent, false) 16 return MyViewHolder(itemView) 17 } 18 19 // 4: ViewHolderが表示されるときの処理 20 override fun onBindViewHolder(holder: MyViewHolder, position: Int) { 21 val name = data[position] 22 holder.itemView.findViewById<TextView>(R.id.item_name).text = name 23 } 24 25 // 5: 表示するアイテムの個数を返す処理 26 override fun getItemCount(): Int { 27 return data.size 28 } 29}

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

Android 4.1, Windows10

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

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

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

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

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

guest

回答1

0

自己解決

xmlのheightがmatch_parentとなっていたところをwrap_contentに修正したところ、解決しました。

xml

1<androidx.constraintlayout.widget.ConstraintLayout 2 xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:app="http://schemas.android.com/apk/res-auto" 4 xmlns:tools="http://schemas.android.com/tools" 5 android:id="@+id/my_item_view" 6 android:layout_width="match_parent" 7 android:layout_height="wrap_content">

投稿2021/05/07 10:38

akira3213

総合スコア1

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問