android - 想要将 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()
}
}
解决方案
嗯,有不同的方法来实现这一点。我将告诉你我是如何做到这一点的。
- 创建一个新文件,界面,说“OnDataClickListener”
- 你的代码应该看起来像这样。
interface OnDataClickListener {
fun onItemClick(Item: UserModel)
}
- 现在让我们转到您的 recyclerView 适配器文件。
- 给recycler View Class添加一个参数。
class RecyclerViewAdapter(private val clickListener: OnDataClickListener) :
- 向函数添加参数
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)
}
- 现在您需要为 bindView 添加一个参数,将 clickListener 传递给此函数。
override fun onBindViewHolder(holder: UserdbViweHolder, position: Int) {
var usr = usrList[position]
//clickListener Passed as Parameter here
holder.bindView(usr, clickListener)
}
- 现在让我们去片段。
//change Fragment Defination
class WorkFragment : Fragment(R.layout.fragment_work), OnDataClickListener {
- 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")
}
- 我们需要处理最后一个错误。将片段传递给适配器。
adapterdb = UserdbAdapter(requireContext(), usrList, this)
这应该为您解决问题。
推荐阅读
- image - 如何在屏幕上绘制随机部分的图像?
- cloud-foundry - 在 PCF(Pivotal Cloud Foundary)中部署应用程序时 Springboot 无法从数据源确定 JDBC url
- date - 需要在netsuite模板中的“MM-dd-yyyy”中格式化日期
- jquery - 在 Django 中加载 json 文件
- jquery - Laravel 5.4 422(无法处理的实体)Ajax 调用
- javascript - 谷歌云打印:最简单的客户端
- scala - 播放框架控制器测试 - 没有实现
被束缚 - hibernate - 由于 LazyInitializationException,无法从 Entity 读取数据
- r - mle 估计参数失败,错误代码 7
- arrays - Applescript Excell将列保存在数组中,但将行保存为字符串