/*
* 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.graphics.Rect;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
public class CustomRecyclerViewUtils {
public static RecyclerView.ViewHolder findChildViewHolderUnderWithoutTranslation(RecyclerView rv, float x, float y) {
final View child = findChildViewUnderWithoutTranslation(rv, x, y);
return (child != null) ? rv.getChildViewHolder(child) : null;
}
private static View findChildViewUnderWithoutTranslation(ViewGroup parent, float x, float y) {
final int count = parent.getChildCount();
for (int i = count - 1; i >= 0; i--) {
final View child = parent.getChildAt(i);
if (x >= child.getLeft() &&
x <= child.getRight() &&
y >= child.getTop() &&
y <= child.getBottom()) {
return child;
}
}
return null;
}
public static RecyclerView.ViewHolder findChildViewHolderUnderWithTranslation(RecyclerView rv, float x, float y) {
final View child = rv.findChildViewUnder(x, y);
return (child != null) ? rv.getChildViewHolder(child) : null;
}
public static Rect getLayoutMargins(View v, Rect outMargins) {
final ViewGroup.LayoutParams layoutParams = v.getLayoutParams();
if (layoutParams instanceof ViewGroup.MarginLayoutParams) {
final ViewGroup.MarginLayoutParams marginLayoutParams = (ViewGroup.MarginLayoutParams) layoutParams;
outMargins.left = marginLayoutParams.leftMargin;
outMargins.right = marginLayoutParams.rightMargin;
outMargins.top = marginLayoutParams.topMargin;
outMargins.bottom = marginLayoutParams.bottomMargin;
} else {
outMargins.left = outMargins.right = outMargins.top = outMargins.bottom = 0;
}
return outMargins;
}
public static Rect getDecorationOffsets(RecyclerView.LayoutManager layoutManager, View view, Rect outDecorations) {
outDecorations.left = layoutManager.getLeftDecorationWidth(view);
outDecorations.right = layoutManager.getRightDecorationWidth(view);
outDecorations.top = layoutManager.getTopDecorationHeight(view);
outDecorations.bottom = layoutManager.getBottomDecorationHeight(view);
return outDecorations;
}
public static Rect getViewBounds(View v, Rect outBounds) {
outBounds.left = v.getLeft();
outBounds.right = v.getRight();
outBounds.top = v.getTop();
outBounds.bottom = v.getBottom();
return outBounds;
}
public static int findFirstVisibleItemPosition(RecyclerView rv) {
RecyclerView.LayoutManager layoutManager = rv.getLayoutManager();
if (layoutManager instanceof LinearLayoutManager) {
return (((LinearLayoutManager) layoutManager).findFirstVisibleItemPosition());
} else {
return RecyclerView.NO_POSITION;
}
}
public static int findLastVisibleItemPosition(RecyclerView rv) {
RecyclerView.LayoutManager layoutManager = rv.getLayoutManager();
if (layoutManager instanceof LinearLayoutManager) {
return (((LinearLayoutManager) layoutManager).findLastVisibleItemPosition());
} else {
return RecyclerView.NO_POSITION;
}
}
public static int findFirstCompletelyVisibleItemPosition(RecyclerView rv) {
RecyclerView.LayoutManager layoutManager = rv.getLayoutManager();
if (layoutManager instanceof LinearLayoutManager) {
return (((LinearLayoutManager) layoutManager).findFirstCompletelyVisibleItemPosition());
} else {
return RecyclerView.NO_POSITION;
}
}
public static int findLastCompletelyVisibleItemPosition(RecyclerView rv) {
RecyclerView.LayoutManager layoutManager = rv.getLayoutManager();
if (layoutManager instanceof LinearLayoutManager) {
return (((LinearLayoutManager) layoutManager).findLastCompletelyVisibleItemPosition());
} else {
return RecyclerView.NO_POSITION;
}
}
public static int getSynchronizedPosition(RecyclerView.ViewHolder holder) {
int pos1 = holder.getLayoutPosition();
int pos2 = holder.getAdapterPosition();
if (pos1 == pos2) {
return pos1;
} else {
return RecyclerView.NO_POSITION;
}
}
}