繁体   English   中英

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

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

我有两个相互共享信息的片段,在第一个片段中我有一个编辑文本和按钮小部件。 第二个片段只是一个列表视图。 当用户单击该按钮时,它会在第二个片段中显示编辑文本小部件中的任何内容。 因此,如果用户进入文本研究并单击按钮,第二个片段将显示

学习

如果用户然后输入文本 eat 并单击按钮,第二个片段将显示 Study Eat

我在显示文本时遇到了很多问题

到目前为止,这就是我所做的

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


我遇到的问题是如何显示文本

如果我没理解错的话,你想在片段之间共享数据? 如果是,您可以使用“共享”viewModel 来做到这一点。 例如:

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
    }
}

和你的活动:

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)
    }
}

你的 viewModel 应该看起来像这样:

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

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

您的视图 model 应该有输入单词的后备列表。 添加单词时,可以更新列表,然后您可以更新发布最新版本列表的 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
    }
}

您创建共享视图 model 的方法很困难。 简单的方法是使用by activityViewModels()

我还建议使用带有布局参数的 Fragment 构造函数,然后在onViewCreated而不是onCreateView中进行设置。 完成同一件事的样板代码更少。

在第一个片段中,您可以在单击按钮时添加单词:

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())
        }
    }
}

在第二个片段中,您观察实时数据:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM