简体   繁体   English

如何在 Kotlin 中的片段 android studio 中实现动态列表视图

[英]How to implement a dynamic list view inside fragment android studio in Kotlin

I have two fragments that share information with each other, in the first one I have an edit text and button widget.我有两个相互共享信息的片段,在第一个片段中我有一个编辑文本和按钮小部件。 The second fragment is just a listview.第二个片段只是一个列表视图。 When the user clicks the button, it displays whatever is in the edit text widget in the second fragment.当用户单击该按钮时,它会在第二个片段中显示编辑文本小部件中的任何内容。 So if the user enters the text study and clicks the button the second fragment will display因此,如果用户进入文本研究并单击按钮,第二个片段将显示

Study学习

If the user then enters the text eat and clicks the button, the second fragment will display Study Eat如果用户然后输入文本 eat 并单击按钮,第二个片段将显示 Study Eat

I am having so issues with displaying the texts我在显示文本时遇到了很多问题

So far this is what I have done到目前为止,这就是我所做的

class FirstFragment : Fragment() {

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                              savedInstanceState: Bundle?): View? {
        viewModel = activity?.run { ViewModelProvider(this)[MyViewModel::class.java]
        } ?: throw Exception("Invalid Activity")

        val view = inflater.inflate(R.layout.one_fragment, container, false)

        val button = view.findViewById<Button>(R.id.vbutton)
        val value = view.findViewById<EditText>(R.id.textView)
        


        button.setOnClickListener {





        }



        return view;
    }
}
class SecondFragment : Fragment() {

    lateinit var viewModel: MyViewModel

    @SuppressLint("MissingInflatedId")
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                              savedInstanceState: Bundle?): View? {
        viewModel = activity?.run { ViewModelProvider(this)[MyViewModel::class.java]
        } ?: throw Exception("Invalid Activity")

        val view = inflater.inflate(R.layout.page3_fragment, container, false)
        val valueView = v.findViewById<TextView>(R.id.textView)
return view


The problem I am having is how to display the texts我遇到的问题是如何显示文本

If I undestand you correctly, you want to share data between fragments?如果我没理解错的话,你想在片段之间共享数据? If yes, you can do that with "shared" viewModel.如果是,您可以使用“共享”viewModel 来做到这一点。 For example:例如:

class FirstFragment : Fragment() {
    private var _binding: FragmentFirstBinding? = null
    private val binding get() = _binding!!
    private val sharedViewModel by activityViewModels<SharedViewModel>()

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        _binding = FragmentFirstBinding.inflate(inflater, container, false)

        binding.buttonChangeFragment.setOnClickListener {
        /*
        You can change data here, or in navigateWithNavController() from 
        activity (You already have an instance of your viewModel in activity)
        */
            sharedViewModel.changeData(binding.myEditText.text.toString())
            if (requireActivity() is YourActivity)
                (requireActivity() as YourActivity).navigateWithNavController()
        }

        return binding.root
    }
}


class SecondFragment : Fragment() {
    private var _binding: FragmentSecondBinding? = null
    private val binding get() = _binding!!
    private val sharedViewModel by activityViewModels<SharedViewModel>()

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        _binding = FragmentSecondBinding.inflate(inflater, container, false)

        binding.secondFragmentText.text = sharedViewModel.someData.value

        return binding.root
    }
}

and your activity:和你的活动:

class YourActivity: AppCompatActivity() {
    private lateinit var binding: YourActivityBinding
    private lateinit var appBarConfiguration: AppBarConfiguration
    private val sharedViewModel: SharedViewModel by lazy {
        ViewModelProvider(
            this
        )[SharedViewModel::class.java]
    }
    private lateinit var navController: NavController

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = YourActivityBinding.inflate(LayoutInflater.from(this))
        setContentView(binding.root)

        navController = this.findNavController(R.id.nav_host_fragment)
        appBarConfiguration = AppBarConfiguration(navController.graph)
    }

    /*
    This function is just for test
    */
    fun navigateWithNavController() {
        navController.navigate(R.id.secondFragment)
    }

    override fun onSupportNavigateUp(): Boolean {
        return NavigationUI.navigateUp(navController, appBarConfiguration)
    }
}

And your viewModel should look something like this:你的 viewModel 应该看起来像这样:

class SharedViewModel : ViewModel() {
    private val _someData = MutableLiveData("")
    val someData: LiveData<String>
        get() = _someData

    fun changeData(newData: String?) {
        _someData.value = newData ?: _someData.value
    }
}

Your view model should have a backing list of the entered words.您的视图 model 应该有输入单词的后备列表。 When a word is added, the list can be updated, and in turn you can update a LiveData that publishes the latest version of the list.添加单词时,可以更新列表,然后您可以更新发布最新版本列表的 LiveData。

class MyViewModel: ViewModel() {
    private val backingEntryList = mutableListOf<String>()

    private val _entryListLiveData = MutableLiveData("")
    val entryListLiveData : LiveData<String> get() = _entryListLiveData 

    fun addEntry(word: String) {
        backingEntryList += word
        _entryListLiveData.value = backingEntryList.toList() // use toList() to to get a safe copy
    }
}

Your way of creating the shared view model is the hard way.您创建共享视图 model 的方法很困难。 The easy way is by using by activityViewModels() .简单的方法是使用by activityViewModels()

I also suggest using the Fragment constructor that takes a layout argument, and then setting things up in onViewCreated instead of onCreateView .我还建议使用带有布局参数的 Fragment 构造函数,然后在onViewCreated而不是onCreateView中进行设置。 It's less boilerplate code to accomplish the same thing.完成同一件事的样板代码更少。

In the first fragment, you can add words when the button's clicked:在第一个片段中,您可以在单击按钮时添加单词:

class FirstFragment : Fragment(R.layout.one_fragment) {
    private val viewModel by activityViewModels<MyViewModel>()

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        val button = view.findViewById<Button>(R.id.vbutton)
        val value = view.findViewById<EditText>(R.id.textView)

        button.setOnClickListener {
            viewModel.addEntry(value.text.toString())
        }
    }
}

In the second fragment, you observe the live data:在第二个片段中,您观察实时数据:

class SecondFragment : Fragment(R.layout.page3_fragment) {
    private val viewModel by activityViewModels<MyViewModel>()

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        val valueView = view.findViewById<TextView>(R.id.textView)
        viewModel.entryListLiveData.observe(viewLifecycleOwner) { entryList ->
            valueView.text = entryList.joinToString(" ")
        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何在片段 android studio Kotlin 中实现列表视图 - How to implement list view inside fragment android studio Kotlin 如何在片段中实现动态列表? - How to implement a dynamic list in a fragment? 如何在Kotlin中实现View Pager相同片段? - How to implement View Pager same Fragment in Kotlin? 如何从片段视图内部实现Android Spinner - How to implement Android Spinner from inside a Fragment view 如何在 kotlin 中显示片段内的网格视图? - How to display grid view inside fragment in kotlin? Android Studio 如何为片段内的视图设置约束 - Android Studio how to set constraints for a view inside a fragment Android studio 如何使用片段在 Kotlin 中打开日期选择器 - Android studio how to open datepicker in Kotlin with Fragment 如何在Android Studio中使用Inflater从片段获取列表视图 - How to Using inflater to get a list view from fragment in Android Studio 如何在Android中在其中添加动态标签和动态扩展列表视图? - How to add dynamic tabs and dynamic expandable list view inside it in Android? 片段中的Android Studio列表视图不显示 - Android Studio List View in Fragment Not Display
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM