blob: 0bc6b96d7c0af1fa83b456abbe382b1e64255181 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.apache.weex.ui.view.listview;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.content.Context;
import android.os.Build;
import android.support.annotation.Nullable;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.OrientationHelper;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.MotionEvent;
import org.apache.weex.common.Constants;
import org.apache.weex.common.WXThread;
import org.apache.weex.ui.view.gesture.WXGesture;
import org.apache.weex.ui.view.gesture.WXGestureObservable;
public class WXRecyclerView extends RecyclerView implements WXGestureObservable {
public static final int TYPE_LINEAR_LAYOUT = 1;
public static final int TYPE_GRID_LAYOUT = 2;
public static final int TYPE_STAGGERED_GRID_LAYOUT = 3;
private WXGesture mGesture;
private boolean scrollable = true;
private boolean hasTouch = false;
public WXRecyclerView(Context context) {
super(context);
}
public boolean isScrollable() {
return scrollable;
}
public void setScrollable(boolean scrollable) {
this.scrollable = scrollable;
}
public void initView(Context context, int type,int orientation) {
initView(context,type, Constants.Value.COLUMN_COUNT_NORMAL,Constants.Value.COLUMN_GAP_NORMAL,orientation);
}
/**
*
* @param context
* @param type
* @param orientation should be {@link OrientationHelper#HORIZONTAL} or {@link OrientationHelper#VERTICAL}
*/
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
public void initView(Context context, int type, int columnCount, float columnGap, int orientation) {
if (type == TYPE_GRID_LAYOUT) {
setLayoutManager(new GridLayoutManager(context, columnCount,orientation,false));
} else if (type == TYPE_STAGGERED_GRID_LAYOUT) {
setLayoutManager(new ExtendedStaggeredGridLayoutManager(columnCount, orientation));
} else if (type == TYPE_LINEAR_LAYOUT) {
setLayoutManager(new ExtendedLinearLayoutManager(context,orientation,false));
}
}
@Override
public void registerGestureListener(@Nullable WXGesture wxGesture) {
mGesture = wxGesture;
}
@Override
public WXGesture getGestureListener() {
return mGesture;
}
@SuppressLint("ClickableViewAccessibility")
@Override
public boolean onTouchEvent(MotionEvent event) {
if(!scrollable) {
return true;
}
return super.onTouchEvent(event);
}
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
hasTouch = true;
boolean result = super.dispatchTouchEvent(event);
if (mGesture != null) {
result |= mGesture.onTouch(this, event);
}
return result;
}
public void scrollTo(boolean smooth, int position, final int offset, final int orientation){
if (!smooth) {
RecyclerView.LayoutManager layoutManager = getLayoutManager();
if (layoutManager instanceof LinearLayoutManager) {
//GridLayoutManager is also instance of LinearLayoutManager
((LinearLayoutManager) layoutManager).scrollToPositionWithOffset(position, -offset);
} else if (layoutManager instanceof StaggeredGridLayoutManager) {
((StaggeredGridLayoutManager) layoutManager).scrollToPositionWithOffset(position, -offset);
}
//Any else?
} else {
smoothScrollToPosition(position);
if (offset != 0) {
setOnSmoothScrollEndListener(new ExtendedLinearLayoutManager.OnSmoothScrollEndListener() {
@Override
public void onStop() {
post(WXThread.secure(new Runnable() {
@Override
public void run() {
if (orientation == Constants.Orientation.VERTICAL) {
smoothScrollBy(0, offset);
} else {
smoothScrollBy(offset, 0);
}
}
}));
}
});
}
}
}
public void setOnSmoothScrollEndListener(final ExtendedLinearLayoutManager.OnSmoothScrollEndListener onSmoothScrollEndListener){
addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
if (newState == RecyclerView.SCROLL_STATE_IDLE) {
recyclerView.removeOnScrollListener(this);
if(onSmoothScrollEndListener != null){
onSmoothScrollEndListener.onStop();
}
}
}
});
}
}