嵌套回收器视图不可见

nested recycler view not visible

我正在尝试使用从服务器接收的数据(使用 Retrofit)创建一个嵌套的回收器视图。外层 recyclerview 打印正常,但内层 recyclerview 根本不打印。

没有错误,没有警告...我不知道为什么。请帮助。

my recylcerview blueprint here

布局代码

布局xml看起来像这样

(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>

适配器代码

(1) 外部回收适配器


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) 内部回收适配器


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代码


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()
            }
        })
    }
}

item_outer_recycler

改变

 <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/innerRecycler"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toBottomOf="parent" />

 <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/innerRecycler"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toBottomOf="@id/houseAddress" />

我认为你应该更换外部适配器

    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 
    }
}

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)
}

并使内部适配器也像外部适配器一样



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)
}

哦...问题是 innerRecycler 被设置为 app:layout_constraintTop_toBottomOf="parent" 。我犯了一个愚蠢的错误。

对不起