Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/185.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.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 正在尝试更改另一个片段上的textview_Android_Kotlin_Android Fragments_Android Recyclerview - Fatal编程技术网

Android 正在尝试更改另一个片段上的textview

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

所以我有两个片段,我正在尝试将一些文本视图的值从一个片段中的RecyclerView更改为另一个片段。recycler视图从json文件读取数据,我试图根据recycler视图的值设置TextView,但当我在recyclerView的onClick方法中设置代码以更改文本时,我的应用程序无法运行

这是代码


    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)