如何从另一个片段内部动态地将数据填充到回收器视图中?
How can I populate data into recycler view dynamically from inside of another fragment?
我对 android 开发还很陌生。
因此,我尝试通过将数据附加到现有数据列表中,通过另一个片段将数据添加到 recyclerview 中。我尝试在单击保存按钮时将数据添加到列表中,并将更改通知适配器。但它不起作用需要帮助。
dataSource.kt
class dataSource {
var dataList = mutableListOf<RVData>(
RVData("Jhon","An Accountant"),
RVData("Alex","Doctor"),
RVData("Jhon","An Accountant"),
RVData("Alex","Doctor"),
RVData("Jhon","An Accountant"),
RVData("Alex","Doctor"),
)
fun loadData():List<RVData>{
return dataList
}
}
FirstFragment.kt
class FirstFragment : Fragment() {
val data = dataSource().loadData()
val adapter = RVAdapter(data)
lateinit var navController:NavController
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_first, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val rView = view.findViewById<RecyclerView>(R.id.recyclerView)
rView.adapter = adapter
rView.layoutManager = LinearLayoutManager(activity)
val addBtn = view.findViewById<Button>(R.id.materialButton)
addBtn.setOnClickListener{
toNextScreen(view)
}
}
fun toNextScreen(view:View){
navController = Navigation.findNavController(view)
navController.navigate(R.id.action_firstFragment_to_secondFragment)
}
}class FirstFragment : Fragment() {
val data = dataSource().loadData()
val adapter = RVAdapter(data)
lateinit var navController:NavController
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_first, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val rView = view.findViewById<RecyclerView>(R.id.recyclerView)
rView.adapter = adapter
rView.layoutManager = LinearLayoutManager(activity)
val addBtn = view.findViewById<Button>(R.id.materialButton)
addBtn.setOnClickListener{
toNextScreen(view)
}
}
fun toNextScreen(view:View){
navController = Navigation.findNavController(view)
navController.navigate(R.id.action_firstFragment_to_secondFragment)
}
}
RVAdapter.kt
class RVAdapter (
var listItems:List<RVData>
):RecyclerView.Adapter<RVAdapter.RecyclerViewHolder>(){
inner class RecyclerViewHolder(itemView: View):RecyclerView.ViewHolder(itemView){
val itemName = itemView.findViewById<TextView>(R.id.tvName)
val itemDesc = itemView.findViewById<TextView>(R.id.tvDesc)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.recycler_view_item,parent,false)
return RecyclerViewHolder(view)
}
override fun onBindViewHolder(holder: RecyclerViewHolder, position: Int) {
val dataItem = listItems[position]
holder.apply{
itemName.text = dataItem.name
itemDesc.text = dataItem.description
}
}
override fun getItemCount(): Int {
return listItems.size
}
}
SecondFragment.kt
class SecondFragment : Fragment() {
lateinit var navController: NavController
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
val view = inflater.inflate(R.layout.fragment_second, container, false)
val name = view.findViewById<EditText>(R.id.editText1)
val desc = view.findViewById<EditText>(R.id.editText2)
val btn = view.findViewById<Button>(R.id.materialButton2)
btn.setOnClickListener{
dataSource().dataList.add(
RVData(name.text.toString(),desc.text.toString())
)
FirstFragment().adapter.notifyDataSetChanged()
toNextScreen(view)
}
return view
}
fun toNextScreen(view:View){
navController = Navigation.findNavController(view)
navController.navigate(R.id.action_secondFragment_to_firstFragment)
}
}
btn.setOnClickListener{
dataSource().dataList.add(
RVData(name.text.toString(),desc.text.toString())
)
FirstFragment().adapter.list = dataSource().dataList; //or something like that.
FirstFragment().adapter.notifyDataSetChanged()
toNextScreen(view)
}
您需要更新适配器内部列表,然后 notifyDataSetChanged()
将 dataList 放入伴随对象内的数据源模型中
class dataSource {
companion object{
var dataList = mutableListOf<RVData>(
RVData("Jhon","An Accountant"),
RVData("Alex","Doctor"),
RVData("Jhon","An Accountant"),
RVData("Alex","Doctor"),
RVData("Jhon","An Accountant"),
RVData("Alex","Doctor"),
)
}
fun loadData():List<RVData>{
return dataList
}
}
在第二个片段中
dataSource.dataList.add(
RVData(name.text.toString(),desc.text.toString())
)
从第二个片段中删除此行
FirstFragment().adapter.notifyDataSetChanged()
我对 android 开发还很陌生。 因此,我尝试通过将数据附加到现有数据列表中,通过另一个片段将数据添加到 recyclerview 中。我尝试在单击保存按钮时将数据添加到列表中,并将更改通知适配器。但它不起作用需要帮助。
dataSource.kt
class dataSource {
var dataList = mutableListOf<RVData>(
RVData("Jhon","An Accountant"),
RVData("Alex","Doctor"),
RVData("Jhon","An Accountant"),
RVData("Alex","Doctor"),
RVData("Jhon","An Accountant"),
RVData("Alex","Doctor"),
)
fun loadData():List<RVData>{
return dataList
}
}
FirstFragment.kt
class FirstFragment : Fragment() {
val data = dataSource().loadData()
val adapter = RVAdapter(data)
lateinit var navController:NavController
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_first, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val rView = view.findViewById<RecyclerView>(R.id.recyclerView)
rView.adapter = adapter
rView.layoutManager = LinearLayoutManager(activity)
val addBtn = view.findViewById<Button>(R.id.materialButton)
addBtn.setOnClickListener{
toNextScreen(view)
}
}
fun toNextScreen(view:View){
navController = Navigation.findNavController(view)
navController.navigate(R.id.action_firstFragment_to_secondFragment)
}
}class FirstFragment : Fragment() {
val data = dataSource().loadData()
val adapter = RVAdapter(data)
lateinit var navController:NavController
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_first, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val rView = view.findViewById<RecyclerView>(R.id.recyclerView)
rView.adapter = adapter
rView.layoutManager = LinearLayoutManager(activity)
val addBtn = view.findViewById<Button>(R.id.materialButton)
addBtn.setOnClickListener{
toNextScreen(view)
}
}
fun toNextScreen(view:View){
navController = Navigation.findNavController(view)
navController.navigate(R.id.action_firstFragment_to_secondFragment)
}
}
RVAdapter.kt
class RVAdapter (
var listItems:List<RVData>
):RecyclerView.Adapter<RVAdapter.RecyclerViewHolder>(){
inner class RecyclerViewHolder(itemView: View):RecyclerView.ViewHolder(itemView){
val itemName = itemView.findViewById<TextView>(R.id.tvName)
val itemDesc = itemView.findViewById<TextView>(R.id.tvDesc)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.recycler_view_item,parent,false)
return RecyclerViewHolder(view)
}
override fun onBindViewHolder(holder: RecyclerViewHolder, position: Int) {
val dataItem = listItems[position]
holder.apply{
itemName.text = dataItem.name
itemDesc.text = dataItem.description
}
}
override fun getItemCount(): Int {
return listItems.size
}
}
SecondFragment.kt
class SecondFragment : Fragment() {
lateinit var navController: NavController
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
val view = inflater.inflate(R.layout.fragment_second, container, false)
val name = view.findViewById<EditText>(R.id.editText1)
val desc = view.findViewById<EditText>(R.id.editText2)
val btn = view.findViewById<Button>(R.id.materialButton2)
btn.setOnClickListener{
dataSource().dataList.add(
RVData(name.text.toString(),desc.text.toString())
)
FirstFragment().adapter.notifyDataSetChanged()
toNextScreen(view)
}
return view
}
fun toNextScreen(view:View){
navController = Navigation.findNavController(view)
navController.navigate(R.id.action_secondFragment_to_firstFragment)
}
}
btn.setOnClickListener{
dataSource().dataList.add(
RVData(name.text.toString(),desc.text.toString())
)
FirstFragment().adapter.list = dataSource().dataList; //or something like that.
FirstFragment().adapter.notifyDataSetChanged()
toNextScreen(view)
}
您需要更新适配器内部列表,然后 notifyDataSetChanged()
将 dataList 放入伴随对象内的数据源模型中
class dataSource {
companion object{
var dataList = mutableListOf<RVData>(
RVData("Jhon","An Accountant"),
RVData("Alex","Doctor"),
RVData("Jhon","An Accountant"),
RVData("Alex","Doctor"),
RVData("Jhon","An Accountant"),
RVData("Alex","Doctor"),
)
}
fun loadData():List<RVData>{
return dataList
}
}
在第二个片段中
dataSource.dataList.add(
RVData(name.text.toString(),desc.text.toString())
)
从第二个片段中删除此行
FirstFragment().adapter.notifyDataSetChanged()