首页 > 解决方案 > 想要将 recyclerview 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
    }
}

//这是我试图获取我的recyelerview数据的地方,我将在哪里更新数据所以这是我的更新片段

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

标签: androidkotlinandroid-fragmentsandroid-recyclerviewandroid-sqlite

解决方案


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

  1. 创建一个新文件,界面,说“OnDataClickListener”
  2. 你的代码应该看起来像这样。
interface OnDataClickListener {
    fun onItemClick(Item: UserModel)
}
  1. 现在让我们转到您的 recyclerView 适配器文件。
  2. 给recycler View Class添加一个参数。
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)

这应该为您解决问题。


推荐阅读