当前位置: 首页 > 知识库问答 >
问题:

Android RecyclerView适配器数据绑定-找不到符号{layout}BindingImpl

崔高远
2023-03-14

我有一个片段,它显示了带有天气信息的城市列表。我正在使用一个RecolyerView,并试图在我的RecolyerView适配器中实现数据绑定库,但由于某种原因,我得到了以下编译错误:

> error: cannot find symbol import 
         com.example.zach.weatherapp.databinding.CityListItemBindingImpl;
>                                               ^   
> symbol:   class CityListItemBindingImpl   
> location: package com.example.zach.weatherapp.databinding

这是一个自动生成的类,所以我真的不知道错误在哪里。以前,当xml文件中有一些错误时,我在其他布局中也出现了同样的错误,但这里似乎没有问题。

package com.example.zach.weatherapp.Adapter

import ...

class ForecastAdapter(var myDataset: List<City>) :
    RecyclerView.Adapter<ForecastAdapter.ForecastViewHolder>() {

    var context:Context?=null
    // Provide a reference to the views for each data item
    // Complex data items may need more than one view per item, and
    // you provide access to all the views for a data item in a view holder.
    class ForecastViewHolder(var binding: CityListItemBinding) : RecyclerView.ViewHolder(binding.root){
        fun bind(city: City){
            binding.city = city
        }
    }


    // Create new views (invoked by the layout manager)
    override fun onCreateViewHolder(parent: ViewGroup,
                                    viewType: Int): ForecastAdapter.ForecastViewHolder {

        context = parent.context
        val layoutIdForListItem = R.layout.city_list_item
        val inflater = LayoutInflater.from(context)
        val shouldAttachToParentImmediately = false

        val binding = DataBindingUtil.inflate<CityListItemBinding>(inflater,layoutIdForListItem,parent,shouldAttachToParentImmediately)
        //val view = inflater.inflate(layoutIdForListItem, parent, shouldAttachToParentImmediately)

        return ForecastViewHolder(binding)
    }

    // Replace the contents of a view (invoked by the layout manager)
    override fun onBindViewHolder(holder: ForecastViewHolder, position: Int) {

        val city = myDataset[position]
        holder.bind(city)

        Glide.with(context)
            .load("http://openweathermap.org/img/w/${city.weather[0].icon}.png")
            .into(holder.binding.forceastImageView)
        holder.binding.container.setOnClickListener{ view: View ->
            Timber.d("Clicked on city %s",city.name)
            Navigation.findNavController(view).navigate(ListFragmentDirections.actionListFragmentToForecastDetailsFragment(city.id))}
    }

    // Return the size of your dataset (invoked by the layout manager)
    override fun getItemCount() = myDataset.size
}
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:android="http://schemas.android.com/apk/res/android">

    <data>
        <variable name="city" type="com.example.zach.weatherapp.data.City"/>
    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
       android:orientation="horizontal"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:id="@+id/container">

        <TextView
                tools:text="Caen"
                android:text="@{city.name}"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" android:id="@+id/city_name_textview"
                app:layout_constraintStart_toStartOf="parent" android:layout_marginStart="16dp"
                android:layout_marginTop="16dp" app:layout_constraintTop_toTopOf="parent"
                android:fontFamily="@font/roboto_light" android:textSize="22sp" android:textStyle="bold"
                android:maxLines="1" android:ellipsize="end"/>
        <TextView
                tools:text="Sunny"
                android:text="@{city.weather[0].description}"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/city_forecast_textview" app:layout_constraintStart_toStartOf="parent"
                android:layout_marginStart="16dp"
                app:layout_constraintTop_toBottomOf="@+id/city_name_textview" android:fontFamily="@font/roboto_light"
                android:layout_marginBottom="16dp" app:layout_constraintBottom_toBottomOf="parent"/>
        <ImageView
                android:layout_width="48dp"
                android:layout_height="48dp" app:srcCompat="@drawable/sunny"
                android:id="@+id/forceast_imageView" android:layout_marginTop="8dp"
                app:layout_constraintTop_toTopOf="parent" android:layout_marginBottom="8dp"
                app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintVertical_bias="0.562"
                android:layout_marginEnd="32dp" app:layout_constraintEnd_toStartOf="@+id/temperatures_layout"/>
        <LinearLayout
                android:orientation="vertical"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" android:id="@+id/temperatures_layout"
                app:layout_constraintEnd_toEndOf="parent" android:layout_marginEnd="16dp" android:layout_marginBottom="8dp"
                app:layout_constraintBottom_toBottomOf="parent" android:layout_marginTop="8dp"
                app:layout_constraintTop_toTopOf="parent">
            <TextView
                    tools:text="15°"
                    android:text="@{city.main.temp_max}"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content" android:id="@+id/max_temperature_textview"
                    android:fontFamily="@font/roboto_light"
                    tools:layout_editor_absoluteY="17dp" tools:layout_editor_absoluteX="313dp"/>
            <TextView
                    tools:text="9°"
                    android:text="@{city.main.temp_min}"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:id="@+id/min_temperature_textview"
                    android:fontFamily="@font/roboto_light" tools:layout_editor_absoluteY="45dp"
                    tools:layout_editor_absoluteX="321dp" android:layout_gravity="right"/>
        </LinearLayout>
    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

