刷新Kotlin问题中的RecyclerView

问题描述

我已成功通过适配器将数据从MainActivity传递到我的recyclerView,并且带有项目的视图正在正确呈现。但是,我需要在单击(状态)时更改项目对象的一个​​成员,并为此编写了一个方法(updateStatus),它的工作原理很好,它可以更改值并将其保存到数据库

但是我无法刷新我的recyclerView,因此它可以呈现已更改的Status属性。我需要回到手机上,重新输入,然后它才能正确呈现。我已经尝试了一切,从notifyDataSetChanged到重新启动适配器,都没有运气。缺少一些东西,我找不到。

这是我的MainActivity类


class RecycleViewAdapter(var dostavneKnjiziceBP: ArrayList<DostavnaKnjizicaModel>)
    : RecyclerView.Adapter<RecycleViewAdapter.ViewHolder>() {

    class ViewHolder(view: View) : RecyclerView.ViewHolder(view){
        val nazivPrimaoca: TextView = view.txtNazivPrimaoca
        val brojposiljke: TextView = view.txtbrojposiljke
        val statusDostave: TextView = view.txtStatusDostave
        val imgMore: ImageView = view.img_more
        val context: Context = view.context
    }
    override fun onCreateViewHolder(parent: ViewGroup,viewType: Int): ViewHolder {

        val layoutView = LayoutInflater.from(parent.context).inflate(R.layout.urucenje_posiljke_layout,parent,false)
        return ViewHolder(layoutView)
    }
    override fun getItemCount() = dostavneKnjiziceBP.size


    @RequiresApi(Build.VERSION_CODES.KITKAT)
    override fun onBindViewHolder(holder: ViewHolder,position: Int) {
        //New variable to get all modeliPosiljakaBP and their position
        var dosKnjizica = dostavneKnjiziceBP[position]

        val mainActivity = MainActivity()
        //Sending data to layout for display in specific field
        if (dosKnjizica.naziv_primaoca != null) {
            holder.brojposiljke.text = "${dosKnjizica.id_dostavna_knjizica},"
            holder.nazivPrimaoca.text = "${dosKnjizica.naziv_primaoca}"
            if (dosKnjizica.naziv_primaoca!!.length > 25) {
                holder.nazivPrimaoca.text = "${dosKnjizica.naziv_primaoca!!.subSequence(0,25)}..."
            }
        } else {
            holder.brojposiljke.text = "${dosKnjizica.id_dostavna_knjizica}"
            holder.nazivPrimaoca.text = ""
        }
        holder.statusDostave.text = "${dosKnjizica.status_dostave_naziv}"

        when (dosKnjizica.status_dostave) {
            StatusDostaveEnum.Neurucena.value -> {
                holder.statusDostave.setTextColor(Color.RED)
            }
            StatusDostaveEnum.Uruceno.value,StatusDostaveEnum.ZaRejon.value,StatusDostaveEnum.Nadoslano.value,StatusDostaveEnum.Izgubljeno.value -> {
                holder.statusDostave.setTextColor(Color.GREEN)
            }
            StatusDostaveEnum.Obavjesteno.value,StatusDostaveEnum.ZaNarednuDostavu.value -> {
                holder.statusDostave.setTextColor(Color.BLUE)
            }
            StatusDostaveEnum.Retour.value -> {
                holder.statusDostave.setTextColor(Color.parseColor("#dda0dd"))
            }
        }

        //Calling menu menu_pregled_drugih_vrsta_posiljke to display menu options on click on three dots
        holder.imgMore.setonClickListener {
            val popupMenu = PopupMenu(holder.context,it,Gravity.START)
            popupMenu.setonMenuItemClickListener { item ->
                when (item.itemId) {
                    R.id.uruci -> {
                        //calling new activity from second item in dropdown menu
                        holder.imgMore.context.startActivity(
                            Intent(holder.imgMore.context,MainActivityInfo::class.java).putExtra(
                                "Id",dosKnjizica.id_dostavna_knjizica.toString()
                            )
                        )
                        true
                    }
                    //here i am calling my changeStatus method from MainActivity
                    R.id.obavjesti -> {
                        mainActivity.changeStatus(holder.context,dosKnjizica.id_dostavna_knjizica!!,StatusDostaveEnum.Uruceno.value)
                        Toast.makeText(holder.context,"obavjesti",Toast.LENGTH_SHORT).show()
                        true
                    }
                    R.id.vrati -> {
                        Toast.makeText(holder.context,"vrati",Toast.LENGTH_SHORT).show()
                        true
                    }
                    else -> false
                }
            }
            popupMenu.inflate(R.menu.menu_urucenje_posiljke)
            popupMenu.show()
        }
    }


}

