Android Kotlin。使用片段将数据绑定到recyclerview的问题
我正在尝试学习如何在Android应用程序中实现数据绑定。我有一个小应用程序,我正在学习这一点。而当我为部分应用程序进行数据绑定时。我在尝试实现recyclerview时遇到了一个小问题。我就是不明白。我已经努力了两三天,而且很沮丧。我想问问你们 这个应用程序在这一点上非常简单 我一直关注的部分是从MainFragment.kt的.xml布局访问我的recyclerview 起初,我试图使用绑定,但感到沮丧,于是又回到了仅仅尝试使用findviewbyd,但这也给了我一个问题。我开始想,我对数据绑定的把握并不像我想象的那样坚定 这来自保存recyclerView的片段: fragment_main.xmlAndroid 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,但这也给了我一个问题。我开始想,我对数据
<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
}