Android 正在尝试更改另一个片段上的textview
所以我有两个片段,我正在尝试将一些文本视图的值从一个片段中的RecyclerView更改为另一个片段。recycler视图从json文件读取数据,我试图根据recycler视图的值设置TextView,但当我在recyclerView的onClick方法中设置代码以更改文本时,我的应用程序无法运行 这是代码Android 正在尝试更改另一个片段上的textview,android,kotlin,android-fragments,android-recyclerview,Android,Kotlin,Android Fragments,Android Recyclerview,所以我有两个片段,我正在尝试将一些文本视图的值从一个片段中的RecyclerView更改为另一个片段。recycler视图从json文件读取数据,我试图根据recycler视图的值设置TextView,但当我在recyclerView的onClick方法中设置代码以更改文本时,我的应用程序无法运行 这是代码 import android.os.Bundle import android.view.* import androidx.fragment.app.Fragment impor
import android.os.Bundle
import android.view.*
import androidx.fragment.app.Fragment
import android.widget.TextView
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.observe
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.example.currencyconverter.R
class CurrenciesFragment : Fragment() {
private lateinit var viewModel: MainViewModel
private lateinit var recycler: RecyclerView
private lateinit var countryName: TextView
private lateinit var amountConverted: TextView
companion object {
fun newInstance() = CurrenciesFragment
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
setHasOptionsMenu(true)
// Inflate the layout for this fragment
val view = inflater.inflate(R.layout.fragment_currencies, container, false)
recycler = view.findViewById(R.id.recyclerView)
recycler.layoutManager = LinearLayoutManager(context)
countryName = view.findViewById(R.id.selected_country)
countryName.text = ""
amountConverted = view.findViewById(R.id.converted_amount)
amountConverted.text = ""
return view
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
viewModel = ViewModelProvider(this).get(MainViewModel::class.java)
viewModel.country.observe(viewLifecycleOwner, {
recycler.adapter = CountriesAdapter(it)
})
}
private inner class CountriesViewHolder(view: View) : RecyclerView.ViewHolder(view), View.OnClickListener {
private lateinit var phrase: Phrase
private val countryText: TextView = itemView.findViewById(R.id.country_textView)
init {
itemView.setOnClickListener(this)
}
override fun onClick(v: View?) {
countryName.text = phrase.name
}
fun bind(phrase: Phrase) {
this.phrase = phrase
countryText.text = phrase.name
}
}
private inner class CountriesAdapter(private val list: List<Phrase>) : RecyclerView.Adapter<CountriesViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CountriesViewHolder {
val view = layoutInflater.inflate(R.layout.recycler_item, parent, false)
return CountriesViewHolder(view)
}
override fun getItemCount() = list.size
override fun onBindViewHolder(holder: CountriesViewHolder, position: Int) {
holder.bind(list[position])
}
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
super.onCreateOptionsMenu(menu, inflater)
menu.clear()
}
}
导入android.os.Bundle
导入android.view*
导入androidx.fragment.app.fragment
导入android.widget.TextView
导入androidx.lifecycle.ViewModel
导入androidx.lifecycle.ViewModelProvider
导入androidx.lifecycle.observe
导入androidx.recyclerview.widget.LinearLayoutManager
导入androidx.recyclerview.widget.recyclerview
导入com.example.currencyconverter.R
类CurrenciesFragment:Fragment(){
私有lateinit变量viewModel:MainViewModel
私有lateinit var回收器:RecyclerView
私有lateinit变量countryName:TextView
私有lateinit变量amountConverted:TextView
伴星{
fun newInstance()=currencesfragment
}
覆盖创建视图(
充气器:布局充气器,容器:视图组?,
savedInstanceState:捆绑?
):查看{
设置选项菜单(真)
//为该碎片膨胀布局
val视图=充气机。充气(R.layout.fragment\u货币,容器,错误)
recycler=view.findViewById(R.id.recyclerView)
recycler.layoutManager=LinearLayoutManager(上下文)
countryName=view.findViewById(R.id.selected\u country)
countryName.text=“”
amountConverted=view.findViewById(R.id.converted\U金额)
amountConverted.text=“”
返回视图
}
覆盖活动创建的乐趣(savedInstanceState:Bundle?){
super.onActivityCreated(savedInstanceState)
viewModel=ViewModelProvider(this.get)(MainViewModel::class.java)
viewModel.country.observe(viewLifecycleOwner{
recycler.adapter=CountriesAdapter(it)
})
}
私有内部类CountriesViewHolder(视图:视图):RecyclerView.ViewHolder(视图),view.OnClickListener{
私有lateinit变量短语:短语
private val countryText:TextView=itemView.findViewById(R.id.country\u TextView)
初始化{
itemView.setOnClickListener(此)
}
覆盖有趣的onClick(v:视图?){
countryName.text=phrase.name
}
有趣的绑定(短语:短语){
这个短语
countryText.text=phrase.name
}
}
private内部类CountriesAdapter(private val list:list):RecyclerView.Adapter(){
override fun onCreateViewHolder(父级:ViewGroup,viewType:Int):CountriesViewHolder{
val view=LayoutFlater.充气(R.layout.recycler_项目,父项,false)
返回国家/地区查看文件夹(视图)
}
覆盖getItemCount()=list.size
覆盖BindViewHolder(holder:CountriesViewHolder,位置:Int){
持有者绑定(列表[位置])
}
}
覆盖创建选项菜单(菜单:菜单,充气机:菜单充气机){
super.onCreateOptions菜单(菜单,充气机)
菜单清除()
}
}
直接从RecycelerView更改textview不是一个好的做法,相反,我建议您将lambda回调放入适配器和将从片段侦听的ViewHolder中
更改适配器代码:
private inner class CountriesAdapter(private val list: List<Phrase>, private val textChanged: (text: String) -> Unit) : RecyclerView.Adapter<CountriesViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CountriesViewHolder {
val view = layoutInflater.inflate(R.layout.recycler_item, parent, false)
return CountriesViewHolder(view, textChanged)
}
在片段中添加此新方法:
private fun onTextChanged(text: String) {
// Change TextView
}
并更改构建适配器的方式,以包含lambda函数:
CountriesAdapter(it, ::onTextChanged)
这是使用RecyclerView时的常见做法
CountriesAdapter(it, ::onTextChanged)