Home > Blockchain >  nested recycler view not visible
nested recycler view not visible

Time:11-25

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

  • Related