【问题标题】:Interface between recyclerview adapter & viewholderrecyclerview适配器和viewholder之间的接口
【发布时间】:2020-06-06 17:19:59
【问题描述】:

所以我有一个 Recyclerview 和多个视图。现在我的一个视图包含一个几乎没有动画的项目。现在,如果用户单击项目活动打开并且我无法控制活动,我知道的唯一方法是通过我的片段中的回调,即 onPause 和 onResume。一旦我的片段onResume() 被调用,我想调用animation.onResume()

接口类

interface CustomTabClosedListener {
        fun onCustomTabClosed()
    }

适配器相关代码:

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
   lateinit var viewViewHolder: RecyclerView.ViewHolder
   val layoutInflater = LayoutInflater.from(context)
   val view = layoutInflater!!.inflate(R.layout.feed_coverage, parent, false)
                viewViewHolder = CoverageViewHolder(view)
                listener = viewViewHolder
}

侦听器在哪里private var listener: CustomTabClosedListener?=null

ViewHolder

class CoverageViewHolder(val view: View) :CustomTabClosedListener {

override fun onCustomTabClosed() {
    animation?.resume()

现在我的片段在 onResume 中调用了这个适配器方法 -

fun customTabClosed() {
    listener?.onCustomTabClosed()
 }

但我的听众在这里收到null,我不知道原因。如何通过我的适配器/片段在视图中调用我的方法?还有其他更好的方法吗?

【问题讨论】:

  • 也许 onResumeonCreateViewHolder 之前调用?
  • @PavelPoley 我正在单击该视图持有者本身的项目。所以之后会调用 onResume

标签: android android-recyclerview android-viewholder


【解决方案1】:

我猜你得到null的原因是因为你应该在AdapterviewHolder中只有一个回调,并且所有的动画都应该由视图管理。如果适配器管理一些真正基本的业务逻辑,将视图应该发生的事情留给视图本身,那就更好更干净了。

假设您的动画有一个 xml 文件 您可以从视图中控制通知适配器并启动动画

fun IamACoolCallBack(){

 AnimationUtils.loadLayoutAnimation(context, R.anim.layout_animation_fall_down);
with(recyclerView){
    setLayoutAnimation(controller);
    getAdapter().notifyDataSetChanged();
    scheduleLayoutAnimation();
 }
}

编辑 我发现 this 教程对我来说看起来很整洁

【讨论】:

  • 或多或少我正在尝试做同样的事情。 View inside viewholder 管理所有状态,除了 resume & 我无法通知我的 viewholder 恢复状态
  • 最终你可以通过 ViewHolder 让它工作,但是你问是否有更好的方法,我会赞同我建议你的方法,把管理生命周期和动画效果。我将在我的编辑中向您推荐一个很好的教程
猜你喜欢
  • 2020-08-24
  • 1970-01-01
  • 2017-09-12
  • 2022-01-14
  • 1970-01-01
  • 2013-03-04
  • 1970-01-01
  • 2022-01-13
  • 1970-01-01
相关资源
最近更新 更多