和我的适配器类

class SoundSolver:
    def __init__(self):
        self.p = pyaudio.PyAudio()
        self.d = dict()


    def get_stream(self):
        speakers = self.p.get_default_output_device_info()["hostApi"]
        print(speakers)
        s = self.p.open(
            format=pyaudio.paInt16,channels=1,rate=44100,input=True,frames_per_buffer=CHUNK,# input_device_index=speakers
        )
        return s

解决方法

您的适配器没有更新的数据。最初,您从数据库中获取所有数据,并使用它创建一个适配器:async function editMovie(payload,logCallback,refreshCallback) { const t = await sequelize.transaction(); try { const media = await getModelMovie(false).update({ title: payload.title,disma_new_id: payload.disma_new_id,disma_old_id: payload.disma_old_id,},{ where: { id: payload.id } },{ transaction: t }) const sources_deleted = await getModelLinksSource(false,constants.MEDIA_TYPES.MEDIA_TYPE_MOVIE).destroy({ where: { sourceable_id: payload.id,sourceable_type: constants.MEDIA_TYPES.MEDIA_TYPE_MOVIE } },{ transaction: t }) if (payload.sources && payload.sources.length > 0) { // do this or clone or loop and create a new array payload.sources = JSON.parse(JSON.stringify(payload.sources)) for (let i = 0; i < payload.sources.length; i++) { payload.sources[i].sourceable_id = payload.id } const sources = await getModelLinksSource(false,constants.MEDIA_TYPES.MEDIA_TYPE_MOVIE).bulkCreate(payload.sources,{ transaction: t }) } const streams_deleted = await getModelLinksStreams(false,constants.MEDIA_TYPES.MEDIA_TYPE_MOVIE).destroy({ where: { streamable_id: payload.id,streamable_type: constants.MEDIA_TYPES.MEDIA_TYPE_MOVIE } },{ transaction: t }) if (payload.streams && payload.streams.length > 0) { // do this or clone or loop and create a new array payload.streams = JSON.parse(JSON.stringify(payload.streams)) for (let i = 0; i < payload.streams.length; i++) { payload.streams[i].streamable_id = payload.id } const streams = await getModelLinksStreams(false,constants.MEDIA_TYPES.MEDIA_TYPE_MOVIE).bulkCreate(payload.streams,{ transaction: t }) } await t.commit() if (logCallback) { logCallback("Movie edited!",constants.LOG_TYPES.LOG_TYPE_SUCCESS) if (refreshCallback) { refreshCallback(null) } } } catch (error) { await t.rollback() console.log(error) if (logCallback) { logCallback(`Failed editing movie! Error: ${error ? error.stack : "Unknown."}`,constants.LOG_TYPES.LOG_TYPE_ERROR) } } } 。之后,您正在更新数据库,调用adapter = RecycleViewAdapter(allItems),但没有将数据传递给适配器。

getAllItems(Context)行添加到adapter.dostavneKnjiziceBP = allItems方法中,如下所示:

changeStatus
,

dostavneKnjiziceBP另存为适配器内部的私有变量,并创建用于在每次更改后使用ArrayList从适配器内部分配和更新notifyDataSetChanged()的函数。

class RecycleViewAdapter internal constructor(
    context: Context
) : RecyclerView.Adapter<RecycleViewAdapter.ViewHolder>() {

    private var items = ArrayList<DostavnaKnjizicaModel>()

    // ...

    internal fun setItems(items: ArrayList<DostavnaKnjizicaModel>) {
        this.items = items
        notifyDataSetChanged()
    }

    override fun getItemCount() = this.items.size
}

此外,如果您知道更新项目的索引,请尝试使用adapter.notifyItemChanged(updateIndex);