想要将 recyclerview SQLite 数据传递给另一个片段并更新它吗?

时间:2021-07-28 05:19:30

标签: android kotlin android-fragments android-recyclerview android-sqlite

实际上,我正在尝试将我的 recyclerview SQLite 数据传递给另一个片段,在该片段中,我想更新其数据并将更新的数据返回到包含 recyclerview 的片段。

// 这是我的 recyclerview 适配器类

 package com.example.test_nav_drawer.ui.adapter

import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.example.test_nav_drawer.R
import com.example.test_nav_drawer.UserModel

class UserdbAdapter(context: Context,var usrList: ArrayList<UserModel> = ArrayList() ): RecyclerView.Adapter<UserdbAdapter.UserdbViweHolder>() {


//    private var usrList: ArrayList<UserModel> = ArrayList()

    fun addItems(items: ArrayList<UserModel>){
        this.usrList = items
        notifyDataSetChanged()
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = UserdbViweHolder(
        LayoutInflater.from(parent.context).inflate(R.layout.card_items_usr_frag1, parent, false)
    )

    override fun onBindViewHolder(holder: UserdbViweHolder, position: Int) {
        var usr = usrList[position]
        holder.bindView(usr)
    }

    override fun getItemCount(): Int {
        return usrList.size
    }


    class UserdbViweHolder(var view: View) : RecyclerView.ViewHolder(view) {
        private var id = view.findViewById<TextView>(R.id.tvID)
        private var name = view.findViewById<TextView>(R.id.tvUserName)
        private var email = view.findViewById<TextView>(R.id.tvUsrEmail)

        private var phone = view.findViewById<TextView>(R.id.tvUsrPhone)
        private var address = view.findViewById<TextView>(R.id.tvUsrAddress)
        private var btnDelete = view.findViewById<Button>(R.id.btnUsrDelete)


        fun bindView(usr: UserModel) {
            id.text = usr.id.toString()
            name.text = usr.name
            email.text = usr.email
            phone.text = usr.phone
            address.text = usr.address
        }
    }

}

// 这是我的回收站视图的片段

package com.example.test_nav_drawer

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.example.test_nav_drawer.ui.adapter.UserdbAdapter

class WorkFragment : Fragment(R.layout.fragment_work) {

    private lateinit var recyclerView_User: RecyclerView
    private lateinit var sqLiteHelper: SQLiteHelper
    private lateinit  var adapterdb: UserdbAdapter
    private lateinit var  usrList : ArrayList<UserModel>


    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {

        val v = inflater.inflate(R.layout.fragment_work, container, false)

        sqLiteHelper = SQLiteHelper(requireActivity())
        usrList = sqLiteHelper.getAllUser()
        recyclerView_User = v.findViewById(R.id.recycler_view_frag1)
        recyclerView_User.setHasFixedSize(true)
        recyclerView_User.layoutManager = LinearLayoutManager(context)
        adapterdb = UserdbAdapter(requireContext(), usrList)
        recyclerView_User.adapter = adapterdb

        return v
    }



}

// 这是我的 sqlite 助手类

package com.example.test_nav_drawer

import android.content.ContentValues
import android.content.Context
import android.database.Cursor
import android.database.sqlite.SQLiteDatabase
import android.database.sqlite.SQLiteOpenHelper
import java.lang.Exception

class SQLiteHelper(context: Context) :
    SQLiteOpenHelper(context, DATABASE_NAME, null, DATABASE_vERSION) {


    companion object {
        private const val DATABASE_vERSION = 1
        private const val DATABASE_NAME = "user.db"
        private const val TBL_USER = "tbl_user"
        private const val ID = "id"
        private const val NAME = "name"
        private const val EMAIL = "email"
        private const val PHONE = "phone"
        private const val ADDRESS = "address"

    }


    override fun onCreate(db: SQLiteDatabase?) {
        val createTblUser = ("CREATE TABLE " + TBL_USER + " ("
                + ID + " INTEGER PRIMARY KEY, " + NAME + " TEXT, "
                + EMAIL + " TEXT, " + PHONE + " TEXT, "
                + ADDRESS + " TEXT " + " )")
        db?.execSQL(createTblUser)
    }

    override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
        db!!.execSQL("DROP TABLE IF EXISTS $TBL_USER")
        onCreate(db)
    }

    fun insertUser(usr: UserModel): Long {
        val db = this.writableDatabase
        val contentValues = ContentValues()
        contentValues.put(ID, usr.id)
        contentValues.put(NAME, usr.name)

        contentValues.put(EMAIL, usr.email)
        contentValues.put(PHONE, usr.phone)
        contentValues.put(ADDRESS, usr.address)

        val success = db.insert(TBL_USER, null, contentValues)
        db.close()
        return success


    }

