/*
 *    Copyright (C) 2015 Haruki Hasegawa
 *
 *    Licensed under the Apache License, Version 2.0 (the "License");
 *    you may not use this file except in compliance with the License.
 *    You may obtain a copy of the License at
 *
 *        http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS,
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *    See the License for the specific language governing permissions and
 *    limitations under the License.
 */

package com.h6ah4i.android.widget.advrecyclerview.utils;

import android.support.annotation.Nullable;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewParent;

public class RecyclerViewAdapterUtils {
    private RecyclerViewAdapterUtils() {
    }

    /**
     * Gets parent RecyclerView instance.
     * @param view Child view of the RecyclerView's item
     * @return Parent RecyclerView instance
     */
    public static RecyclerView getParentRecyclerView(@Nullable View view) {
        if (view == null) {
            return null;
        }
        ViewParent parent = view.getParent();
        if (parent instanceof RecyclerView) {
            return (RecyclerView) parent;
        } else if (parent instanceof View) {
            return getParentRecyclerView((View) parent);
        } else {
            return null;
        }
    }

    /**
     * Gets directly child of RecyclerView (== {@link android.support.v7.widget.RecyclerView.ViewHolder#itemView}})
     * @param view Child view of the RecyclerView's item
     * @return Item view
     */
    public static View getParentViewHolderItemView(@Nullable View view) {
        if (view == null) {
            return null;
        }
        ViewParent parent = view.getParent();
        if (parent instanceof RecyclerView) {
            return view;
        } else if (parent instanceof View) {
            return getParentViewHolderItemView((View) parent);
        } else {
            return null;
        }
    }

    /**
     * Gets {@link android.support.v7.widget.RecyclerView.ViewHolder}.
     * @param view Child view of the RecyclerView's item
     * @return ViewHolder
     */
    public static RecyclerView.ViewHolder getViewHolder(@Nullable View view) {
        RecyclerView rv = getParentRecyclerView(view);
        View rvChild = getParentViewHolderItemView(view);

        if (rv != null && rvChild != null) {
            return rv.getChildViewHolder(rvChild);
        } else {
            return null;
        }
    }
}

@@ -1074,32 +1074,46 @@
 nstance%0A     */%0A
+    @Nullable%0A
     public stati
@@ -1736,32 +1736,46 @@
 em view%0A     */%0A
+    @Nullable%0A
     public stati
@@ -1844,151 +1844,77 @@
     
-if (view == null) %7B%0A            return null;%0A        %7D%0A        ViewParent parent = view.getParent();%0A        if (parent instanceof RecyclerView
+RecyclerView rv = getParentRecyclerView(view);%0A        if (rv == null
 ) %7B%0A
@@ -1932,20 +1932,20 @@
  return 
-view
+null
 ;%0A      
@@ -1951,82 +1951,41 @@
    %7D
- else if (parent instanceof View) %7B%0A            return getParentViewHolder
+%0A        return rv.findContaining
 Item
@@ -1993,75 +1993,14 @@
 iew(
-(V
+v
 iew)
- parent);%0A        %7D else %7B%0A            return null;%0A        %7D
+;
 %0A   
@@ -2169,24 +2169,38 @@
 der%0A     */%0A
+    @Nullable%0A
     public s
@@ -2333,206 +2333,110 @@
     
-View rvChild = getParentViewHolderItemView(view);%0A%0A        if (rv != null && rvChild != null) %7B%0A            return rv.getChildViewHolder(rvChild);%0A        %7D else %7B%0A            return null;%0A        %7D
+if (rv == null) %7B%0A            return null;%0A        %7D%0A        return rv.findContainingViewHolder(view);
 %0A   

Change the implemeantation of some helpers to use findContainingItemView/findContainingViewHolder methods