I'm trying to create a nested recycler view with data received from the server(using Retrofit). The outer recyclerview prints fine, but the inner recyclerview doesn't print at all.
No Error, No Warning...I don't know why. please Help.
my recylcerview blueprint here
Layout Code
the layout xml look like this
(1) activity_main
<androidx.coordinatorlayout.widget.CoordinatorLayout
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"
tools:context=".MainActivity">
<com.google.android.material.appbar.AppBarLayout>
<com.google.android.material.appbar.CollapsingToolbarLayout ...>
<androidx.appcompat.widget.Toolbar
android:id="@ id/homeToolbar" ... />
<androidx.constraintlayout.utils.widget.ImageFilterView
android:id="@ id/homeLogo" ... />
<androidx.viewpager2.widget.ViewPager2
android:id="@ id/homeBanner" ... />
</com.google.android.material.appbar.CollapsingToolbarLayout>
</com.google.android.material.appbar.AppBarLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@ id/outerRecycler"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="50dp"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
<com.google.android.material.bottomnavigation.BottomNavigationView
android:layout_width="match_parent"
android:layout_height="50dp" ... />
</androidx.coordinatorlayout.widget.CoordinatorLayout>
(2) item_outer_recycler
<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:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@ id/houseImage"
android:contentDescription="main image"
android:layout_width="match_parent"
android:layout_height="150dp".../>
<TextView
android:id="@ id/houseName"
android:layout_width="200dp"
android:layout_height="30dp"
tools:text="some name" ... />
<TextView
android:id="@ id/houseAddress"
android:layout_width="300dp"
android:layout_height="20dp"
android:layout_marginStart="15dp"
tools:text="some address" ... />
<TextView
android:id="@ id/houseHomepage"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_marginEnd="15dp".../>
<androidx.recyclerview.widget.RecyclerView
android:id="@ id/innerRecycler"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
(3) item_inner_recycler
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tool="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<TextView
android:id="@ id/houseTag"
android:layout_width="50dp"
android:layout_height="20dp"
android:textSize="12sp"
android:textColor="#878d95"
android:background="#e4e7ed"
android:textAlignment="center"
tool:text="roop top"/>
</LinearLayout>
Adapters Code
(1) outer recycler adapter
class MainHouseHolder(val binding: ItemOuterRecyclerBinding): RecyclerView.ViewHolder(binding.root)
class MainHouseAdapter(private val context: Context, private val data: List<House>):
RecyclerView.Adapter<RecyclerView.ViewHolder>() {
override fun getItemCount(): Int = data.size
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MainHouseHolder =
MainHouseHolder(ItemOuterRecyclerBinding.inflate(LayoutInflater.from(parent.context), parent, false))
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
val house = data[position]
val binding = (holder as MainHouseHolder).binding
binding.innerRecycler.adapter = MainTagAdapter(house.tags)
binding.innerRecycler.layoutManager =
LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)
// process outer recycler view
}
}
(2) inner recycler adapter
class MainTagHolder(val binding: ItemInnerRecyclerBinding) : RecyclerView.ViewHolder(binding.root)
class MainTagAdapter(private val data: String) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
var tagData :MutableList<String> = mutableListOf()
override fun getItemCount(): Int {
tagData = data.split(",") as MutableList<String>
return tagData.size
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MainTagHolder =
MainTagHolder(ItemInnerRecyclerBinding.inflate(LayoutInflater.from(parent.context), parent, false))
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
val binding = (holder as MainTagHolder).binding
binding.houseTag.text = tagData[position]
}
}
Activity Code
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
private lateinit var houseList : List<House>
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
setSupportActionBar(binding.homeToolbar)
val apiClient = APIClient().connectInterface
val houseCall = apiClient.getHouseList()
houseCall.enqueue(object : Callback<HouseList> {
override fun onResponse(call: Call<HouseList>, response: Response<HouseList>) {
Log.d("CONNECTOR", "ON_RESPONSE")
houseList = response.body()?.list as List<House>
val adapter = MainHouseAdapter(applicationContext, houseList)
binding.houseList.adapter = adapter
binding.houseList.layoutManager = LinearLayoutManager(applicationContext)
adapter.notifyDataSetChanged()
}
override fun onFailure(call: Call<HouseList>, t: Throwable) {
Log.d("CONNECTOR", "FAILURE")
t.printStackTrace()
}
})
}
}
CodePudding user response:
in item_outer_recycler
change
<androidx.recyclerview.widget.RecyclerView
android:id="@ id/innerRecycler"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="parent" />
to
<androidx.recyclerview.widget.RecyclerView
android:id="@ id/innerRecycler"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/houseAddress" />
CodePudding user response:
I think you should change outer adapter from
class MainHouseHolder(val binding: ItemOuterRecyclerBinding): RecyclerView.ViewHolder(binding.root)
class MainHouseAdapter(private val context: Context, private val data: List<House>):
RecyclerView.Adapter<RecyclerView.ViewHolder>() {
override fun getItemCount(): Int = data.size
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MainHouseHolder =
MainHouseHolder(ItemOuterRecyclerBinding.inflate(LayoutInflater.from(parent.context), parent, false))
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
val house = data[position]
val binding = (holder as MainHouseHolder).binding
binding.innerRecycler.adapter = MainTagAdapter(house.tags)
binding.innerRecycler.layoutManager =
LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)
// process outer recycler view
}
}
to
class MainHouseAdapter(private val context: Context, private val data: List<House>):
RecyclerView.Adapter<MainHouseAdapter.MainHouseHolder>() {
override fun getItemCount(): Int = data.size
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MainHouseHolder =
MainHouseHolder(ItemOuterRecyclerBinding.inflate(LayoutInflater.from(parent.context), parent, false))
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
val house = data[position]
val binding = (holder as MainHouseHolder).binding
binding.innerRecycler.adapter = MainTagAdapter(house.tags)
binding.innerRecycler.layoutManager =
LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)
// process outer recycler view
}
inner class MainHouseHolder(val binding: ItemOuterRecyclerBinding): RecyclerView.ViewHolder(binding.root)
}
and make inner adapter like outer too
class MainTagAdapter(private val data: String) : RecyclerView.Adapter<MainTagAdapter.MainTagHolder>() {
var tagData :MutableList<String> = mutableListOf()
override fun getItemCount(): Int {
tagData = data.split(",") as MutableList<String>
return tagData.size
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MainTagHolder =
MainTagHolder(ItemInnerRecyclerBinding.inflate(LayoutInflater.from(parent.context), parent, false))
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
val binding = (holder as MainTagHolder).binding
binding.houseTag.text = tagData[position]
}
inner class MainTagHolder(val binding: ItemInnerRecyclerBinding) : RecyclerView.ViewHolder(binding.root)
}
CodePudding user response:
Oh...the problem was that innerRecycler was set to app:layout_constraintTop_toBottomOf="parent" . I made a stupid mistake.
I'm sorry