본격적으로 첫 팀프로젝트를 시작했는데 주제는 SNS관련 앱을 만드는것이였다
예시로는 인스타앱을 제시해주었지만 우리조는 어떤 SNS관련앱을 만들까 생각하다가 VLIVE(V앱)을 참고해서 우리조가 좋아하는 아이돌들에 대한 게시물을 볼 수 있는 SNS앱을 만들어보았다!
그래서 피그마를 사용해서 아래와 같이 와이어프레임을 짜봤다
디자인은 V앱을 많이 참고해서 만들었다ㅎㅎ
일단 처음에 메인화면부터 만들어줄건데 bottomnavigationview를 사용해서 홈화면과 마이페이지를 클릭했을때 홈프레그먼트,마이페이지 프레그먼트가 나오게 만들어줘야한다
예전에 만들어본적이 있어서 내가 쓴 블로그를 다시 참조해서 코드를 작성했다. 기록하는게 진짜 중요한것같다.. 해봤어도 까먹어서 내가 적었던 블로그를 보면 다시 기억이 잘난다...
# BottomNavigation 만들기
먼저 menu라는 패키지를 만들어서 menu.xml 레이아웃을 만든다음 아래와 같이 써준다
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<group android:checkableBehavior="single">
<item
android:id="@+id/home"
android:enabled="true"
android:icon="@drawable/ic_home"
android:title="@string/home" />
<item
android:id="@+id/mypage"
android:enabled="true"
android:icon="@drawable/ic_mypage"
android:title="@string/mypage" />
</group>
</menu>
menu.xml
그리고 activity_main으로 가서 frameLayout와 bottomnavigation를 추가해준다
bottomnavigation에 menu에 아까 만든 menu를 적용해준다
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<FrameLayout
android:id="@+id/main_framelayout"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintBottom_toTopOf="@+id/main_bottomnavgation"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/main_linearlayout"
app:layout_constraintVertical_bias="0.0">
</FrameLayout>
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/main_bottomnavgation"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:menu="@menu/menu" />
</androidx.constraintlayout.widget.ConstraintLayout>
activity_main.xml
이런식으로 레이아웃이 보이는것을 확인할 수 있다
FrameLayout을 지정해서 Fragment가 들어갈 공간을 지정해준다고 생각하면 될것같다
이제 홈버튼과 마이페이지를 클릭했을때 각각 해당하는 프레그먼트가 나오도록
홈프레그먼트와 마이페이지 프레그먼트를 생성해준다
생성해줬으면 나는 바인딩을 사용해서 더 편하게 써줄거기때문에
build.gradle(app)에 아래 코드를 추가해준다
// 뷰 바인딩
buildFeatures{
viewBinding = true
}
build.gradle(app).kt
build.gradle에 코드를 써줬으면 HomeFragment로 가서 아래와같이 뷰바인딩 선언과 초기화를 해줘서 뷰바인딩을 쓸 수 있도록 해준다
class HomeFragment : Fragment() {
private lateinit var binding : FragmentHomeBinding // 뷰바인딩 선언(초기화는 나중에)
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
// 뷰바인딩 초기화
binding = FragmentHomeBinding.inflate(inflater, container, false)
return binding.root
}
}
HomeFragment.kt
MypageFragment에도 똑같이 뷰바인딩을 사용할 수 있도록 적용해준다
이렇게 뷰바인딩까지 완료했으면 MainActivity로 돌아가서
BottomNavigation()함수를 새로 만들어서 해당 버튼을 눌렀을때 해당하는 Fragment로 이동하도록 코드를 아래와같이 짜준다
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
BottomNavigation()
}
// bottomNavigation 구현함수
private fun BottomNavigation(){
val bottom_nav = findViewById<BottomNavigationView>(R.id.main_bottomnavgation)
// main_framelayout레이아웃을 HomeFragment로 대체
supportFragmentManager.beginTransaction()
.replace(R.id.main_framelayout, HomeFragment())
.commitAllowingStateLoss()
bottom_nav.setOnItemSelectedListener { item ->
when (item.itemId){
// home클릭시 HomeFragment()로 대체
R.id.home -> {
supportFragmentManager.beginTransaction()
.replace(R.id.main_framelayout, HomeFragment())
.commitAllowingStateLoss()
return@setOnItemSelectedListener true
}
// mypage클릭시 MypageFragment()로 대체
R.id.mypage -> {
supportFragmentManager.beginTransaction()
.replace(R.id.main_framelayout, MypageFragment())
.commitAllowingStateLoss()
return@setOnItemSelectedListener true
}
}
false
}
}
}
MainActivity.kt
처음에 main_framelayout을 HomeFragment로 대체해주는 코드를 써줘야지 MainActiviy를 들어가자마자 HomeFragment가 보이는것을 확인할수있다. 만약 이부분 코드를 써주지 않으면 처음에 MainActiviy를 들어갔을때 아무화면도 나오지 않고 홈버튼을 눌러야지만 HomeFragment로 이동할것이다. 처음에 MainActiviy를 들어가자마자 보여줄 Fragment를 지정해준다고 생각해주면 될것같다
이렇게하면 홈을 눌렀을때 HomeFragment로, 마이페이지를 눌렀을때 MypageFragment로 잘 연결되서 이동되는것을 볼수있다!!
# HomeFragment 디자인
이제 HomeFragment에 해당하는 부분을 만들어줘야될것이다
먼저 fragment_home.xml 레이아웃을 디자인해줬다
<?xml version="1.0" encoding="utf-8"?>
<androidx.core.widget.NestedScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="15dp"
tools:context=".HomeFragment">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<HorizontalScrollView
android:id="@+id/home_horizontalScrollView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:ignore="MissingConstraints">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/home_constrainlayout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:id="@+id/home_background1_imageview"
android:layout_width="180dp"
android:layout_height="210dp"
android:layout_marginStart="17dp"
android:layout_marginTop="20dp"
android:src="@drawable/ic_background_gray"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:id="@+id/home_bts_imageview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:src="@drawable/ic_bts"
app:layout_constraintEnd_toEndOf="@+id/home_background1_imageview"
app:layout_constraintStart_toStartOf="@+id/home_background1_imageview"
app:layout_constraintTop_toTopOf="@+id/home_background1_imageview" />
<TextView
android:id="@+id/home_bts_textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:minHeight="25dp"
android:layout_marginTop="10dp"
android:text="@string/bts"
android:textSize="20sp"
android:textColor="@color/black"
android:textStyle="bold"
app:layout_constraintEnd_toEndOf="@+id/home_bts_imageview"
app:layout_constraintStart_toStartOf="@+id/home_bts_imageview"
app:layout_constraintTop_toBottomOf="@+id/home_bts_imageview" />
<ImageView
android:id="@+id/home_background2_imageview"
android:layout_width="180dp"
android:layout_height="210dp"
android:layout_marginStart="15dp"
android:src="@drawable/ic_background_gray"
app:layout_constraintBottom_toBottomOf="@+id/home_background1_imageview"
app:layout_constraintStart_toEndOf="@+id/home_background1_imageview"
app:layout_constraintTop_toTopOf="@+id/home_background1_imageview" />
<ImageView
android:id="@+id/home_btob_imageview"
android:layout_width="wrap_content"
android:layout_height="130dp"
android:layout_marginTop="15dp"
android:src="@drawable/ic_btob"
app:layout_constraintEnd_toEndOf="@+id/home_background2_imageview"
app:layout_constraintStart_toStartOf="@+id/home_background2_imageview"
app:layout_constraintTop_toTopOf="@+id/home_background2_imageview" />
<TextView
android:id="@+id/home_btob_textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:minHeight="25dp"
android:layout_marginTop="10dp"
android:text="@string/btob"
android:textSize="20sp"
android:textStyle="bold"
android:textColor="@color/black"
app:layout_constraintEnd_toEndOf="@+id/home_btob_imageview"
app:layout_constraintStart_toStartOf="@+id/home_btob_imageview"
app:layout_constraintTop_toBottomOf="@+id/home_btob_imageview" />
<ImageView
android:id="@+id/home_background3_imageview"
android:layout_width="180dp"
android:layout_height="210dp"
android:layout_marginStart="20dp"
android:src="@drawable/ic_background_gray"
app:layout_constraintBottom_toBottomOf="@+id/home_background2_imageview"
app:layout_constraintStart_toEndOf="@+id/home_background2_imageview"
app:layout_constraintTop_toTopOf="@+id/home_background2_imageview" />
<ImageView
android:id="@+id/home_idle_imageview"
android:layout_width="165dp"
android:layout_height="130dp"
android:layout_marginTop="15dp"
android:layout_weight="1"
android:src="@drawable/ic_idle"
app:layout_constraintEnd_toEndOf="@+id/home_background3_imageview"
app:layout_constraintStart_toStartOf="@+id/home_background3_imageview"
app:layout_constraintTop_toTopOf="@+id/home_background3_imageview" />
<TextView
android:id="@+id/home_idle_textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:minHeight="25dp"
android:layout_marginTop="10dp"
android:text="@string/idle"
android:textSize="20sp"
android:textColor="@color/black"
android:textStyle="bold"
app:layout_constraintEnd_toEndOf="@+id/home_idle_imageview"
app:layout_constraintStart_toStartOf="@+id/home_background3_imageview"
app:layout_constraintTop_toBottomOf="@+id/home_idle_imageview" />
</androidx.constraintlayout.widget.ConstraintLayout>
</HorizontalScrollView>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/home_recyclerview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="15dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/home_horizontalScrollView" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.core.widget.NestedScrollView>
fragment_home.xml
이런식으로 위쪽부분은 수평으로 스크롤뷰를 사용하기위해서 저 수평레이아웃 전체를 ConstraintLayout으로 묶어주고 HorizontalScrollView를 사용해서 수평으로 스크롤이 가능하도록 해줬다
그리고 전체는 수직으로 스크롤뷰가 가능하도록 모든 레이아웃을 ConstraintLayout으로 묶어주고 NestedScrollView를 사용해서 전체가 수직으로 스크롤 가능하게 디자인해줬다
참고로 스크롤뷰 안에는 하나의 레이아웃만 있어야하기때문에 스크롤뷰를 사용하고싶으면 레이아웃으로 스크롤뷰할 레이아웃 전체를 묶어준 뒤에 사용해야된다
그리고 아래는 리사이클러뷰를 사용할것이기 때문에 RecyclerView레이아웃을 사용해서 디자인해줬다
# HomeFragment에 RecyclerView 사용하기
리사이클러뷰를 사용하는 방법은 간단하게 이렇게 정리해볼 수 있다
1) 리사이클러뷰를 사용할 부분에 RecyclerView 레이아웃을 사용해서 디자인해주기 (fragment_home에 디자인)
2) RecyclerView 레이아웃에 들어갈 레이아웃 하나를 디자인해주기
3) 레이아웃에 해당하는 데이터모델을 만들어주기
4) Adapter를 만들어서 리사이클러뷰와 레이아웃을 연결해주는 중간다리역할을 하도록 만들어주기
5) HomeFragment에서 Adapter를 연결시켜주기
일단 1번은 아까 위에서 해줬기때문에 2번부터 해보도록 하겠다
home_item_list라는 레이아웃을 만들고 리사이클러뷰에 들어갈 레이아웃 하나를 디자인해준다
우리 조는 이런식으로 디자인해줬다
이제 3번 부분인 데이터모델을 만들어줄것이다
data class DataModel (
@DrawableRes
val image : Int , // drawable은 숫자로 인식
val title : String, // 제목
val content : String, // 내용
val nickName : String, // 닉네임
val profile_image : Int // 프로필 이미지
)
DataModel.kt
이미지,제목,내용,닉네임,프로필 이미지에 대한 데이터를 담아서 데이터모델을 만들어주었다
이미지는 drawable로 사용해줄건데 drawable은 숫자로 인식하기 때문에 String이 아닌 Int로 써준다!!
그다음 4번 부분인 Adapter를 만들어줄것이다
// RecyclerView.Adapter<HomeAdapter.HomeViewHolder> 상속받음
class HomeAdapter(private val itemList: ArrayList<DataModel>) : RecyclerView.Adapter<HomeAdapter.HomeViewHolder>(){
// ViewHolder는 기본적으로 화면에 표시될데이터나 아이템들 저장하는 역할
class HomeViewHolder(itemView : View) : RecyclerView.ViewHolder(itemView){
val nickname = itemView.findViewById<TextView>(R.id.home_bts_textview2)
val title = itemView.findViewById<TextView>(R.id.home_title_textview)
val image = itemView.findViewById<ImageView>(R.id.home_bts_imageview2)
val profile_img = itemView.findViewById<ImageView>(R.id.home_profile_imageview)
}
// 뷰가 만들어질때 호출되는 메소드 (레이아웃 연결)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): HomeViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.home_item_list, parent,false)
return HomeViewHolder(view) // HomeViewHolder에 레이아웃 담아서 리턴
}
// 개수 리턴
override fun getItemCount(): Int {
return itemList.size // 리스트아이템의 사이즈 리턴 (숫자 2넣으면 아이템 2개만 리턴)
}
// 데이터 연결
override fun onBindViewHolder(holder: HomeViewHolder, position: Int) {
// HomeViewHolder에 데이터를 연결
holder.nickname.text = itemList[position].nickName
holder.title.text = itemList[position].title
holder.image.setImageResource(itemList[position].image)
holder.profile_img.setImageResource(itemList[position].image)
}
}
HomeAdapter.kt
먼저 어뎁터를 만들어주고 ArrayList에 아까 만든 DataModel을 넣어준다.
그리고 기본적으로 어뎁터는 RecyclerView.Adapter<HomeAdapter.HomeViewHolder>를 상속받는다
HomeViewHolder부분 변수명은 내가 원하는대로 작성해주면된다
그리고 onCreateViewHolder(), getItemCount(), onBindViewHolder() 를 각각 오버라이딩해준다.
( ctrl + I 해주면 자동으로 오버라이딩 됨)
onCreateViewHolder()는 뷰가 만들어질때 호출되는 메소드로, 위에서 만든 아이템하나의 레이아웃을 인플레이트하여 뷰 홀더를 생성해 return 해준다
getItemCount()는 리스트의 사이즈를 리턴해주기 때문에 itemList.size나 itemList.count를 사용해서 아이템의 사이즈를 리턴해준다
onBindViewHolder()는 뷰가 바인드(Bind)될때 호출되는 메소드이다
즉, onCreateViewHolder()에서 뷰가 만들어졌다면, onBindViewHolder()는 뷰에 내용이 씌워질때라고 보면될것같다
리사이클러뷰가 한번 만들어지면 각 뷰는 한번만 생성되지만 삭제되지 않고 계속 재활용되기 때문에 onCreateViewHolder()는 리사이클러뷰가 만들어질때만 호출되지만, onBindViewHolder()는 스크롤을 내리거나 올릴때마다 호출된다
따라서 여기에는 스크롤을 내리거나 올릴때마다 호출될 데이터를 넣어줘야되는데, 리스트아이템의 레이아웃과 해당하는 데이터들을 연결시켜준다
이렇게하고 마지막 5번부분인 HomeFragment에서 Adapter를 연결시켜줄것이다
class HomeFragment : Fragment() {
private lateinit var binding : FragmentHomeBinding // 뷰바인딩 선언(초기화는 나중에)
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
// 뷰바인딩 초기화
binding = FragmentHomeBinding.inflate(inflater, container, false)
val itemList = HomeList(resources)
val adapter = HomeAdapter(itemList) // HomeAdapter에 itemList데이터 담기
binding.homeRecyclerview.adapter = adapter // 리사이클러뷰 레이아웃과 어뎁터 연결 (어뎁터가 중간다리 역할이기 때문에 Fragment와 Adapter를 연결시켜줘야함!!)
// GridLayoutManager사용해 리사이클러뷰 아이템 한줄에 1개씩 배치
binding.homeRecyclerview.layoutManager = GridLayoutManager(context,1)
return binding.root
}
fun HomeList(resources: Resources) : ArrayList<DataModel>{
return arrayListOf(
DataModel(
image = R.drawable.img_bts,
title = resources.getString(R.string.title_content_tv),
content = resources.getString(R.string.post_tv1),
nickName = resources.getString(R.string.bts),
profile_image = R.drawable.img_bts
),
DataModel(
image = R.drawable.img_btob,
title = resources.getString(R.string.title_content_tv2),
content = resources.getString(R.string.post_tv2),
nickName = resources.getString(R.string.btob),
profile_image = R.drawable.img_btob
)
)
}
}
HomeFragment.kt
일단 HomeList라는 함수를 따로 만들어서 ArrayList에 DataModel을 넣은것을 리턴값으로 설정해놓고,
데이터모델에 넣고싶은 값을 넣어서 리턴해준다
그런다음 HomeAdapter에 방금 만든 HomeList함수를 넣어서, 리사이클러뷰 레이아웃과 연결해준다
마지막으로 layoutManager종류중에 하나인 GridLayoutManager를 사용해서 리사이클러뷰 아이템을 한줄에 한개씩 배치해줬다
근데 생각해보니깐 LinearLayoutManager를 사용하는게 더 효율적일것같다
평범하게 수직형태로 아이템 한개씩 배치해주고싶으면 앞으로 아래와 같이 쓰도록하자....
binding.homeRecyclerview.layoutManager = LinearLayoutManager(context)
(참고로 layoutManager종류는 LinearLayoutManager(수평/수직으로 배치), GridLayoutManager(한줄에 여러개 배치), StaggeredGridLayoutManage(높이가 불규칙한 격자 화면으로 배치) 이렇게 3가지가 있다)
여기까지하고 실행시키면 HomeList의 DataModel에 데이터를 넣은 개수만큼 리사이클러뷰 아이템이 나타날것이다!!
# RecyclerView 클릭이벤트 사용하기
이제 방금 만든 리사이클러뷰 아이템을 클릭했을때 다른 엑티비티로 이동해줘야될것이다
먼저 HomeAdpater로 가서 onItemClick이라는 변수를 선언해주고
onBindViewHolder부분에서 클릭이벤트를 추가해준다
// RecyclerView.Adapter<HomeAdapter.HomeViewHolder> 상속받음
class HomeAdapter(private val itemList: ArrayList<DataModel>) : RecyclerView.Adapter<HomeAdapter.HomeViewHolder>(){
// 클릭 이벤트 추가부분
var onItemClick : ((DataModel) -> Unit)? = null
// ViewHolder는 기본적으로 화면에 표시될데이터나 아이템들 저장하는 역할
class HomeViewHolder(itemView : View) : RecyclerView.ViewHolder(itemView){
val nickname = itemView.findViewById<TextView>(R.id.home_bts_textview2)
val title = itemView.findViewById<TextView>(R.id.home_title_textview)
val image = itemView.findViewById<ImageView>(R.id.home_bts_imageview2)
val profile_img = itemView.findViewById<ImageView>(R.id.home_profile_imageview)
}
// 뷰가 만들어질때 호출되는 메소드 (레이아웃 연결)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): HomeViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.home_item_list, parent,false)
return HomeViewHolder(view) // HomeViewHolder에 레이아웃 담아서 리턴
}
// 개수 리턴
override fun getItemCount(): Int {
return itemList.size // 리스트아이템의 사이즈 리턴 (숫자 2넣으면 아이템 2개만 리턴)
}
// 데이터 연결
override fun onBindViewHolder(holder: HomeViewHolder, position: Int) {
// HomeViewHolder에 데이터를 연결
holder.nickname.text = itemList[position].nickName
holder.title.text = itemList[position].title
holder.image.setImageResource(itemList[position].image)
holder.profile_img.setImageResource(itemList[position].image)
// 클릭 이벤트 추가
holder.itemView.setOnClickListener {
onItemClick?.invoke(itemList[position])
}
}
}
HomeAdapter.kt
이제 HomeFragment로 이동해서 어뎁터 아이템 클릭시 DeatailActivity로 이동하는 코드를 짜준다
DeatailActivity에 title,content,image를 표시해줄거기때문에 해당하는 데이터도 넘겨주었다
class HomeFragment : Fragment() {
private lateinit var binding : FragmentHomeBinding // 뷰바인딩 선언(초기화는 나중에)
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
// 뷰바인딩 초기화
binding = FragmentHomeBinding.inflate(inflater, container, false)
val itemList = HomeList(resources)
val adapter = HomeAdapter(itemList) // HomeAdapter에 itemList데이터 담기
binding.homeRecyclerview.adapter = adapter // 리사이클러뷰 레이아웃과 어뎁터 연결 (어뎁터가 중간다리 역할이기 때문에 Fragment와 Adapter를 연결시켜줘야함!!)
// 어뎁터 아이템 클릭시
adapter.onItemClick = {
val intent = Intent(context, DetailActivity::class.java)
// DetailActivity로 title, content, image에 관한 데이터 넘겨줌
intent.putExtra("title",it.title)
intent.putExtra("content",it.content)
intent.putExtra("image",it.image)
startActivity(intent)
}
// GridLayoutManager사용해 리사이클러뷰 아이템 한줄에 1개씩 배치
binding.homeRecyclerview.layoutManager = GridLayoutManager(context,1)
return binding.root
}
fun HomeList(resources: Resources) : ArrayList<DataModel>{
return arrayListOf(
DataModel(
image = R.drawable.img_bts,
title = resources.getString(R.string.title_content_tv),
content = resources.getString(R.string.post_tv1),
nickName = resources.getString(R.string.bts),
profile_image = R.drawable.img_bts
),
DataModel(
image = R.drawable.img_btob,
title = resources.getString(R.string.title_content_tv2),
content = resources.getString(R.string.post_tv2),
nickName = resources.getString(R.string.btob),
profile_image = R.drawable.img_btob
)
)
}
}
HomeFragment.kt
이렇게 해주면 리사이클러뷰 아이템 클릭도 잘 되는걸 확인할 수 있다!!
'Android Project' 카테고리의 다른 글
[Android / Kotlin] SNS 앱 팀 프로젝트 - 회원가입, 로그인 / 마이페이지 (1) | 2024.04.07 |
---|---|
[Android / Kotlin] SNS 앱 팀 프로젝트 - 디테일페이지 (1) | 2024.04.07 |
[kotlin]간단한 로또번호 생성앱 만들기 (0) | 2024.02.26 |
[kotlin] 간단한 BMI 계산기앱 만들기 (0) | 2024.02.26 |
[Android/Kotlin] 커뮤니티앱(13) - 게시판 댓글 (0) | 2024.02.08 |