【问题标题】:button click inside an item in recyclerview refreshes entire activity在 recyclerview 中的项目内单击按钮刷新整个活动
【发布时间】:2018-05-05 15:52:25
【问题描述】:

我正在实现一个RecyclerView,其中包含具有删除按钮的项目,数据来自 Firebase,并且删除按钮更改了 firebase 中的“已保存”值。这个 recyclerview 出现在主 Activity 底部导航栏的第三个菜单中。

当我点击删除按钮时,整个activity重新启动,activity从底部导航栏的第一个菜单开始

如何停止此重新启动操作?

我在下面附上RecyclerView 适配器代码:

package com.demo.ash.demoapp

import android.content.Intent
import android.os.Environment
import android.support.v7.widget.RecyclerView
import android.transition.TransitionManager
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.database.FirebaseDatabase
import kotlinx.android.synthetic.main.offline_client.view.*
import kotlinx.android.synthetic.main.activity_main.*
import org.json.JSONObject
import java.io.File

/**
 * Created by ashwin on 3/5/2018.
 */
class OfflineClientAdapter(val list: MutableList<Client>, val clientIDList:MutableList<String>): RecyclerView.Adapter<OfflineClientViewHolder>() {
    lateinit var vg: ViewGroup

    override fun getItemCount(): Int {
        return list.size
    }

    override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): OfflineClientViewHolder {
        val layoutInflator = LayoutInflater.from(parent?.context)
        vg = parent!!
        val cellForRow = layoutInflator.inflate(R.layout.offline_client, parent, false)
        return OfflineClientViewHolder(cellForRow, "")
    }


    override fun onBindViewHolder(holder: OfflineClientViewHolder?, position: Int) {
        val row = list.get(position)
        holder?.view?.NameView?.text = row.cname
        holder?.view?.PhnumView?.text = row.cphonenum

        holder?.clientID = clientIDList[position]

        var encodedimage = IOHelper.stringToBitmap(row.cimage)
        holder?.view?.client_image?.setImageBitmap(encodedimage)

        val user = FirebaseAuth.getInstance().currentUser

        var database = FirebaseDatabase.getInstance().getReference("Users").child(user?.phoneNumber)
                .child("Clients").child(clientIDList[position])

        holder?.view?.delete_client?.setOnClickListener {
            val path = Environment.getExternalStorageDirectory()
            val dir = File(path.toString() + "/pranjal/saved_clients.txt")
            var clients = IOHelper.stringFromFile(dir)

            var t = JSONObject(clients)

            t.remove(clientIDList[position])

            database.child("saved").setValue(false)
        }
    }
}

class OfflineClientViewHolder(val view: View, var clientID: String): RecyclerView.ViewHolder(view) {
    init{
        view.setOnClickListener {
            val intent = Intent(view.context, OfflinePatientListActivity::class.java)
            intent.putExtra("clientID",clientID)
            view.context.startActivity(intent)
        }
    }
}

【问题讨论】:

  • 如果它是用 Kotlyn 编写的,请相应地标记您的问题
  • @Juan 我是 StackOverflow 的新手,抱歉

标签: firebase firebase-realtime-database android-recyclerview kotlin


【解决方案1】:

如果您不想在单击按钮时启动 Activity,为什么要使用此代码?

view.context.startActivity(intent)

【讨论】:

  • 它重新启动活动,删除按钮动作触发该动作。您建议的部分是触发其他东西所必需的
  • 所显示的代码中几乎没有任何其他内容可以执行您的建议。
  • 是不是因为点击删除按钮时firebase数据发生了变化?
  • 您有两个点击监听器。将每个注释掉,然后一次添加一个,以确定导致您的问题的原因。关于 Firebase - 这与更改您的支持数据无关。你说你的活动正在重新开始。在这种情况下,必须调用 startActivity。
  • 试过评论,发现是数据的变化导致重启,除了重启有适配器对象的activity,不应该调用ValueEventListener吗?
【解决方案2】:

当我点击删除按钮时,整个activity重新启动,activity从底部导航栏的第一个菜单开始

听起来您的应用程序正在崩溃。除非您正在做的事情会无意(或有意?)重启说Activity

看起来您正在更改适配器数据(删除它),而没有调用必要的方法来提醒适配器和 recylerview 它需要更新其数据。确保在更新数据后调用必要的 .notify...() 方法。

如果删除按钮是recylerview 的一部分,请确保在适当的回调/代码中考虑到它。

我会确保您的 .delete_client?.setOnClickListener { ... }code 中没有发生任何崩溃。

还要确保您没有在其他回调中访问空列表。

希望这会有所帮助!

【讨论】:

  • 应用程序不会强制关闭,这不就是在该按钮单击事件中发生崩溃的证据吗?加上专门更改firebase中的数据会触发重新启动活动(活动的整个代码再次从onCreate()开始)。不知道是什么原因造成的,能否进一步研究一下?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多