【问题标题】:RecyclerView - how can I get a reference to each row's ViewRecyclerView - 如何获得对每一行视图的引用
【发布时间】:2014-11-29 20:10:46
【问题描述】:

我正在使用新的RecyclerView 替换我现有的ListViews 并遇到以下问题:在旧的BaseAdapter 中,我可以为每个项目创建一个“飞入”Animation适配器只需将此Animation 应用到convertView 并注意SparseBooleanArray 中已显示Animation 的位置。

替换getView()onBindViewHolder() 方法不提供对任何Views 的访问,新的ItemAnimator 也不提供。基本上我需要访问我的ViewHolder 的根View 才能将我自己的Animation 应用于每个项目。

有什么办法吗?

【问题讨论】:

    标签: android android-recyclerview


    【解决方案1】:

    RecyclerView 使用的每个视图持有者都必须继承 RecyclerView.ViewHolder 的子类,并且此类有一个名为 itemView 的公共字段,其中包含与 ViewHolder 关联的 View

    final View view = viewHolder.itemView;
    

    但总的来说:动画在RecyclerView 中的工作方式不同。本质上,您在一个名为 ItemAnimator 的单独类中实现它们:

    mRecyclerView.setItemAnimator(new RecyclerView.ItemAnimator() {
    
        @Override
        public void runPendingAnimations() {
    
        }
    
        @Override
        public boolean animateRemove(RecyclerView.ViewHolder viewHolder) {
            return false;
        }
    
        @Override
        public boolean animateAdd(RecyclerView.ViewHolder viewHolder) {
            return false;
        }
    
        @Override
        public boolean animateMove(RecyclerView.ViewHolder viewHolder, int i, int i2, int i3, int i4) {
            return false;
        }
    
        @Override
        public boolean animateChange(RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder viewHolder2, int i, int i2, int i3, int i4) {
            return false;
        }
    
        @Override
        public void endAnimation(RecyclerView.ViewHolder viewHolder) {
    
        }
    
        @Override
        public void endAnimations() {
    
        }
    
        @Override
        public boolean isRunning() {
            return false;
        }
    });
    

    在所有这些回调中,您可以通过我上面解释的公共字段访问View 实例。 RecyclerView.Adapter 与之前的Adapters 不同,实际上只负责RecyclerView 中的数据。

    您还可以查看this library on GitHub,它已经实现了几个不同的ItemAnimators

    有关更多信息,请参阅文档!

    【讨论】:

    • 哇!!从来不知道itemView。真的很有帮助的帖子。 +1
    • 如果 viewHolder 有一个 getAttachedView 方法(或类似的方法)会更好,因为我们所有人都在寻找合适的方法而不是公共领域。也许谷歌做出这个决定是因为这在 recycleview 适配器中提供了更多的性能。但是,如果您想访问 viewholder 对象中的视图,这是正确的答案
    • “RecyclerView.Adapter 实际上只负责 RecyclerView 中的数据”......这可能是理论上的,但实际上,适配器会膨胀并填充项目中的所有视图。所以它也对视图负责。
    • @GregEnnis 当然。这就是为什么它被称为Adapter 的原因,它本质上将您的数据转换为实际可以显示的Views。我的陈述的意思是,这就是AdapterRecyclerView 所做的一切。这与ListViewAdapter 形成对比,后者基本上负责ListView 中发生的所有事情。 RecyclerView 架构要好得多,并将其 Adapter 的责任减少到只做它命名的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-17
    • 1970-01-01
    • 2017-09-02
    • 2019-08-19
    • 2015-05-29
    相关资源
    最近更新 更多