【问题标题】:nested recycler view not visible嵌套的回收站视图不可见
【发布时间】:2022-01-03 11:35:15
【问题描述】:

我正在尝试使用从服务器接收的数据创建一个嵌套的回收器视图(使用改造)。外部 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]
    }
}

活动代码


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

【问题讨论】:

    标签: android kotlin android-recyclerview


    【解决方案1】:

    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" />
    

    【讨论】:

      【解决方案2】:

      我认为你应该从

      更改外部适配器
          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)
      }
      
      

      【讨论】:

      • 这似乎也是一个好点。我会尝试。非常感谢!
      【解决方案3】:

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

      对不起

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-08
        • 2019-08-10
        • 1970-01-01
        • 2016-09-22
        相关资源
        最近更新 更多