Android 从onBindViewHolder中的setOnClickListener运行房间DAO
我有一个recyclerview,它显示我的sql数据的cardview。现在我想向每张卡添加操作,以便能够删除数据并更新视图 我在适配器的onBindViewHolder中添加了OnClickListener。代码会运行,但不会删除数据。如果我再次运行相同的单击操作,我会得到“lateinit属性mWorkerHandler尚未初始化”。这是我的侦听器代码。我知道这可能不正确,但这是我迄今为止的尝试:Android 从onBindViewHolder中的setOnClickListener运行房间DAO,android,kotlin,Android,Kotlin,我有一个recyclerview,它显示我的sql数据的cardview。现在我想向每张卡添加操作,以便能够删除数据并更新视图 我在适配器的onBindViewHolder中添加了OnClickListener。代码会运行,但不会删除数据。如果我再次运行相同的单击操作,我会得到“lateinit属性mWorkerHandler尚未初始化”。这是我的侦听器代码。我知道这可能不正确,但这是我迄今为止的尝试: holder.deleteButton.setOnClickListener{
holder.deleteButton.setOnClickListener{
var mDb: TaskDatabase? = null
mDb = TaskDatabase.getInstance(this.mInflater.context)
lateinit var mDbWorkerThread: DbWorkerThread
mDbWorkerThread = DbWorkerThread("dbWorkerThread2")
mDbWorkerThread.start()
val task = Runnable { mDb?.taskDao()?.deleteById(holder.id as Int) }
mDbWorkerThread.postTask(task)
TaskDatabase.destroyInstance()
mDbWorkerThread.quit()
}
有一点我根本不确定,那就是数据库的上下文。我不确定的第二件事是穿线。也许有更好的方法吗?@Brandon Bearden,
这里有两件重要的事情要考虑。首先,不应该在主线程中访问房间数据库。这意味着您的删除应该发生在后台线程上。当删除成功时,您需要通知RecyclerView适配器数据集已更改[adapter.notifyDataSetChanged()],以反映视图中的更改。这必须发生在主/UI线程上。请确保这是正确处理 删除代码后,您无法在已调整的上调用notify datasetchanged,让其知道如何更新列表。我不想在recycler视图适配器的onbindviewholder()函数中使用这样的代码。在活动中使用Make函数从数据库中删除条目,删除条目后,在适配器上调用notifydatasetchanged。当您从db的后台线程返回时,不要忘记在主线程上调用此函数。 创建一个接口,将要删除的项的ID从适配器传递到活动,并在那里写入删除逻辑 更新: 您可以这样做: 声明接口:
public interface MyInterface{
public void foo(int deleteThisId);
}
让你的活动激发它:
public class MyActivity extends Activity implements MyInterface{
//Somewhere in on create where you init the adapter
adapter = MyAdapter(this); // where this is the instance for the interface which will be used in adapter
public void foo(int deleteThisId){
//do stuff with deleteThisId
//when finished with delete operation
adapter.notifyDatasetChanged();
}
}
然后将您的活动传递给MyAdater:
public MyAdapter extends RecyclerView.Adapter<>{
private MyInterface listener;
public MyAdapter(MyInterface listener){
this.listener = listener;
}
}
为什么不使用swipeToDelete方法?@ShowYoungSoyinka-我不知道/想过swipe方法。非常感谢。我想先看看这个模型的工作情况,然后再看看如何添加滑动。我认为在卡上有一个明显的动作比只刷一下要好。我正在尝试在侦听器中运行另一个线程,我不确定我的语法是否正确,或者我是否正确地开始和结束了上下文中的线程。使用Observer填充视图的“我的数据”。我相当肯定,当删除成功时,它将按照实现方式进行更新。据我所知,我必须在适配器中设置onClickListener。因为我需要每个卡上每个按钮的侦听器。如何从侦听器中的适配器调用活动中的函数?我已经更新了显示如何实现接口的代码。如果您被困在需要进行大量更改才能正常工作的地方,我不需要通知适配器,因为数据已经填充了Observer,请搜索更多有关如何使用接口的信息。然而,接口实现的基本思想非常有效。我还必须把它全部转换成kotlin。@BrandonBearden我不知道你在kotlin中问了这个问题,但基本想法是一样的。干杯
listener.foo(idToBeDeleted);