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; } }