Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/210.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 从onBindViewHolder中的setOnClickListener运行房间DAO_Android_Kotlin - Fatal编程技术网

Android 从onBindViewHolder中的setOnClickListener运行房间DAO

Android 从onBindViewHolder中的setOnClickListener运行房间DAO,android,kotlin,Android,Kotlin,我有一个recyclerview,它显示我的sql数据的cardview。现在我想向每张卡添加操作,以便能够删除数据并更新视图 我在适配器的onBindViewHolder中添加了OnClickListener。代码会运行,但不会删除数据。如果我再次运行相同的单击操作,我会得到“lateinit属性mWorkerHandler尚未初始化”。这是我的侦听器代码。我知道这可能不正确,但这是我迄今为止的尝试: holder.deleteButton.setOnClickListener{

我有一个recyclerview,它显示我的sql数据的cardview。现在我想向每张卡添加操作,以便能够删除数据并更新视图

我在适配器的onBindViewHolder中添加了OnClickListener。代码会运行,但不会删除数据。如果我再次运行相同的单击操作,我会得到“lateinit属性mWorkerHandler尚未初始化”。这是我的侦听器代码。我知道这可能不正确,但这是我迄今为止的尝试:

    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);