blob: 83edc06d6cc82fcde324de1ced075e740e8af794 [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;
import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.view.ViewGroup;
import org.apache.weex.WXEnvironment;
import org.apache.weex.utils.WXLogUtils;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class WXCirclePageAdapter extends PagerAdapter {
/**
* Subviews
*/
private List<View> views = new ArrayList<>();
private List<View> shadow = new ArrayList<>();
private boolean needLoop = true;
public boolean isRTL = false;
private List<View> originalViews = new ArrayList<>();
public WXCirclePageAdapter(List<View> views, boolean needLoop) {
super();
this.views = new ArrayList<>(views);
this.originalViews = new ArrayList<>(views);
this.needLoop = needLoop;
}
public void setLayoutDirectionRTL(boolean isRTL) {
if (isRTL == this.isRTL) return;
this.isRTL = isRTL;
this.views = new ArrayList<>(this.originalViews);
if (isRTL) {
Collections.reverse(this.views);
}
ensureShadow();
}
public WXCirclePageAdapter() {
this(true);
}
public WXCirclePageAdapter(boolean needLoop) {
super();
this.needLoop = needLoop;
}
public void addPageView(View view) {
if (WXEnvironment.isApkDebugable()) {
WXLogUtils.d("onPageSelected >>>> addPageView");
}
originalViews.add(view);
if (this.isRTL) {
views.add(0, view);
} else {
views.add(view);
}
ensureShadow();
}
public void removePageView(View view) {
if (WXEnvironment.isApkDebugable()) {
WXLogUtils.d("onPageSelected >>>> removePageView");
}
views.remove(view);
originalViews.remove(view);
ensureShadow();
}
public void replacePageView(View oldView, View newView) {
if (WXEnvironment.isApkDebugable()) {
WXLogUtils.d("onPageSelected >>>> replacePageView");
}
int index = views.indexOf(oldView);
views.remove(index);
views.add(index, newView);
ensureShadow();
index = originalViews.indexOf(oldView);
originalViews.remove(index);
originalViews.add(index, newView);
}
@Override
public int getCount() {
return shadow.size();
}
public int getRealCount() {
return views.size();
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
View pageView = null;
try {
pageView = shadow.get(position);
if (WXEnvironment.isApkDebugable()) {
WXLogUtils.d("onPageSelected >>>> instantiateItem >>>>> position:" + position + ",position % getRealCount()" + position % getRealCount());
}
if (pageView.getParent() == null) {
container.addView(pageView);
} else {
((ViewGroup) pageView.getParent()).removeView(pageView);
container.addView(pageView);
}
} catch (Exception e) {
WXLogUtils.e("[CirclePageAdapter] instantiateItem: ", e);
}
return pageView;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
if (WXEnvironment.isApkDebugable()) {
WXLogUtils.d("onPageSelected >>>> destroyItem >>>>> position:" + position);
}
// container.removeView((View) object);
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
public int getPagePosition(View page) {
return views.indexOf(page);
}
public int getItemIndex(Object object) {
if (object instanceof View) {
return views.indexOf(object);
} else {
return -1;
}
}
public List<View> getViews(){
return views;
}
private void ensureShadow() {
List<View> temp = new ArrayList<>();
if (needLoop && views.size() > 2) {
temp.add(0, views.get(views.size() - 1));
for (View view : views) {
temp.add(view);
}
temp.add(views.get(0));
} else {
temp.addAll(views);
}
shadow.clear();
notifyDataSetChanged();
shadow.addAll(temp);
notifyDataSetChanged();
}
public int getRealPosition(int shadowPosition) {
if (shadowPosition < 0 || shadowPosition >= shadow.size()) {
return -1;
} else {
return getItemIndex(shadow.get(shadowPosition));
}
}
public int getFirst() {
if (needLoop && views.size() > 2) {
return 1;
} else {
return 0;
}
}
}