这可能只是一个Android Studio错误,因为xml文件看起来很好。

更新:错误似乎来自XML。我删除了xml布局中的android:text=“@{city.xxx}”,而是在ViewHolder绑定方法中手动更新了textViews,如下所示:

fun bind(boundCity: City){
        with(binding){
            cityNameTextview.text = boundCity.name
            cityForecastTextview.text = boundCity.weather[0].description
            maxTemperatureTextview.text = "${boundCity.main.temp_max}°"
            minTemperatureTextview.text = "${boundCity.main.temp_min}°"

            Glide.with(root.context)
                .load("http://openweathermap.org/img/w/${boundCity.weather[0].icon}.png")
                .into(forceastImageView)

            container.setOnClickListener{ view: View ->
                Timber.d("Clicked on city %s",boundCity.name)
                Navigation.findNavController(view).navigate(ListFragmentDirections.actionListFragmentToForecastDetailsFragment(boundCity.id))}
        }
    }

我再也不知道这个错误了。每当我在textviews中添加android:text=“@{city.xx}”并在bind方法中绑定city变量时,就会出现错误。我还是不知道为什么...

共有1个答案

饶德元
2023-03-14

我相信这对你应该是有用的;

class ForecastAdapter(private var myDataset: List<City>) : RecyclerView.Adapter<ForecastAdapter.ForecastViewHolder>() {

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ForecastAdapter.ForecastViewHolder {
    val itemBinding = CityListItemBinding.inflate(LayoutInflater.from(parent.context), parent, false)
    return ForecastViewHolder(itemBinding)
}

override fun onBindViewHolder(holder: ForecastViewHolder, position: Int) {
    val city = myDataset[position]
    holder.bind(city)
}

override fun getItemCount() = myDataset.size

inner class ForecastViewHolder(var binding: CityListItemBinding) : RecyclerView.ViewHolder(binding.root){

    fun bind(boundCity: City){
        with(binding) {
        city = boundCity
        Glide.with(root.context)
                .load("http://openweathermap.org/img/w/${city.weather[0].icon}.png")
                .into(forceastImageView)

        container.setOnClickListener { view ->
            Timber.d("Clicked on city %s", city.name)
            Navigation.findNavController(view).navigate(ListFragmentDirections.actionListFragmentToForecastDetailsFragment(city.id))
        }
    }
}
 类似资料:
  • 迁移到androidx后 我在编译时遇到问题 错误:找不到符号androidx。数据绑定。数据绑定组件 符号:类DataBindingComponent位置:包androidx。数据绑定 im使用的Gradle版本为5.4.1 注:androidx中的其他组件。数据绑定包工作正常。像DataBindingUtil 只有DataBindingComponent不工作

  • 我正在开始使用特性。我正面临这方面的问题。

  • 首先,我需要承认这里有一个明显非常相似但不重复的问题。在该线程中提出的解决方案都不起作用。 我的应用程序文件结构如下: 我的应用程序包含 在文本中,错误有不同的和 如果我将datamodel.java从Models包中移出并直接放入[mydomain].[myapplication],那么我会得到不同的结果。它确实在仿真程序中构建和运行,但大部分布局信息没有出现。左上角没有汉堡包菜单,页眉没有标题

  • 问题内容: 我尝试重新安装和重建npm,但是问题仍然存在。 最初,问题出在模块上:我没有该软件包,因此我使用此命令进行了安装。 它显示了以下错误: 问题答案: 尝试删除您的node_modules文件夹,然后再次运行npm install。 那应该解决它。

  • 本文向大家介绍Android RecyclerView适配器中的数据绑定,包括了Android RecyclerView适配器中的数据绑定的使用技巧和注意事项,需要的朋友参考一下 示例 也可以在RecyclerView适配器中使用数据绑定。 资料模型 XML布局 转接器类别            

  • 我在我的应用程序中使用了光标适配器。适配器绑定到一个。listview显示正确。在我的适配器视图中,我有两个文本视图和一个图像视图。在图像视图上,我添加了。listview显示正常。但是,当我单击列表中任何索引的图像视图时,它不是获取该索引的数据,而是获取其他索引的数据。 例如,如果我在listview的项目2中单击imageview(列表中的项目位置将为1),则它不是从光标获取该位置的数据,而是