package me.weyye.todaynews.ui.view;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.DialogFragment;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.helper.ItemTouchHelper;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.chad.library.adapter.base.BaseViewHolder;
import com.orhanobut.logger.Logger;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import me.weyye.todaynews.R;
import me.weyye.todaynews.listener.ItemDragHelperCallBack;
import me.weyye.todaynews.listener.OnChannelDragListener;
import me.weyye.todaynews.listener.OnChannelListener;
import me.weyye.todaynews.model.Channel;
import me.weyye.todaynews.ui.adapter.ChannelAdapter;
import me.weyye.todaynews.utils.ConstanceValue;
import static me.weyye.todaynews.model.Channel.TYPE_MY_CHANNEL;
/**
* Created by Administrator on 2017/4/18 0018.
*/
public class ChannelDialogFragment extends DialogFragment implements OnChannelDragListener {
private List<Channel> mDatas = new ArrayList<>();
private ChannelAdapter mAdapter;
@BindView(R.id.recyclerView)
RecyclerView mRecyclerView;
private ItemTouchHelper mHelper;
private OnChannelListener mOnChannelListener;
public void setOnChannelListener(OnChannelListener onChannelListener) {
mOnChannelListener = onChannelListener;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(DialogFragment.STYLE_NORMAL, android.R.style.Theme_Black_NoTitleBar);
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
Dialog dialog = getDialog();
if (dialog != null) {
//添加动画
dialog.getWindow().setWindowAnimations(R.style.dialogSlideAnim);
}
return inflater.inflate(R.layout.activity_channel, null);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
ButterKnife.bind(this, view);
processLogic();
}
public static ChannelDialogFragment newInstance(List<Channel> selectedDatas, List<Channel> unselectedDatas) {
ChannelDialogFragment dialogFragment = new ChannelDialogFragment();
Bundle bundle = new Bundle();
bundle.putSerializable(ConstanceValue.DATA_SELECTED, (Serializable) selectedDatas);
bundle.putSerializable(ConstanceValue.DATA_UNSELECTED, (Serializable) unselectedDatas);
dialogFragment.setArguments(bundle);
return dialogFragment;
}
private void setDataType(List<Channel> datas, int type) {
for (int i = 0; i < datas.size(); i++) {
datas.get(i).setItemType(type);
}
}
private void processLogic() {
mDatas.add(new Channel(Channel.TYPE_MY, "我的频道", ""));
Bundle bundle = getArguments();
List<Channel> selectedDatas = (List<Channel>) bundle.getSerializable(ConstanceValue.DATA_SELECTED);
List<Channel> unselectedDatas = (List<Channel>) bundle.getSerializable(ConstanceValue.DATA_UNSELECTED);
setDataType(selectedDatas, Channel.TYPE_MY_CHANNEL);
setDataType(unselectedDatas, Channel.TYPE_OTHER_CHANNEL);
mDatas.addAll(selectedDatas);
mDatas.add(new Channel(Channel.TYPE_OTHER, "频道推荐", ""));
mDatas.addAll(unselectedDatas);
mAdapter = new ChannelAdapter(mDatas);
GridLayoutManager manager = new GridLayoutManager(getActivity(), 4);
mRecyclerView.setLayoutManager(manager);
mRecyclerView.setAdapter(mAdapter);
manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
int itemViewType = mAdapter.getItemViewType(position);
return itemViewType == TYPE_MY_CHANNEL || itemViewType == Channel.TYPE_OTHER_CHANNEL ? 1 : 4;
}
});
ItemDragHelperCallBack callBack = new ItemDragHelperCallBack(this);
mHelper = new ItemTouchHelper(callBack);
mAdapter.setOnChannelDragListener(this);
//attachRecyclerView
mHelper.attachToRecyclerView(mRecyclerView);
}
@OnClick(R.id.icon_collapse)
public void onClick(View v) {
dismiss();
}
private DialogInterface.OnDismissListener mOnDismissListener;
public void setOnDismissListener(DialogInterface.OnDismissListener onDismissListener) {
mOnDismissListener = onDismissListener;
}
@Override
public void onDismiss(DialogInterface dialog) {
super.onDismiss(dialog);
if (mOnDismissListener != null)
mOnDismissListener.onDismiss(dialog);
}
@Override
public void onStarDrag(BaseViewHolder baseViewHolder) {
//开始拖动
Logger.i("开始拖动");
mHelper.startDrag(baseViewHolder);
}
@Override
public void onItemMove(int starPos, int endPos) {
// if (starPos < 0||endPos<0) return;
//我的频道之间移动
if (mOnChannelListener != null)
mOnChannelListener.onItemMove(starPos - 1, endPos - 1);//去除标题所占的一个index
onMove(starPos, endPos);
}
private void onMove(int starPos, int endPos) {
Channel startChannel = mDatas.get(starPos);
//先删除之前的位置
mDatas.remove(starPos);
//添加到现在的位置
mDatas.add(endPos, startChannel);
mAdapter.notifyItemMoved(starPos, endPos);
}
@Override
public void onMoveToMyChannel(int starPos, int endPos) {
//移动到我的频道
onMove(starPos, endPos);
if (mOnChannelListener != null)
mOnChannelListener.onMoveToMyChannel(starPos - 1 - mAdapter.getMyChannelSize(), endPos - 1);
}
@Override
public void onMoveToOtherChannel(int starPos, int endPos) {
//移动到推荐频道
onMove(starPos, endPos);
if (mOnChannelListener != null)
mOnChannelListener.onMoveToOtherChannel(starPos - 1, endPos - 2 - mAdapter.getMyChannelSize());
}
}