package com.c9mj.platform.explore.ui;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.content.Context;
import android.graphics.Canvas;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.content.ContextCompat;
import android.support.v4.view.ViewPager;
import android.support.v7.widget.CardView;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.helper.ItemTouchHelper;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.view.animation.BounceInterpolator;
import android.widget.ImageView;
import android.widget.ScrollView;
import android.widget.TextView;
import com.blankj.utilcode.utils.SizeUtils;
import com.c9mj.platform.App;
import com.c9mj.platform.R;
import com.c9mj.platform.explore.adapter.ExploreSelectedTitleListAdapter;
import com.c9mj.platform.explore.adapter.ExploreUnSelectedTitleListAdapter;
import com.c9mj.platform.util.global.FragmentAdapter;
import com.c9mj.platform.util.global.Constants;
import com.c9mj.platform.widget.fragment.BaseFragment;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.chad.library.adapter.base.callback.ItemDragAndSwipeCallback;
import com.chad.library.adapter.base.listener.OnItemChildClickListener;
import com.chad.library.adapter.base.listener.OnItemDragListener;
import com.chad.library.adapter.base.listener.OnItemSwipeListener;
import net.lucode.hackware.magicindicator.MagicIndicator;
import net.lucode.hackware.magicindicator.ViewPagerHelper;
import net.lucode.hackware.magicindicator.buildins.UIUtil;
import net.lucode.hackware.magicindicator.buildins.commonnavigator.CommonNavigator;
import net.lucode.hackware.magicindicator.buildins.commonnavigator.abs.CommonNavigatorAdapter;
import net.lucode.hackware.magicindicator.buildins.commonnavigator.abs.IPagerIndicator;
import net.lucode.hackware.magicindicator.buildins.commonnavigator.abs.IPagerTitleView;
import net.lucode.hackware.magicindicator.buildins.commonnavigator.indicators.LinePagerIndicator;
import net.lucode.hackware.magicindicator.buildins.commonnavigator.titles.ClipPagerTitleView;
import net.lucode.hackware.magicindicator.buildins.commonnavigator.titles.CommonPagerTitleView;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
/**
* author: LMJ
* date: 2016/9/1
*/
public class ExploreFragment extends BaseFragment implements OnItemDragListener, OnItemSwipeListener {
private final List<Fragment> fragmentList = new ArrayList<>();
@BindView(R.id.magic_indicator)
MagicIndicator indicator;
@BindView(R.id.viewpager)
ViewPager viewPager;
//用于展开显示栏目切换
@BindView(R.id.tv_section)
TextView tv_section;
@BindView(R.id.scroll_view)
ScrollView scrollView;
@BindView(R.id.iv_expandable)
ImageView iv_expandable;
//栏目切换的Top列表
@BindView(R.id.recyclerview_selected)
RecyclerView rv_selected;
//栏目切换的Bottom列表
@BindView(R.id.recyclerview_unselected)
RecyclerView rv_unselected;
private String[] idArray;
private String[] aliasArray;
private String[] enameArray;
private String[] tnameArray;
private String titleString = "";//用于保存记录所有栏目
private String selectedTitleString;//用于保存记录已选择栏目
private String unselectedTitleString;//用于保存记录未选择栏目
private List<String> titleList = new ArrayList<>();//所有TitleList
private List<String> selectedTitleList = new ArrayList<>();//编辑模式下的已选择Tab的TitleList
private List<String> unSelectedTitleList = new ArrayList<>();//编辑模式下的未选择Tab的TitleList
private Context context;
private CommonNavigator navigator;
private FragmentAdapter fragmentAdapter;
private boolean isExpanded = false;
private ExploreSelectedTitleListAdapter selectedAdapter;
private ExploreUnSelectedTitleListAdapter unselectedAdapter;
public static ExploreFragment newInstance() {
ExploreFragment fragment = new ExploreFragment();
Bundle args = new Bundle();
fragment.setArguments(args);
return fragment;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_explore, container, false);
ButterKnife.bind(this, view);
context = view.getContext();
return view;
}
@Override
public void onLazyInitView(@Nullable Bundle savedInstanceState) {
super.onLazyInitView(savedInstanceState);
initView();
}
private void initView() {
//初始化MVP
//设置RefreshLayout
/***设置其他View***/
//不同栏目分组
idArray = context.getResources().getStringArray(R.array.explore_type_id);
aliasArray = context.getResources().getStringArray(R.array.explore_type_alias);
enameArray = context.getResources().getStringArray(R.array.explore_type_ename);
tnameArray = context.getResources().getStringArray(R.array.explore_type_tname);
iv_expandable.setImageResource(isExpanded ? R.drawable.ic_expand_close : R.drawable.ic_expand_open);
tv_section.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
ObjectAnimator animator0 = ObjectAnimator.ofFloat(tv_section, "translationX", tv_section.getWidth());
ObjectAnimator animator1 = ObjectAnimator.ofFloat(scrollView, "translationY", -scrollView.getHeight());
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.playTogether(animator0, animator1);
animatorSet.setDuration(0);
animatorSet.start();
tv_section.getViewTreeObserver().removeOnGlobalLayoutListener(this);//得到后取消监听
}
});
if (TextUtils.isEmpty(App.getSpUtils().getString(Constants.STRING_TITLE))) {
for (String aTnameArray : tnameArray) {
titleString = titleString + aTnameArray + ":";
}
App.getSpUtils().putString(Constants.STRING_TITLE, titleString);
} else {
titleString = App.getSpUtils().getString(Constants.STRING_TITLE);
}
//得到所保存的Seclected&UnSelected的Title信息
selectedTitleString = App.getSpUtils().getString(Constants.STRING_TITLE_SELECTED);
unselectedTitleString = App.getSpUtils().getString(Constants.STRING_TITLE_UNSELECTED);
//初始化,已选择栏目&未选择栏目
if (TextUtils.isEmpty(selectedTitleString) || TextUtils.isEmpty(unselectedTitleString)) {
selectedTitleString = unselectedTitleString = "";
App.getSpUtils().putString(Constants.STRING_TITLE_SELECTED, "");
App.getSpUtils().putString(Constants.STRING_TITLE_UNSELECTED, "");
for (int i = 0; i < tnameArray.length; i++) {
if (i < tnameArray.length / 2) {
selectedTitleString = selectedTitleString + tnameArray[i] + ":";
} else {
unselectedTitleString = unselectedTitleString + tnameArray[i] + ":";
}
}
App.getSpUtils().putString(Constants.STRING_TITLE_SELECTED, selectedTitleString);
App.getSpUtils().putString(Constants.STRING_TITLE_UNSELECTED, unselectedTitleString);
}
//Title之间以:进行区分, 得到List
titleList = parseStringToListByColons(titleString);
selectedTitleList = parseStringToListByColons(selectedTitleString);
unSelectedTitleList = parseStringToListByColons(unselectedTitleString);
//设置栏目RecyclerView
selectedAdapter = new ExploreSelectedTitleListAdapter(selectedTitleList);
unselectedAdapter = new ExploreUnSelectedTitleListAdapter(unSelectedTitleList);
ItemDragAndSwipeCallback itemDragAndSwipeCallback = new ItemDragAndSwipeCallback(selectedAdapter);
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(itemDragAndSwipeCallback);
itemTouchHelper.attachToRecyclerView(rv_selected);
// 开启拖拽
selectedAdapter.enableDragItem(itemTouchHelper, R.id.cardview, true);
selectedAdapter.setOnItemDragListener(this);
// 开启滑动删除
selectedAdapter.enableSwipeItem();
selectedAdapter.setOnItemSwipeListener(this);
rv_unselected.addOnItemTouchListener(new OnItemChildClickListener() {
@Override
public void onSimpleItemChildClick(BaseQuickAdapter adapter, View view, int position) {
selectedAdapter.add(selectedAdapter.getData().size(), unselectedAdapter.getItem(position));
int index = titleList.indexOf(unSelectedTitleList.get(position));
String explore_type_id = idArray[index];
fragmentList.add(ExploreListFragment.newInstance(explore_type_id));
unselectedAdapter.remove(position);
navigator.notifyDataSetChanged(); // must call firstly
fragmentAdapter.notifyDataSetChanged();
}
});
rv_selected.setLayoutManager(new GridLayoutManager(context, 4));
rv_unselected.setLayoutManager(new GridLayoutManager(context, 4));
rv_selected.setAdapter(selectedAdapter);
rv_unselected.setAdapter(unselectedAdapter);
//ViewPager + Indicator
for (int i = 0; i < selectedTitleList.size(); i++) {
int index = titleList.indexOf(selectedTitleList.get(i));
String explore_type_id = idArray[index];
fragmentList.add(ExploreListFragment.newInstance(explore_type_id));
}
fragmentAdapter = new FragmentAdapter(this.getChildFragmentManager(), fragmentList);
viewPager.setAdapter(fragmentAdapter);
viewPager.setOffscreenPageLimit(2);
navigator = new CommonNavigator(context);
navigator.setAdjustMode(false);
navigator.setIndicatorOnTop(true);
navigator.setSkimOver(true);
navigator.setScrollPivotX(0.2f);
CommonNavigatorAdapter navigatorAdapter = new CommonNavigatorAdapter() {
@Override
public int getCount() {
return selectedTitleList == null ? 0 : selectedTitleList.size();
}
@Override
public IPagerTitleView getTitleView(final Context context, final int index) {
if (Build.VERSION.SDK_INT >= 21) {
ClipPagerTitleView clipPagerTitleView = new ClipPagerTitleView(context);
clipPagerTitleView.setText(selectedTitleList.get(index));
clipPagerTitleView.setBackground(ContextCompat.getDrawable(context, R.drawable.ripple_tab));
clipPagerTitleView.setTextSize(SizeUtils.sp2px(12));
clipPagerTitleView.setTextColor(ContextCompat.getColor(context, R.color.color_secondary_text));
clipPagerTitleView.setClipColor(ContextCompat.getColor(context, R.color.color_primary));
clipPagerTitleView.setOnClickListener(v -> viewPager.setCurrentItem(index));
return clipPagerTitleView;
}
CommonPagerTitleView commonPagerTitleView = new CommonPagerTitleView(context);
commonPagerTitleView.setContentView(R.layout.item_explore_tab_indicator_layout);//加载自定义布局作为Tab
final TextView tab_textview = (TextView) commonPagerTitleView.findViewById(R.id.tab_text);
tab_textview.setText(selectedTitleList.get(index));
commonPagerTitleView.setOnPagerTitleChangeListener(new CommonPagerTitleView.OnPagerTitleChangeListener() {
@Override
public void onSelected(int i, int i1) {
tab_textview.setTextColor(ContextCompat.getColor(context, R.color.color_primary));
}
@Override
public void onDeselected(int i, int i1) {
tab_textview.setTextColor(ContextCompat.getColor(context, R.color.color_secondary_text));
}
@Override
public void onLeave(int i, int i1, float v, boolean b) {
}
@Override
public void onEnter(int i, int i1, float v, boolean b) {
}
});
commonPagerTitleView.setOnClickListener(v -> viewPager.setCurrentItem(index));
return commonPagerTitleView;
}
@Override
public IPagerIndicator getIndicator(Context context) {
LinePagerIndicator indicator = new LinePagerIndicator(context);
indicator.setMode(LinePagerIndicator.MODE_WRAP_CONTENT);
indicator.setLineHeight(UIUtil.dip2px(context, 2));
indicator.setRoundRadius(UIUtil.dip2px(context, 2));
indicator.setYOffset(UIUtil.dip2px(context, 0.5));
indicator.setColors(ContextCompat.getColor(context, R.color.color_primary));
return indicator;
}
};
navigator.setAdapter(navigatorAdapter);
indicator.setNavigator(navigator);
ViewPagerHelper.bind(indicator, viewPager);
}
@OnClick({
R.id.iv_expandable,
R.id.tv_section,
R.id.scroll_view
})
public void onClick(View view) {
switch (view.getId()) {
case R.id.iv_expandable:
navigator.notifyDataSetChanged(); // must call firstly
fragmentAdapter.notifyDataSetChanged();
isExpanded = !isExpanded;
iv_expandable.setImageResource(isExpanded ? R.drawable.ic_expand_close : R.drawable.ic_expand_open);
//栏目切换的动画
ObjectAnimator animator0 = ObjectAnimator.ofFloat(tv_section, "translationX", isExpanded ? 0 : tv_section.getWidth());
ObjectAnimator animator1 = ObjectAnimator.ofFloat(scrollView, "translationY", isExpanded ? 0 : -scrollView.getHeight());
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.playTogether(animator0, animator1);
animatorSet.setDuration(500);
animatorSet.setInterpolator(new BounceInterpolator());
animatorSet.start();
//保存已选择&未选择的栏目列表
selectedTitleString = parseListToStringByColons(selectedTitleList);
unselectedTitleString = parseListToStringByColons(unSelectedTitleList);
App.getSpUtils().putString(Constants.STRING_TITLE_SELECTED, selectedTitleString);
App.getSpUtils().putString(Constants.STRING_TITLE_UNSELECTED, unselectedTitleString);
break;
case R.id.tv_section:
break;
case R.id.scroll_view:
break;
}
}
@Override
public void onItemDragStart(RecyclerView.ViewHolder viewHolder, int pos) {
BaseViewHolder holder = (BaseViewHolder) viewHolder;
CardView cardView = holder.getView(R.id.cardview);
cardView.setCardBackgroundColor(ContextCompat.getColor(context, R.color.color_accent));
}
@Override
public void onItemDragMoving(RecyclerView.ViewHolder viewHolder, int pos, RecyclerView.ViewHolder viewHolder1, int to) {
fragmentList.add(to, fragmentList.remove(pos));//拖拽移动fragment
}
@Override
public void onItemDragEnd(RecyclerView.ViewHolder viewHolder, int pos) {
BaseViewHolder holder = (BaseViewHolder) viewHolder;
CardView cardView = holder.getView(R.id.cardview);
cardView.setCardBackgroundColor(ContextCompat.getColor(context, R.color.color_primary));
}
@Override
public void onItemSwipeStart(RecyclerView.ViewHolder viewHolder, int pos) {
BaseViewHolder holder = (BaseViewHolder) viewHolder;
CardView cardView = holder.getView(R.id.cardview);
cardView.setCardBackgroundColor(ContextCompat.getColor(context, R.color.color_error));
}
@Override
public void clearView(RecyclerView.ViewHolder viewHolder, int pos) {
}
@Override
public void onItemSwiped(RecyclerView.ViewHolder viewHolder, int pos) {
unselectedAdapter.add(unselectedAdapter.getData().size(), selectedAdapter.getItem(pos));
fragmentList.remove(pos);
navigator.notifyDataSetChanged(); // must call firstly
fragmentAdapter.notifyDataSetChanged();
}
@Override
public void onItemSwipeMoving(Canvas canvas, RecyclerView.ViewHolder viewHolder, float dX, float dY, boolean isCurrentlyActive) {
if (!isCurrentlyActive) {
BaseViewHolder holder = (BaseViewHolder) viewHolder;
CardView cardView = holder.getView(R.id.cardview);
cardView.setCardBackgroundColor(ContextCompat.getColor(context, R.color.color_primary));
}
}
/**
* 以:进行间隔区分,String->List
*/
private List<String> parseStringToListByColons(String result) {
List<String> resultList = new ArrayList<>();
String[] resultArray = result.split(":");
Collections.addAll(resultList, resultArray);
return resultList;
}
/**
* 以:进行间隔区分,List->String
*/
private String parseListToStringByColons(List<String> list) {
String resultString = "";
for (int i = 0; i < list.size(); i++) {
resultString = resultString + list.get(i) + ":";
}
return resultString;
}
}