content: package com.sunfusheng.StickyHeaderListView.ui;
  
  import android.app.Activity;
  import android.content.Context;
  import android.content.Intent;
  import android.os.Bundle;
  import android.os.Handler;
  import android.os.Message;
  import android.support.v7.app.AppCompatActivity;
  import android.view.View;
  import android.widget.AbsListView;
  import android.widget.FrameLayout;
  import android.widget.RelativeLayout;
  import android.widget.TextView;
  
  import com.sunfusheng.StickyHeaderListView.R;
  import com.sunfusheng.StickyHeaderListView.adapter.TravelingAdapter;
  import com.sunfusheng.StickyHeaderListView.model.ChannelEntity;
  import com.sunfusheng.StickyHeaderListView.model.FilterData;
  import com.sunfusheng.StickyHeaderListView.model.FilterEntity;
  import com.sunfusheng.StickyHeaderListView.model.FilterTwoEntity;
  import com.sunfusheng.StickyHeaderListView.model.OperationEntity;
  import com.sunfusheng.StickyHeaderListView.model.TravelingEntity;
  import com.sunfusheng.StickyHeaderListView.util.ColorUtil;
  import com.sunfusheng.StickyHeaderListView.util.DensityUtil;
  import com.sunfusheng.StickyHeaderListView.util.ModelUtil;
  import com.sunfusheng.StickyHeaderListView.view.FilterView;
  import com.sunfusheng.StickyHeaderListView.view.HeaderAdViewView;
  import com.sunfusheng.StickyHeaderListView.view.HeaderChannelViewView;
  import com.sunfusheng.StickyHeaderListView.view.HeaderDividerViewView;
  import com.sunfusheng.StickyHeaderListView.view.HeaderFilterViewView;
  import com.sunfusheng.StickyHeaderListView.view.HeaderOperationViewView;
  import com.sunfusheng.StickyHeaderListView.view.SmoothListView.SmoothListView;
  
  import java.util.ArrayList;
  import java.util.List;
  
  import butterknife.Bind;
  import butterknife.ButterKnife;
  
  /**
   * 作者：孙福生
   *
   * 个人博客：sunfusheng.com
   */
  public class MainActivity extends AppCompatActivity implements SmoothListView.ISmoothListViewListener {
  
      @Bind(R.id.listView)
      SmoothListView smoothListView;
      @Bind(R.id.fv_top_filter)
      FilterView fvTopFilter;
      @Bind(R.id.rl_bar)
      RelativeLayout rlBar;
      @Bind(R.id.tv_title)
      TextView tvTitle;
      @Bind(R.id.view_title_bg)
      View viewTitleBg;
      @Bind(R.id.view_action_more_bg)
      View viewActionMoreBg;
      @Bind(R.id.fl_action_more)
      FrameLayout flActionMore;
  
      private Context mContext;
      private Activity mActivity;
      private int mScreenHeight; // 屏幕高度
  
      private List<String> adList = new ArrayList<>(); // 广告数据
      private List<ChannelEntity> channelList = new ArrayList<>(); // 频道数据
      private List<OperationEntity> operationList = new ArrayList<>(); // 运营数据
      private List<TravelingEntity> travelingList = new ArrayList<>(); // ListView数据
  
      private HeaderAdViewView listViewAdHeaderView; // 广告视图
      private HeaderChannelViewView headerChannelView; // 频道视图
      private HeaderOperationViewView headerOperationViewView; // 运营视图
      private HeaderDividerViewView headerDividerViewView; // 分割线占位图
      private HeaderFilterViewView headerFilterViewView; // 分类筛选视图
      private FilterData filterData; // 筛选数据
      private TravelingAdapter mAdapter; // 主页数据
  
      private View itemHeaderAdView; // 从ListView获取的广告子View
      private View itemHeaderFilterView; // 从ListView获取的筛选子View
      private boolean isScrollIdle = true; // ListView是否在滑动
      private boolean isStickyTop = false; // 是否吸附在顶部
      private boolean isSmooth = false; // 没有吸附的前提下，是否在滑动
      private int titleViewHeight = 50; // 标题栏的高度
      private int filterPosition = -1; // 点击FilterView的位置：分类(0)、排序(1)、筛选(2)
  
      private int adViewHeight = 180; // 广告视图的高度
      private int adViewTopSpace; // 广告视图距离顶部的距离
  
      private int filterViewPosition = 4; // 筛选视图的位置
      private int filterViewTopSpace; // 筛选视图距离顶部的距离
  
      private Handler mHandler = new Handler() {
          @Override
          public void handleMessage(Message msg) {
              super.handleMessage(msg);
          }
      };
  
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
          ButterKnife.bind(this);
  
          initData();
          initView();
          initListener();
      }
  
      private void initData() {
          mContext = this;
          mActivity = this;
          mScreenHeight = DensityUtil.getWindowHeight(this);
  
          // 筛选数据
          filterData = new FilterData();
          filterData.setCategory(ModelUtil.getCategoryData());
          filterData.setSorts(ModelUtil.getSortData());
          filterData.setFilters(ModelUtil.getFilterData());
  
          // 广告数据
          adList = ModelUtil.getAdData();
  
          // 频道数据
          channelList = ModelUtil.getChannelData();
  
          // 运营数据
          operationList = ModelUtil.getOperationData();
  
          // ListView数据
          travelingList = ModelUtil.getTravelingData();
      }
  
      private void initView() {
          fvTopFilter.setVisibility(View.INVISIBLE);
  
          // 设置筛选数据
          fvTopFilter.setFilterData(mActivity, filterData);
  
          // 设置广告数据
          listViewAdHeaderView = new HeaderAdViewView(this);
          listViewAdHeaderView.fillView(adList, smoothListView);
  
          // 设置频道数据
          headerChannelView = new HeaderChannelViewView(this);
          headerChannelView.fillView(channelList, smoothListView);
  
          // 设置运营数据
          headerOperationViewView = new HeaderOperationViewView(this);
          headerOperationViewView.fillView(operationList, smoothListView);
  
          // 设置分割线
          headerDividerViewView = new HeaderDividerViewView(this);
          headerDividerViewView.fillView("", smoothListView);
  
          // 设置筛选数据
          headerFilterViewView = new HeaderFilterViewView(this);
          headerFilterViewView.fillView(new Object(), smoothListView);
  
          // 设置ListView数据
          mAdapter = new TravelingAdapter(this, travelingList);
          smoothListView.setAdapter(mAdapter);
  
          filterViewPosition = smoothListView.getHeaderViewsCount() - 1;
      }
  
      private void initListener() {
          // 关于
          flActionMore.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View v) {
                  startActivity(new Intent(mActivity, AboutActivity.class));
              }
          });
  
          // (假的ListView头部展示的)筛选视图点击
          headerFilterViewView.setOnFilterClickListener(new HeaderFilterViewView.OnFilterClickListener() {
              @Override
              public void onFilterClick(int position) {
                  filterPosition = position;
                  isSmooth = true;
                  smoothListView.smoothScrollToPositionFromTop(filterViewPosition, DensityUtil.dip2px(mContext, titleViewHeight));
              }
          });
  
          // (真正的)筛选视图点击
          fvTopFilter.setOnFilterClickListener(new FilterView.OnFilterClickListener() {
              @Override
              public void onFilterClick(int position) {
                  if (isStickyTop) {
                      filterPosition = position;
                      fvTopFilter.showFilterLayout(position);
                      if (titleViewHeight - 3 > filterViewTopSpace || filterViewTopSpace > titleViewHeight + 3) {
                          smoothListView.smoothScrollToPositionFromTop(filterViewPosition, DensityUtil.dip2px(mContext, titleViewHeight));
                      }
                  }
              }
          });
  
          // 分类Item点击
          fvTopFilter.setOnItemCategoryClickListener(new FilterView.OnItemCategoryClickListener() {
              @Override
              public void onItemCategoryClick(FilterTwoEntity entity) {
                  fillAdapter(ModelUtil.getCategoryTravelingData(entity));
              }
          });
  
          // 排序Item点击
          fvTopFilter.setOnItemSortClickListener(new FilterView.OnItemSortClickListener() {
              @Override
              public void onItemSortClick(FilterEntity entity) {
                  fillAdapter(ModelUtil.getSortTravelingData(entity));
              }
          });
  
          // 筛选Item点击
          fvTopFilter.setOnItemFilterClickListener(new FilterView.OnItemFilterClickListener() {
              @Override
              public void onItemFilterClick(FilterEntity entity) {
                  fillAdapter(ModelUtil.getFilterTravelingData(entity));
              }
          });
  
          smoothListView.setRefreshEnable(true);
          smoothListView.setLoadMoreEnable(true);
          smoothListView.setSmoothListViewListener(this);
          smoothListView.setOnScrollListener(new SmoothListView.OnSmoothScrollListener() {
              @Override
              public void onSmoothScrolling(View view) {}
  
              @Override
              public void onScrollStateChanged(AbsListView view, int scrollState) {
                  isScrollIdle = (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE);
              }
  
              @Override
              public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
                  if (isScrollIdle && adViewTopSpace < 0) return;
  
                  // 获取广告头部View、自身的高度、距离顶部的高度
                  if (itemHeaderAdView == null) {
                      itemHeaderAdView = smoothListView.getChildAt(1-firstVisibleItem);
                  }
                  if (itemHeaderAdView != null) {
                      adViewTopSpace = DensityUtil.px2dip(mContext, itemHeaderAdView.getTop());
                      adViewHeight = DensityUtil.px2dip(mContext, itemHeaderAdView.getHeight());
                  }
  
                  // 获取筛选View、距离顶部的高度
                  if (itemHeaderFilterView == null) {
                      itemHeaderFilterView = smoothListView.getChildAt(filterViewPosition - firstVisibleItem);
                  }
                  if (itemHeaderFilterView != null) {
                      filterViewTopSpace = DensityUtil.px2dip(mContext, itemHeaderFilterView.getTop());
                  }
  
                  // 处理筛选是否吸附在顶部
                  if (filterViewTopSpace > titleViewHeight) {
                      isStickyTop = false; // 没有吸附在顶部
                      fvTopFilter.setVisibility(View.INVISIBLE);
                  } else {
                      isStickyTop = true; // 吸附在顶部
                      fvTopFilter.setVisibility(View.VISIBLE);
                  }
  
                  if (firstVisibleItem > filterViewPosition) {
                      isStickyTop = true;
                      fvTopFilter.setVisibility(View.VISIBLE);
                  }
  
                  if (isSmooth && isStickyTop) {
                      isSmooth = false;
                      fvTopFilter.showFilterLayout(filterPosition);
                  }
  
                  fvTopFilter.setStickyTop(isStickyTop);
  
                  // 处理标题栏颜色渐变
                  handleTitleBarColorEvaluate();
              }
          });
      }
  
      // 填充数据
      private void fillAdapter(List<TravelingEntity> list) {
          if (list == null || list.size() == 0) {
              smoothListView.setLoadMoreEnable(false);
              int height = mScreenHeight - DensityUtil.dip2px(mContext, 95); // 95 = 标题栏高度 ＋ FilterView的高度
              mAdapter.setData(ModelUtil.getNoDataEntity(height));
          } else {
              smoothListView.setLoadMoreEnable(list.size() > TravelingAdapter.ONE_REQUEST_COUNT);
              mAdapter.setData(list);
          }
      }
  
      // 处理标题栏颜色渐变
      private void handleTitleBarColorEvaluate() {
          float fraction;
          if (adViewTopSpace > 0) {
              fraction = 1f - adViewTopSpace * 1f / 60;
              if (fraction < 0f) fraction = 0f;
              rlBar.setAlpha(fraction);
              return ;
          }
  
          float space = Math.abs(adViewTopSpace) * 1f;
          fraction = space / (adViewHeight - titleViewHeight);
          if (fraction < 0f) fraction = 0f;
          if (fraction > 1f) fraction = 1f;
          rlBar.setAlpha(1f);
  
          if (fraction >= 1f || isStickyTop) {
              isStickyTop = true;
              viewTitleBg.setAlpha(0f);
              viewActionMoreBg.setAlpha(0f);
              rlBar.setBackgroundColor(mContext.getResources().getColor(R.color.orange));
          } else {
              viewTitleBg.setAlpha(1f - fraction);
              viewActionMoreBg.setAlpha(1f - fraction);
              rlBar.setBackgroundColor(ColorUtil.getNewColorByStartEndColor(mContext, fraction, R.color.transparent, R.color.orange));
          }
      }
  
      @Override
      protected void onDestroy() {
          super.onDestroy();
          if (listViewAdHeaderView != null) {
              listViewAdHeaderView.stopADRotate();
          }
      }
  
      @Override
      public void onBackPressed() {
          if (!fvTopFilter.isShowing()) {
              super.onBackPressed();
          } else {
              fvTopFilter.resetAllStatus();
          }
      }
  
      @Override
      public void onRefresh() {
          mHandler.postDelayed(new Runnable() {
              @Override
              public void run() {
                  smoothListView.stopRefresh();
                  smoothListView.setRefreshTime("刚刚");
              }
          }, 2000);
      }
  
      @Override
      public void onLoadMore() {
          mHandler.postDelayed(new Runnable() {
              @Override
              public void run() {
                  smoothListView.stopLoadMore();
              }
          }, 2000);
      }
  
  }
  