如何将项目添加到回收视图中 Kotlin

问题描述 投票:0回答:1
package com.example.mytodolist

import android.content.Intent
import android.os.Bundle
import android.util.Log
import android.view.View
import android.widget.Button
import android.widget.EditText
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.FragmentActivity
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.google.android.gms.tasks.OnCompleteListener
import com.google.firebase.firestore.FirebaseFirestore
import com.google.firebase.firestore.QuerySnapshot


class MainActivity : AppCompatActivity() {

    lateinit var storeTextView: EditText
    lateinit var itemTextView: EditText
    lateinit var buttonSave: Button

    lateinit var recyclerView: RecyclerView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val db = FirebaseFirestore.getInstance()

        val shoppingItems = mutableListOf<Item>()

        db.collection("items")
            .addSnapshotListener { snapshot, e ->
                if (snapshot != null) {
                    shoppingItems.clear()
                    for (document in snapshot.documents) {
                        val newItem = document.toObject(Item::class.java)
                        if (newItem != null) {
                            newItem.id = document.id
                            shoppingItems.add(newItem)
                        }
                    }
                    recyclerView.adapter?.notifyDataSetChanged()
                } else {
                    Log.w(
                        "hej",
                        "Error getting documents."
                    )
                }
            }



        recyclerView = findViewById<RecyclerView>(R.id.studentList)
        recyclerView.layoutManager = LinearLayoutManager(this)
        recyclerView.adapter = ItemRecyclerAdapter(this, shoppingItems)

        val fab = findViewById<View>(R.id.floatingActionButton)
        fab.setOnClickListener { view ->
            val intent = Intent(this, ChooseItem::class.java)
            startActivity(intent)

        }

    }

    override fun onResume() {
        super.onResume()
        recyclerView.adapter?.notifyDataSetChanged()
    }


}

适配器

package com.example.mytodolist

import android.content.Context
import android.content.Intent
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageButton
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.snackbar.Snackbar
import com.google.firebase.firestore.FirebaseFirestore

class ItemRecyclerAdapter(private val context: Context, private val items: List<Item>) :
    RecyclerView.Adapter<ItemRecyclerAdapter.ViewHolder>() {
    private val layoutInflator = LayoutInflater.from(context)


    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val itemView = layoutInflator.inflate(R.layout.student_list_view, parent, false)
        return ViewHolder(itemView)
    }

    override fun getItemCount() = items.size

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val getItem = items[position]
        holder.itemName.text = getItem.store
        holder.textstoreName.text = getItem.item
        holder.itemPosition = position

    }

    fun removeItem(position: Int) {

        val db = FirebaseFirestore.getInstance()

        val item = items[position]
        val docId = item.id
        if(docId != null){
            db.collection("items").document(docId).delete()
        }
    }

    inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val itemName = itemView.findViewById<TextView>(R.id.item_name)
        val textstoreName = itemView.findViewById<TextView>(R.id.text_storeName)
        val delete = itemView.findViewById<ImageButton>(R.id.delete)
        var itemPosition = 0

        init {

            // Denna gör så att om du klickar på på en recyclerview field kommer du till en annan.

            itemView.setOnClickListener {
                val intent = Intent(context, ChooseItem::class.java)
                context.startActivity(intent)

            }
            delete.setOnClickListener { view ->
                removeItem(itemPosition)
                Snackbar.make(view, "Item Removed", Snackbar.LENGTH_SHORT).show()
            }

        }
    }
}

数据结构

package com.example.mytodolist

data class Item(var store : String? = null,
                var item : String? = null,
                var id : String? = null
)

选择项目

package com.example.mytodolist

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import com.google.firebase.firestore.FirebaseFirestore
import kotlinx.android.synthetic.main.activity_choose_item.*

class ChooseItem : AppCompatActivity() {

    lateinit var  storeTextView : EditText
    lateinit var itemTextView : EditText



    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_choose_item)

        storeTextView = findViewById(R.id.edit_store)
        itemTextView = findViewById(R.id.edit_item)

        val saveButton = findViewById<Button>(R.id.save_to_list)

        save_to_list.setOnClickListener { view ->
            addNewItem()
        }

    }
    private fun addNewItem() {

        val db = FirebaseFirestore.getInstance()


        val getStore = storeTextView.text.toString()
        val insertItem = itemTextView.text.toString()

        val item = Item(getStore, insertItem)
        db.collection("items").add(item)
        DataManager.items.add(item)
        finish()
    }

}

xml文件

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/item_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="20dp"
        android:layout_marginTop="16dp"
        android:layout_marginBottom="16dp"
        android:text="TextView"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.0" />

    <TextView
        android:id="@+id/text_storeName"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:layout_marginEnd="59dp"
        android:text="TextView"
        app:layout_constraintEnd_toStartOf="@+id/delete"
        app:layout_constraintTop_toTopOf="parent" />

    <ImageButton
        android:id="@+id/delete"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="4dp"
        android:layout_marginEnd="20dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:srcCompat="@drawable/ic_delete" />
</androidx.constraintlayout.widget.ConstraintLayout>

`````````````````````````````````````````````````````````

* 我已经用Kotlin创建了一个recyclerview,你可以添加一个项目,然后按ADD按钮,这些项目就会被添加到recyclerview:n中。但我曾试过在同一回收视图中使用clicklistener来添加更多的项目,但我没有找到任何好的解决方案欧互联网?

怎么可能让它工作呢?*

android kotlin android-recyclerview android-button
1个回答
0
投票

在你的适配器类中写一个方法。

   public fun updateItems(var newItems: List<Item>){
      this.items.clear()
      this.item.addAll(newItems)
   }

在你的适配器类中写一个方法:然后在你的 MainActivity onResume 方法,从数据库中获取最新的项目,然后调用你的适配器类方法来更新RecyclerView中的项目,就像这样。

recyclerView.adapter?.updateItems(newItems) / 传递从数据库中获取的新项目。

override fun onResume() {
        super.onResume()
        // Fetch newItems from database
        recyclerView.adapter?.updateItems(newItems)
        recyclerView.adapter?.notifyDataSetChanged()
    }
© www.soinside.com 2019 - 2024. All rights reserved.