    fun getAllUser(): ArrayList<UserModel> {
        val usrList: ArrayList<UserModel> = ArrayList()
        val selectQuery = "SELECT * FROM $TBL_USER"
        val db = this.readableDatabase

        val cursor: Cursor?

        try {
            cursor = db.rawQuery(selectQuery, null)
        } catch (e: Exception) {
            e.printStackTrace()
            db.execSQL(selectQuery)
            return ArrayList()
        }

        var id: Int
        var name: String
        var email: String
        var phone: String
        var address: String
        if (cursor.moveToFirst()) {
            do {
                id = cursor.getInt(cursor.getColumnIndex("id"))
                name = cursor.getString(cursor.getColumnIndex("name"))
                email = cursor.getString(cursor.getColumnIndex("email"))
                phone = cursor.getString(cursor.getColumnIndex("phone"))
                address = cursor.getString(cursor.getColumnIndex("address"))

                val usr =
                    UserModel(id = id, name = name, email = email, phone = phone, address = address)
                usrList.add(usr)
            } while (cursor.moveToNext())
        }
        return usrList
    }
}

//这是我试图获取我的 receyerview 数据的地方以及我将更新数据的地方,所以这是我的更新片段

import android.os.Bundle
import android.util.Log
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.EditText
import android.widget.ProgressBar
import android.widget.Toast
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import com.example.test_nav_drawer.ui.adapter.UserdbAdapter
import kotlinx.android.synthetic.main.fragment_timeline.*

class TimelineFragment : Fragment(R.layout.fragment_timeline) {
    private lateinit var evUsername: EditText
    private lateinit var evUserEmail: EditText
    private lateinit var evUserPhone: EditText
    private lateinit var evUserAddress: EditText
    private lateinit var btnAddDetails: Button

    private lateinit var sqLiteHelper: SQLiteHelper
    private var adapterdb: UserdbAdapter? =  null

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {

        val v = inflater.inflate(R.layout.fragment_timeline, container, false)
//        val recyclerView_User = v.findViewById<RecyclerView>(R.id.recycler_view_frag1)
//        recyclerView_User.layoutManager = LinearLayoutManager(context)
//        recyclerView_User.adapter = adapterdb
        btnAddDetails = v.findViewById<Button>(R.id.btnAdd)
//        var sqLiteHelper: SQLiteHelper
        sqLiteHelper = SQLiteHelper(requireActivity())
        btnAddDetails.setOnClickListener {
            addUser()
            getAllUsersDetails()
        }


        return v
    }

    private fun getAllUsersDetails() {
        val usrList = sqLiteHelper.getAllUser()
        Log.e("Testing", "${usrList.size}")

        adapterdb?.addItems(usrList)
    }


    private fun addUser() {
        val name = etUserNameLogin.text.toString()
        val email = etUserEmailLogin.text.toString()
        val phone = etUserPhoneLogin.text.toString()
        val address = etUserAddressLogin.text.toString()

        if (name.isEmpty() || email.isEmpty() || phone.isEmpty() || address.isEmpty()) {
            Toast.makeText(context, "Please Enter Required Fields", Toast.LENGTH_SHORT).show()
            clearEditText()
        } else {
            val usr = UserModel(name = name, email = email, phone = phone, address = address)
            val status = sqLiteHelper.insertUser(usr)

            //Check insert success or not success
            if (status > -1) {
                Toast.makeText(context, "User Added...", Toast.LENGTH_SHORT).show()
                clearEditText()
            } else {
                Toast.makeText(context, "Record Not Saved", Toast.LENGTH_LONG).show()
            }
        }
    }

    private fun clearEditText() {
        etUserNameLogin.setText("")
        etUserEmailLogin.setText("")
        etUserPhoneLogin.setText("")
        etUserAddressLogin.setText("")
        etUserNameLogin.requestFocus()
    }
}

1 个答案:

答案 0 :(得分:0)

嗯,有不同的方法可以实现这一点。 我将告诉你我是如何做到这一点的。

  1. 创建一个新文件,接口,说“OnDataClickListener”
  2. 你的代码应该是这样的。
interface OnDataClickListener {
    fun onItemClick(Item: UserModel)
}
  1. 现在让我们转到您的 recyclerView 适配器文件。
  2. 向回收器视图类添加参数。
class RecyclerViewAdapter(private val clickListener: OnDataClickListener) :
  1. 向函数添加参数
        fun bindView(usr: UserModel, clicker:OnDataClickListener) {
            id.text = usr.id.toString()
            name.text = usr.name
            email.text = usr.email
            phone.text = usr.phone
            address.text = usr.address

             //Data to be sent to the fragment
            clicker.onItemClick(usr)
        }
  1. 现在您需要一个用于 bindView 的附加参数,将 clickListener 传递到此函数中。
  override fun onBindViewHolder(holder: UserdbViweHolder, position: Int) {
        var usr = usrList[position]

        //clickListener Passed as Parameter here
        holder.bindView(usr, clickListener)
    }
  1. 现在让我们开始片段。
//change Fragment Defination
class WorkFragment : Fragment(R.layout.fragment_work), OnDataClickListener {
  1. WorkFragment 将显示错误。 Windows 的 Ctrl+O 根据您的需要覆盖 OnDataClickListener。
override fun onItemClick(Item: UserModel) {
   // Do Whatever you want with this data take it to another fragment or just show in Log, Upto You.
   Log.d("WorkFragment", "Clicked Data is $Item")
}
  1. 我们需要处理最后一个错误。将片段传递给适配器。
 adapterdb = UserdbAdapter(requireContext(), usrList, this)

这应该对你有用。