【问题标题】:Recycler View not displaying the list回收站视图不显示列表
【发布时间】:2020-03-20 19:32:17
【问题描述】:

我的recyclerview 无法正常工作,并且没有显示我为其设置的列表。你能帮我找出问题吗?下面是我创建的FragmentAdapter

片段类 ->

class HomeFragment : Fragment() {

    lateinit var recyclerViewHomeHome: RecyclerView
    lateinit var layoutManager: RecyclerView.LayoutManager

    private val restaurantsInfoList = arrayListOf<Restaurant>(
        Restaurant("rohh", "4.5", "560/person", R.id.imgLogoLogin),
        Restaurant("rohh", "4.5", "560/person", R.id.imgLogoLogin),
        Restaurant("rohh", "4.5", "560/person", R.id.imgLogoLogin),
        Restaurant("rohh", "4.5", "560/person", R.id.imgLogoLogin),
        Restaurant("rohh", "4.5", "560/person", R.id.imgLogoLogin),
        Restaurant("rohh", "4.5", "560/person", R.id.imgLogoLogin),
        Restaurant("rohh", "4.5", "560/person", R.id.imgLogoLogin)

    )

    lateinit var recyclerAdapter: HomeRecyclerAdapter

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {

        val view = inflater.inflate(R.layout.fragment_home, container, false)
        recyclerViewHomeHome = view.findViewById(R.id.recyclerViewHomeHome)
        layoutManager = LinearLayoutManager(activity)
        recyclerAdapter = HomeRecyclerAdapter(activity as Context, restaurantsInfoList)

    }
return view
}

适配器类 ->

class HomeRecyclerAdapter(val context: Context, val itemList: ArrayList<Restaurant>) :
    RecyclerView.Adapter<HomeRecyclerAdapter.homeViewHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): homeViewHolder {

        val view = LayoutInflater.from(parent.context)
            .inflate(R.layout.recycler_view_single_row_item, parent, false)
        return homeViewHolder(view)
    }

    override fun getItemCount(): Int {
        return itemList.size
    }

    override fun onBindViewHolder(holder: homeViewHolder, position: Int) {
        val restaurant = itemList[position]
        holder.txtRestaurantNameSingle.text = restaurant.name
        holder.txtPriceSingle.text = restaurant.cost_for_one
        holder.imgRecyclerViewSingle.setBackgroundResource(restaurant.image_url)
        holder.ratingRecyclerViewSingle.text = restaurant.rating

    }

    class homeViewHolder(view: View) : RecyclerView.ViewHolder(view) {
        val txtRestaurantNameSingle: TextView = view.findViewById(R.id.txtRestaurantNameSingle)
        val txtPriceSingle: TextView = view.findViewById(R.id.txtPriceSingle)
        val ratingRecyclerViewSingle: TextView = view.findViewById(R.id.ratingRecyclerViewSingle)
        val imgRecyclerViewSingle: ImageView = view.findViewById(R.id.imgRecyclerViewSingle)
    }
}

【问题讨论】:

  • 你是否为 RecyclerView 分配了 Adapter 和 LayoutManager?

标签: android kotlin android-recyclerview


【解决方案1】:

你需要在RecyclerView上设置布局管理器和适配器:

    recyclerViewHomeHome = view.findViewById(R.id.recyclerViewHomeHome)
    layoutManager = LinearLayoutManager(activity)
    recyclerAdapter = HomeRecyclerAdapter(activity as Context, restaurantsInfoList)
    recyclerViewHomeHome.layoutManager = layoutManager
    recyclerViewHomeHome.adapter = recyclerAdapter

