package com.wenming.weiswift.ui.login.fragment.home; import android.app.Activity; import android.content.Context; import android.graphics.Rect; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; import com.wenming.weiswift.R; import com.wenming.weiswift.entity.Status; import com.wenming.weiswift.mvp.presenter.HomeFragmentPresent; import com.wenming.weiswift.mvp.presenter.WeiBoArrowPresent2; import com.wenming.weiswift.mvp.presenter.imp.HomeFragmentPresentImp; import com.wenming.weiswift.mvp.view.HomeFragmentView; import com.wenming.weiswift.ui.common.BarManager; import com.wenming.weiswift.ui.common.dialog.ArrowDialog; import com.wenming.weiswift.ui.common.login.Constants; import com.wenming.weiswift.ui.login.fragment.home.groupwindow.GroupPopWindow; import com.wenming.weiswift.ui.login.fragment.home.groupwindow.IGroupItemClick; import com.wenming.weiswift.ui.login.fragment.home.weiboitem.HomeHeadView; import com.wenming.weiswift.ui.login.fragment.home.weiboitem.TimelineArrowWindow; import com.wenming.weiswift.ui.login.fragment.home.weiboitem.WeiboAdapter; import com.wenming.weiswift.utils.DensityUtil; import com.wenming.weiswift.utils.ScreenUtil; import com.wenming.weiswift.widget.endlessrecyclerview.EndlessRecyclerOnScrollListener; import com.wenming.weiswift.widget.endlessrecyclerview.HeaderAndFooterRecyclerViewAdapter; import com.wenming.weiswift.widget.endlessrecyclerview.RecyclerViewUtils; import com.wenming.weiswift.widget.endlessrecyclerview.utils.RecyclerViewStateUtils; import com.wenming.weiswift.widget.endlessrecyclerview.weight.LoadingFooter; import java.util.ArrayList; /** * Created by wenmingvs on 16/4/27. */ public class HomeFragment extends Fragment implements HomeFragmentView, ArrowDialog.onDialogButtonClick { private ArrayList<Status> mDatas; public Context mContext; public Activity mActivity; public View mView; private LinearLayout mGroup; public RecyclerView mRecyclerView; public TextView mUserNameTextView; public TextView mErrorMessage; public SwipeRefreshLayout mSwipeRefreshLayout; public WeiboAdapter mAdapter; private HeaderAndFooterRecyclerViewAdapter mHeaderAndFooterRecyclerViewAdapter; private HomeFragmentPresent mHomePresent; private long mCurrentGroup = Constants.GROUP_TYPE_ALL; private LinearLayout mEmptyLayout; private GroupPopWindow mPopWindow; private boolean mComeFromAccoutActivity; private String mUserName; /** * 顶部导航栏 */ private RelativeLayout mTopBar; /** * 手指滑动距离多少个像素点的距离,才隐藏bar */ private static final int HIDE_THRESHOLD = 80; /** * 记录手指滑动的距离 */ private int mScrolledDistance = 0; /** * 记录bar是否显示或者隐藏 */ private boolean mControlsVisible = true; private onButtonBarListener mOnBottonBarListener; public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mActivity = getActivity(); mContext = getContext(); mHomePresent = new HomeFragmentPresentImp(this); mComeFromAccoutActivity = getArguments().getBoolean("comeFromAccoutActivity"); mView = inflater.inflate(R.layout.mainfragment_layout, container, false); mRecyclerView = (RecyclerView) mView.findViewById(R.id.weiboRecyclerView); mTopBar = (RelativeLayout) mView.findViewById(R.id.toolbar_home); mGroup = (LinearLayout) mView.findViewById(R.id.group); mUserNameTextView = (TextView) mView.findViewById(R.id.name); mEmptyLayout = (LinearLayout) mView.findViewById(R.id.emptydeault_layout); mErrorMessage = (TextView) mView.findViewById(R.id.errorMessage); mSwipeRefreshLayout = (SwipeRefreshLayout) mView.findViewById(R.id.swipe_refresh_widget); initRecyclerView(); initRefreshLayout(); initGroupWindows(); mSwipeRefreshLayout.post(new Runnable() { @Override public void run() { mHomePresent.refreshUserName(mContext); if (mComeFromAccoutActivity) { mHomePresent.firstLoadData(mContext, true); } else { mHomePresent.firstLoadData(mContext, mActivity.getIntent().getBooleanExtra("fisrtstart", false)); } } }); return mView; } @Override public void onDestroyView() { mHomePresent.cancelTimer(); if (mPopWindow != null) { mPopWindow.onDestory(); } super.onDestroyView(); } public HomeFragment() { } /** * 静态工厂方法需要一个int型的值来初始化fragment的参数, * 然后返回新的fragment到调用者 */ public static HomeFragment newInstance(boolean comeFromAccoutActivity) { HomeFragment homeFragment = new HomeFragment(); Bundle args = new Bundle(); args.putBoolean("comeFromAccoutActivity", comeFromAccoutActivity); homeFragment.setArguments(args); return homeFragment; } public void initRecyclerView() { mDatas = new ArrayList<>(); mAdapter = new WeiboAdapter(mDatas, mContext) { @Override public void arrowClick(Status status, int position) { // TimelineArrowWindow popupWindow = new TimelineArrowWindow(mContext, mDatas.get(position), mAdapter, position, mUserNameTextView.getText().toString()); // popupWindow.showAtLocation(mRecyclerView, Gravity.CENTER, 0, 0); ArrowDialog arrowDialog = new TimelineArrowWindow.Builder(mContext, mDatas.get(position), mAdapter, position, mUserNameTextView.getText().toString()) .setCanceledOnTouchOutside(true) .setCancelable(true) .create(); int width = ScreenUtil.getScreenWidth(mContext) - DensityUtil.dp2px(mContext, 80); arrowDialog.setOnDialogButtonClick(HomeFragment.this); arrowDialog.show(); arrowDialog.getWindow().setLayout(width, (ViewGroup.LayoutParams.WRAP_CONTENT)); } }; mHeaderAndFooterRecyclerViewAdapter = new HeaderAndFooterRecyclerViewAdapter(mAdapter); LinearLayoutManager layoutManager = new LinearLayoutManager(mContext, LinearLayoutManager.VERTICAL, false); mRecyclerView.setLayoutManager(layoutManager); mRecyclerView.setAdapter(mHeaderAndFooterRecyclerViewAdapter); RecyclerViewUtils.setHeaderView(mRecyclerView, new HomeHeadView(mContext)); } private void initRefreshLayout() { mSwipeRefreshLayout.setColorSchemeResources(android.R.color.holo_blue_bright, android.R.color.holo_green_light, android.R.color.holo_orange_light, android.R.color.holo_red_light); mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { mHomePresent.pullToRefreshData(mCurrentGroup, mContext); } }); mSwipeRefreshLayout.setProgressViewOffset(false, DensityUtil.dp2px(mContext, 10), DensityUtil.dp2px(mContext, 10 + 65)); } private void initGroupWindows() { mGroup.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Rect rect = new Rect(); getActivity().getWindow().getDecorView().getWindowVisibleDisplayFrame(rect); int statusBarHeight = rect.top; mPopWindow = GroupPopWindow.getInstance(mContext, ScreenUtil.getScreenWidth(mContext) * 3 / 5, ScreenUtil.getScreenHeight(mContext) * 2 / 3); mPopWindow.showAtLocation(mUserNameTextView, Gravity.TOP | Gravity.CENTER_HORIZONTAL, 0, mUserNameTextView.getHeight() + statusBarHeight + DensityUtil.dp2px(mContext, 8)); mPopWindow.setOnGroupItemClickListener(new IGroupItemClick() { @Override public void onGroupItemClick(int position, long groupId, String groupName) { mCurrentGroup = groupId; if (groupId != Constants.GROUP_TYPE_ALL) { setGroupName(groupName); } else { setGroupName(mUserName); } mPopWindow.dismiss(); mHomePresent.pullToRefreshData(groupId, mContext); } }); if (mPopWindow.isShowing()) { mPopWindow.scrollToSelectIndex(); } } }); } /** * 把列表滑动到顶部,refreshDrata为true的话,会同时获取更新的数据 * * @param refreshData */ @Override public void scrollToTop(boolean refreshData) { mRecyclerView.scrollToPosition(0); if (refreshData) { mRecyclerView.post(new Runnable() { @Override public void run() { mHomePresent.pullToRefreshData(mCurrentGroup, mContext); } }); } } @Override public void showRecyclerView() { if (mSwipeRefreshLayout.getVisibility() != View.VISIBLE) { mSwipeRefreshLayout.setVisibility(View.VISIBLE); } } @Override public void hideRecyclerView() { if (mSwipeRefreshLayout.getVisibility() != View.GONE) { mSwipeRefreshLayout.setVisibility(View.GONE); } } @Override public void showEmptyBackground(String text) { if (mEmptyLayout.getVisibility() != View.VISIBLE) { mEmptyLayout.setVisibility(View.VISIBLE); mErrorMessage.setText(text); } } @Override public void hideEmptyBackground() { if (mEmptyLayout.getVisibility() != View.GONE) { mEmptyLayout.setVisibility(View.GONE); } } @Override public void popWindowsDestory() { if (mPopWindow != null) { mPopWindow.onDestory(); } } @Override public void updateListView(ArrayList<Status> statuselist) { mRecyclerView.addOnScrollListener(mOnScrollListener); mDatas = statuselist; mAdapter.setData(statuselist); mHeaderAndFooterRecyclerViewAdapter.notifyDataSetChanged(); } @Override public void showLoadingIcon() { mSwipeRefreshLayout.post(new Runnable() { @Override public void run() { mSwipeRefreshLayout.setRefreshing(true); } }); } @Override public void hideLoadingIcon() { mSwipeRefreshLayout.post(new Runnable() { @Override public void run() { mSwipeRefreshLayout.setRefreshing(false); } }); } @Override public void showLoadFooterView() { RecyclerViewStateUtils.setFooterViewState(mActivity, mRecyclerView, mDatas.size(), LoadingFooter.State.Loading, null); } @Override public void hideFooterView() { RecyclerViewStateUtils.setFooterViewState(mRecyclerView, LoadingFooter.State.Normal); } @Override public void showEndFooterView() { RecyclerViewStateUtils.setFooterViewState(mRecyclerView, LoadingFooter.State.TheEnd); } @Override public void showErrorFooterView() { RecyclerViewStateUtils.setFooterViewState(mRecyclerView, LoadingFooter.State.NetWorkError); } @Override public void setGroupName(String userName) { mUserNameTextView.setText(userName); if (mGroup.getVisibility() != View.VISIBLE) { mGroup.setVisibility(View.VISIBLE); } } /** * 设置顶部导航栏的用户名 * * @param userName */ @Override public void setUserName(String userName) { mUserName = userName; } public EndlessRecyclerOnScrollListener mOnScrollListener = new EndlessRecyclerOnScrollListener() { @Override public void onLoadNextPage(View view) { super.onLoadNextPage(view); if (mDatas != null && mDatas.size() > 0) { showLoadFooterView(); mHomePresent.requestMoreData(mCurrentGroup, mContext); } } @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); //手指向上滑动 if (mScrolledDistance > HIDE_THRESHOLD && mControlsVisible) { if (mOnBottonBarListener != null) { hideTopBar(); mOnBottonBarListener.hideButtonBar(); } mControlsVisible = false; mScrolledDistance = 0; } //手指向下滑动 else if (mScrolledDistance < -HIDE_THRESHOLD && !mControlsVisible) { if (mOnBottonBarListener != null) { showTopBar(); mOnBottonBarListener.showButtonBar(); } mControlsVisible = true; mScrolledDistance = 0; } if ((mControlsVisible && dy > 0) || (!mControlsVisible && dy < 0)) { mScrolledDistance += dy; } } }; @Override public void onHiddenChanged(boolean hidden) { super.onHiddenChanged(hidden); if (!hidden) { showTopBar(); mOnBottonBarListener.showButtonBar(); mControlsVisible = true; } } /** * 隐藏底部导航栏 */ public void hideTopBar() { BarManager barManager = new BarManager(mContext); barManager.hideTopBar(mTopBar); } /** * 显示顶部导航栏 */ public void showTopBar() { BarManager barManager = new BarManager(mContext); barManager.showTopBar(mTopBar); } /** * 设置实现 * * @param onBarListener */ public void setOnBarListener(onButtonBarListener onBarListener) { this.mOnBottonBarListener = onBarListener; } @Override public void onDeleteButtonClick(Status status, int position, WeiBoArrowPresent2 weiBoArrowPresent2, TextView deleteTextView) { } @Override public void onFriendShipButtonClick(Status status, int position, WeiBoArrowPresent2 weiBoArrowPresent2, TextView friendShipTextView) { } /** * 设置收藏按钮要执行的事件 * * @param status * @param position * @param weiBoArrowPresent2 * @param favoriteTextView */ @Override public void onFavoriteButtonClick(final Status status, final int position, final WeiBoArrowPresent2 weiBoArrowPresent2, TextView favoriteTextView) { if (status.favorited) { favoriteTextView.setText("取消收藏"); weiBoArrowPresent2.cancalFavorite(position, status, mContext, false); } else { favoriteTextView.setText("收藏"); weiBoArrowPresent2.createFavorite(status, mContext); } } /** * 因为ButotnBar的布局并不在fragment中,而是在MainActivity中,所有隐藏和显示底部导航栏的工作要交给MainActivity去做 */ public interface onButtonBarListener { void showButtonBar(); void hideButtonBar(); } }