簡體   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