【讨论】:

    【解决方案2】:

    首先你应该重构你的代码,看看recyclerview

    这是我在重构中提出的建议。您不需要在 HomeRecyclerAdapter 中包含上下文,因此只需将其删除即可。

    所以它应该看起来像这样:

    class HomeFragment : Fragment() {
    
        lateinit var recyclerViewHomeHome: RecyclerView
        lateinit var layoutManager: RecyclerView.LayoutManager
        lateinit var recyclerAdapter: HomeRecyclerAdapter
    
        private val restaurantsInfoList = arrayListOf<Restaurant>(
                Restaurant("rohh", "4.5", "560/person", R.id.imgLogoLogin),
                Restaurant("rohh", "4.5", "560/person", R.id.imgLogoLogin),
                Restaurant("rohh", "4.5", "560/person", R.id.imgLogoLogin),
                Restaurant("rohh", "4.5", "560/person", R.id.imgLogoLogin),
                Restaurant("rohh", "4.5", "560/person", R.id.imgLogoLogin),
                Restaurant("rohh", "4.5", "560/person", R.id.imgLogoLogin),
                Restaurant("rohh", "4.5", "560/person", R.id.imgLogoLogin)
    
        )
    
        override fun onCreateView(
                inflater: LayoutInflater, container: ViewGroup?,
                savedInstanceState: Bundle?
        ): View? {
    
            val view = inflater.inflate(R.layout.fragment_home, container, false)
            recyclerViewHomeHome = view.findViewById(R.id.recyclerViewHomeHome)
            layoutManager = LinearLayoutManager(this)
            recyclerAdapter = HomeRecyclerAdapter(restaurantsInfoList)
            recyclerViewHomeHome.layout = layoutManager
            recyclerViewHomeHome.adapter = recyclerAdapter
            return view
        }
    
    }
    

    对于您的适配器,您可以使用大量的 kotlin 优势:

    class HomeRecyclerAdapter(val itemList: ArrayList<Restaurant>) :
        RecyclerView.Adapter<HomeRecyclerAdapter.homeViewHolder>() {
    
        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): homeViewHolder {
            homeViewHolder.from(parent)
        }
    
        override fun getItemCount(): Int = itemList.size
    
        override fun onBindViewHolder(holder: homeViewHolder, position: Int) {
            val restaurant = itemList[position]
            holder.bind(restaurant)
        }
    
        class homeViewHolder private constructor(view: View) : RecyclerView.ViewHolder(view) {
            val txtRestaurantNameSingle: TextView = view.findViewById(R.id.txtRestaurantNameSingle)
            val txtPriceSingle: TextView = view.findViewById(R.id.txtPriceSingle)
            val ratingRecyclerViewSingle: TextView = view.findViewById(R.id.ratingRecyclerViewSingle)
            val imgRecyclerViewSingle: ImageView = view.findViewById(R.id.imgRecyclerViewSingle)
    
            fun bind(item: Restaurant){
                txtRestaurantNameSingle.text = item.name
                txtPriceSingle.text = item.cost_for_one
                imgRecyclerViewSingle.setBackgroundResource(item.image_url)
                ratingRecyclerViewSingle.text = item.rating
            }
    
            companion object {
                fun from(parent: ViewGroup): ViewHolder {
                    val view = LayoutInflater.from(parent.context).inflate(R.layout.recycler_view_single_row_item, parent, false)
                    return homeViewHolder(view)
                }
            }
    
        }
    }
    

    【讨论】:

      【解决方案3】:

      我修好了。 你犯了一个简单的错误。 崩溃的问题是您错误地使用了充气机。我下载了你的项目并删除了所有不必要的方法和变量以突出问题。 我假设您是初学者,但这没关系,这就是我在 cmets 上提出一些提示的原因。

      请注意,repo 仅包含 java 文件。

      https://github.com/MicroRJ/BenzinpreiseApp-fixed

      //Here was the problem 
      @NonNull
      @Override
      public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
          return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.list_row_prices, parent, false));
      }
      

      如果您需要更多帮助,请告诉我。顺便说一句,该应用程序是做什么用的?看起来很酷。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-02-26
        • 1970-01-01
        • 2018-02-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多