Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/197.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Kotlin。使用片段将数据绑定到recyclerview的问题_Android_Android Fragments_Android Recyclerview_Kotlin_Android Databinding - Fatal编程技术网

Android Kotlin。使用片段将数据绑定到recyclerview的问题

Android Kotlin。使用片段将数据绑定到recyclerview的问题,android,android-fragments,android-recyclerview,kotlin,android-databinding,Android,Android Fragments,Android Recyclerview,Kotlin,Android Databinding,我正在尝试学习如何在Android应用程序中实现数据绑定。我有一个小应用程序,我正在学习这一点。而当我为部分应用程序进行数据绑定时。我在尝试实现recyclerview时遇到了一个小问题。我就是不明白。我已经努力了两三天,而且很沮丧。我想问问你们 这个应用程序在这一点上非常简单 我一直关注的部分是从MainFragment.kt的.xml布局访问我的recyclerview 起初,我试图使用绑定,但感到沮丧,于是又回到了仅仅尝试使用findviewbyd,但这也给了我一个问题。我开始想,我对数据

我正在尝试学习如何在Android应用程序中实现数据绑定。我有一个小应用程序,我正在学习这一点。而当我为部分应用程序进行数据绑定时。我在尝试实现recyclerview时遇到了一个小问题。我就是不明白。我已经努力了两三天,而且很沮丧。我想问问你们

这个应用程序在这一点上非常简单

我一直关注的部分是从MainFragment.kt的.xml布局访问我的recyclerview

起初,我试图使用绑定,但感到沮丧,于是又回到了仅仅尝试使用findviewbyd,但这也给了我一个问题。我开始想,我对数据绑定的把握并不像我想象的那样坚定

这来自保存recyclerView的片段:

fragment_main.xml

<androidx.recyclerview.widget.RecyclerView
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:layout_marginTop="8dp"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            android:layout_marginStart="8dp"
            android:layout_marginBottom="8dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            android:layout_marginEnd="8dp"
            android:id="@+id/job_recyclerView"/>
适配器:

JobAdapter.kt

data class JobData(val companyName: String, val location: String)
class CustomAdapter(val userList: ArrayList<JobData>) : RecyclerView.Adapter<CustomAdapter.ViewHolder>() {

//Returning view for each item in the list
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CustomAdapter.ViewHolder {
    val v = LayoutInflater.from(parent.context).inflate(R.layout.job_item_layout, parent, false)
    return ViewHolder(v)
}

//Binding the data on the list
override fun onBindViewHolder(holder: CustomAdapter.ViewHolder, position: Int) {
    holder.bindItems(userList[position])
}

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

//Class holds the job list view
class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

    fun bindItems(job: JobData) {
        val textViewName = itemView.findViewById(R.id.tv_company_name) as TextView
        val textViewAddress  = itemView.findViewById(R.id.tv_Location) as TextView
        textViewName.text = job.companyName
        textViewAddress.text = job.location
    }
}
}
class MainActivity : AppCompatActivity() {

//private lateinit var binding: ActivityMainBinding

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    @Suppress("UNUSED_VARIABLE")
    val binding = DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)
}

//Ensures back button works as it should
override fun onSupportNavigateUp() = findNavController(this, R.id.navHostFragment).navigateUp()
}

从片段中查找DViewById是错误的(这是一种很好的活动技术):

首先,片段的布局必须由onCreateView()方法返回

我个人喜欢在onViewCreated()中执行fragment的所有业务逻辑


可以通过使用根视图(如:
getView())从片段的布局访问RecylerView!!。findViewById
或kotlinx inside onViewCreated():
job\u recyclerView

好的,因此首先您在
findViewById
上遇到错误,因为您的片段不知道包含
recyclerView

您应该做的是,取一个为这个片段充气的视图实例(将视图声明为全局变量,用这个替换充气器行)

现在将,
findViewById()
替换为
rootView.findViewById()

另一个错误是因为片段没有自己的上下文,所以将
这个
替换为
活动

通过编写
活动
您正在调用
getActivity()
方法,该方法返回父活动的上下文

将xml封装在
中。

然后,您可以通过
binding.jobRecyclerview


尝试在片段的
onViewCreated
上设置所有单击侦听器等,而不是
onCreateView
,以使
findViewById()
LinearLayout
构造函数工作使用。为了解决数据绑定的问题,请确保您在
app/build.gradle
kapt”com.android中有
apply插件:'kotlin kapt'
。对不起,我忘了显示或提到我的依赖项。都准备好了。我将编辑主帖子,以显示该信息。如果绑定无法正常工作,我会考虑使用Fragment#getContext()。你已经解决了这个问题吗?现在还没有。
$gradle_version
的价值是什么?我遵循了你的建议,它确实解决了编译器错误,应用程序现在正在运行。RecyclerView没有按应有的方式填充。我根本没有出现。我想这就是那个充气机的名字。但我只有一点点时间去做。我整天都在移民局处理签证问题。我将在今天下午和今晚做更多的工作。你的例子就是我希望如何做到这一点。这是我前几天尝试的方法之一。但由于我现在还不能理解的原因,它不起作用。我的.xml文件包含在。。并且刚刚将lateinit添加到FragmentMainBinding。但是调用binding.job\u recyclerView是失败的地方。job_recyclerView仍然未解决?这就是我对binding.binding.jobRecyclerview感到困惑的地方。它应该是这样的,它不是自动填充的吗?如果不是自动填充贪婪的话,我会选择一个清理/重建项目。我已经清理/重建了这个项目,甚至重新启动了Android Studio。它不喜欢它。你能编辑并发布所有的xml吗?我有种感觉,它会像一个名字错了一样愚蠢。对不起,对不起。我用胖手指摸的。现在正在查看binding.jobRecyclerView。对不起,我对您的格式感到困惑?似乎你建议同时使用“onCreateView”和“onViewCreated”,或者我读错了吗?同意koliczyna的观点,
onViewCreated()
应该处理业务逻辑,而不是
onCreateView()
,这应该只是为了增加成本layout@CB如果你是对的,我建议两者都用。
class MainActivity : AppCompatActivity() {

//private lateinit var binding: ActivityMainBinding

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    @Suppress("UNUSED_VARIABLE")
    val binding = DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)
}

//Ensures back button works as it should
override fun onSupportNavigateUp() = findNavController(this, R.id.navHostFragment).navigateUp()
}
android {
compileSdkVersion 28
dataBinding {
    enabled = true
}
...
}

kapt {
generateStubs = true
correctErrorTypes = true
}

dependencies {
...
kapt "com.android.databinding:compiler:$gradle_version"

...
}
val recyclerView = findViewById(R.id.job_recyclerView) as RecyclerView
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
  return inflater.inflate(R.layout.fragment_main, container, false)
}
override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    //Now, we can use views by kotlinx
    //val recyclerView = job_recyclerView
    //Or old-fashioned way
    val recyclerView = getView()!!.findViewById(R.id.job_recyclerView) as RecyclerView
}
var rootView

// Inside onCreateView
var rootView = inflater?.inflate(R.layout.fragment, container, false) 
private lateinit var binding: FragmentXXXBinding

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        binding = FragmentXXXBinding.inflate(inflater)
        return binding.root
    }