今やっていること
Kotlinで掲示板アプリを作っています。
Firestoreから、Recycleviewにデータを読み取って画面に表示させたいと思っています。
いろいろなサイトを参考にしながら進めてきましたが、分からないところがでてきました。
Firestoreから読み取りたいものは
・名前
・投稿した時間
・タイトル
・詳細
・(アイコン)←まだFirestorageに保存していない
質問したいこと
たくさんあってすみません。
・データクラスは必要か
・データクラスの、投稿時間「var createAt: Date = Date(System.currentTimeMillis()),」はあっているのか。また、必要か。
・CustomAdapterクラスをどこで継承するのか
・他にも意味のないコードがあったり、必要なコードがあったら教えていただきたいです。
コード
1行分のレイアウト
item_post.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="150dp" android:clickable="true" android:focusable="true" android:padding="12dp"> <de.hdodenhof.circleimageview.CircleImageView android:id="@+id/icon" android:layout_width="60dp" android:layout_height="60dp" /> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="16dp" android:layout_weight="1" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:id="@+id/tvname" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:textSize="20sp" android:textStyle="bold" android:layout_margin="5dp"/> <TextView android:id="@+id/tvtime" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:textSize="20sp" android:layout_margin="5dp"/> </LinearLayout> <TextView android:id="@+id/tvtitle" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="4dp" android:textColor="#000000" android:textSize="34sp" android:textStyle="bold"/> <TextView android:id="@+id/tvpost" android:layout_width="match_parent" android:layout_height="wrap_content" android:textColor="#000000" android:textSize="25sp" /> </LinearLayout> </LinearLayout>
データクラス
Post.kt
package com.example.a.Post import java.sql.Date data class Post( val icon: Int, val title: String, val detail: String, var createAt: Date = Date(System.currentTimeMillis()), )
アダプター
CustomAdapter.kt
package com.example.a.Post import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.ImageView import android.widget.TextView import androidx.recyclerview.widget.RecyclerView import com.example.a.R class CustomAdapter(private val postlist: ArrayList<Post>) : RecyclerView.Adapter<CustomAdapter.ViewHolder>() { class ViewHolder(view: View) : RecyclerView.ViewHolder(view) { val icon: ImageView val title: TextView val post: TextView init { icon = view.findViewById(R.id.icon) title = view.findViewById(R.id.tvtitle) post = view.findViewById(R.id.tvpost) } } //レイアウトの設定 override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): ViewHolder { val view = LayoutInflater.from(viewGroup.context).inflate(R.layout.item_post, viewGroup, false) return ViewHolder(view) } //Viewの設定 override fun onBindViewHolder(viewHolder: ViewHolder, position: Int) { val post = postlist[position] viewHolder.icon.setImageResource(post.icon) viewHolder.title.text = post.title viewHolder.post.text = post.detail } //表示数を返す override fun getItemCount(): Int = postlist.size }
表示させるフラグメント
HomeFragment.kt
package com.example.a.Home import android.content.ContentValues.TAG import android.content.Intent import androidx.lifecycle.ViewModelProvider import android.os.Bundle import android.util.Log import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import com.example.a.Post.CustomAdapter import com.example.a.Post.PostScreenActivity import com.example.a.databinding.HomeFragmentBinding import com.google.firebase.auth.ktx.auth import com.google.firebase.firestore.CollectionReference import com.google.firebase.firestore.Query import com.google.firebase.firestore.ktx.firestore import com.google.firebase.ktx.Firebase class HomeFragment : Fragment() { companion object { fun newInstance() = HomeFragment() } private lateinit var viewModel: HomeViewModel private var _binding: HomeFragmentBinding? = null private val binding get() = _binding!! override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { _binding = HomeFragmentBinding.inflate(inflater, container, false) val view = binding.root return view } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) binding.btnpostsc.setOnClickListener { startActivity( Intent( context, PostScreenActivity::class.java ) ) } val db = Firebase.firestore val user = Firebase.auth.currentUser val uid = user!!.uid val citiesRef = db.collection("users").document(uid).collection("UserPosts") citiesRef.orderBy("createdDay", Query.Direction.DESCENDING) citiesRef.get() .addOnSuccessListener { Log.d(TAG, "読み取り成功") } .addOnFailureListener { Log.d(TAG, "読み取り失敗") } } override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) viewModel = ViewModelProvider(this).get(HomeViewModel::class.java) // TODO: Use the ViewModel } override fun onDestroyView() { super.onDestroyView() _binding = null } }
参考にしたサイト
RecyclerViewでグリッド表示を実装する方法を解説
https://hirauchi-genta.com/kotlin-view-recycerview-grid/
まだ回答がついていません
会員登録して回答してみよう