首页 > 解决方案 > 在这个递归方法中返回什么?

问题描述

我正在创建一种方法来递归View搜索ArrayList. 它将遍历这个ArrayList,如果它包含 a ArrayList,它也会搜索Views ,依此类推,直到找到View要返回的 a 。这样我就可以让View里面的任何东西都看不见了。

fun searchForView(arrayList: ArrayList<*>): View {
    arrayList.forEach { item ->
        if (item is View) {
            return item
        } else if (item is ArrayList<*>) {
            item.forEach {
                searchForView(it as ArrayList<*>)
            }
        }
    }
} // Error here, needs to return a View

所以我会这样使用它:

someArrayList.forEach {
    searchForView(someArrayList).visibility = View.INVISIBLE
}

return someView但是它给了我一个错误,因为在方法的末尾需要有一个声明。每当我调用它时,ArrayList被搜索的总是会有一个View. 那么我到底应该返回什么,知道View找到的任何东西都会被归还?

标签: androidkotlinrecursionarraylistreturn

解决方案


我以前也想做和你一样的事情,这就是我所做的

class VisibilitySwitcher(private val mutableViewSet: MutableSet<View?>, private val onCondition: Boolean = true){
    fun betweenVisibleOrGone(){
        if(onCondition)
            mutableViewSet.forEach {
                when (it?.visibility) {
                    View.VISIBLE -> {it.visibility = View.GONE}
                    View.GONE -> {it.visibility = View.VISIBLE}
                }
            }
    }

    fun betweenVisibleOrInvisible(){
        if(onCondition)
        mutableViewSet.forEach {
            when (it?.visibility) {
                View.VISIBLE -> {it.visibility = View.INVISIBLE}
                View.INVISIBLE -> {it.visibility = View.VISIBLE}
            }
        }
    }

    fun betweenInVisibleOrGone(){
        if(onCondition)
        mutableViewSet.forEach {
            when (it?.visibility) {
                View.INVISIBLE -> {it.visibility = View.GONE}
                View.GONE -> {it.visibility = View.INVISIBLE}
            }
        }
    }

}

使用示例

class LoginActivity : BaseActivity() {

    @Inject
    @ViewModelInjection
    lateinit var viewModel: LoginVM

    private lateinit var mutableViewSet: MutableSet<View?>

    override fun layoutRes() = R.layout.activity_login

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        facebookBtn.setOnClickListener { handleClickEvent(it) }
        googleBtn.setOnClickListener { handleClickEvent(it) }
    }

    private fun handleClickEvent(view: View) {
        when (view) {
            facebookBtn -> { viewModel.smartLoginManager.onFacebookLoginClick() }
            googleBtn -> { viewModel.smartLoginManager.onGoogleLoginClick() }
        }

        mutableViewSet = mutableSetOf(facebookBtn, googleBtn, progressBar)
        VisibilitySwitcher(mutableViewSet).betweenVisibleOrGone() // <----- Use without Condition
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        VisibilitySwitcher(mutableViewSet, resultCode != -1).betweenVisibleOrGone() //<-- Use with Conditions
        viewModel.smartLoginManager.onActivityResultCallBack(requestCode, resultCode, data)

        super.onActivityResult(requestCode, resultCode, data)
    }
}

关键是每当您从 facebook 或 google 按钮单击登录时,它将设置 facebook 和 google 的可见性消失并将进度条(进度条的默认值是 View.GONE)设置为可见

如果结果代码不是 -1,则在覆盖 fun onActivityResult() 时,这意味着它出现了一些错误或取消,因此它将切换回进度条消失并更改 facebook 和 google 按钮再次可见

如果您想修复自己的代码,我会这样做

fun searchForView(mutableViewSet: MutableSet<View?>){
        mutableViewSet.forEach {
            when (it?.visibility) {
                View.VISIBLE -> {it.visibility = View.INVISIBLE} 
                View.INVISIBLE -> {it.visibility = View.VISIBLE} //<-- you can delete this if you don't want
            }
        }
    }

或者很短的形式

 fun searchForView(mutableViewSet: MutableSet<View?>) = mutableViewSet.forEach { when (it?.visibility) {View.VISIBLE -> it.visibility = View.INVISIBLE } }

用法

val mutableViewSet = mutableSetOf(your view1,2,3....)
searchForView(mutableViewSet)

如果它必须使用arrayList: ArrayList<*> 然后

fun searchForView(arrayList: ArrayList<*>) = arrayList.forEach{ if (it is View) it.visibility = View.INVISIBLE

推荐阅读