diff --git a/README.md b/README.md index e1aa0bf..f649a12 100644 --- a/README.md +++ b/README.md @@ -1,63 +1,65 @@ ## StickyHeaderListView -StickyHeaderListView 是基于实际需求做出的灵活可定制的UI功能,具体实现功能如下:
-一、支持无限循环的广告位。
-二、高度可动态配置的Header2和Header3(使用GridView实现)。
-三、主要功能:分类、排序和筛选布局滑动到顶部后吸附、悬停。
-四、自定义FilterView筛选控件,支持动画显示与动画隐藏。
-五、支持标题栏背景颜色渐变、字体颜色渐变。
-六、数据不足一屏动态添加空数据占位。
-七、数据为空时,ListView加载暂无数据视图。
-八、思路清晰、界面优美,添加ripple点击效果。
-九、支持下拉刷新和上拉加载更多功能。
+StickyHeaderListView是基于实际需求做出的灵活可变的UI视图,具体实现了如下功能: +一、支持下拉刷新和上拉加载更多功能。 +二、支持无限循环的广告位。 +三、使用GridView实现可动态配置的频道位、运营位。 +四、自定义FilterView实现筛选功能,同时支持动画显示与动画隐藏。 +五、支持FilterView滑动到顶部后吸附悬浮。 +六、支持标题栏背景颜色渐变和字体颜色渐变。 +七、实现了数据不足一屏动态添加空数据占位。 +八、数据为空时ListView多type加载暂无数据视图。 -### 动态效果图 +
- +### 应用截图 -
+ - +
-### 截图 +### 动态效果图 - - - - - -
+
- - - - - -
+ + +
### [实现思路参考简书文章](http://www.jianshu.com/p/3bf26722c489) -### [APK下载地址](http://fir.im/StickyListView) +
+ +### 扫一扫[Fir.im](https://fir.im/StickyListView)二维码下载APK -### 微信公众号 +s - +
-### 关于我 +### 个人微信公众号 -个人邮箱:sfsheng0322@126.com + -[GitHub主页](https://github.com/sfsheng0322) +
-[简书主页](http://www.jianshu.com/users/88509e7e2ed1/latest_articles) +### 打点赏给作者加点油^_^ -[个人博客](http://sunfusheng.com/) + -[新浪微博](http://weibo.com/u/3852192525) +
+### 关于我 +[GitHub: sunfusheng](https://github.com/sunfusheng) +[个人邮箱: sfsheng0322@126.com](https://mail.126.com/) + +[个人博客: sunfusheng.com](http://sunfusheng.com/) + +[简书主页](http://www.jianshu.com/users/88509e7e2ed1/latest_articles) + +[新浪微博](http://weibo.com/u/3852192525) diff --git a/app/build.gradle b/app/build.gradle index f3edff9..e80585e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,34 +1,76 @@ apply plugin: 'com.android.application' +apply plugin: 'com.jakewharton.butterknife' -android { - compileSdkVersion 23 - buildToolsVersion "23.0.2" +Properties signingProperties = new Properties() +signingProperties.load(new FileInputStream(file("../signings/signing.properties"))) +android { + compileSdkVersion gradle.compileSdkVersion defaultConfig { applicationId "com.sunfusheng.StickyHeaderListView" - minSdkVersion 11 - targetSdkVersion 23 - versionCode 6 - versionName "1.5" + minSdkVersion gradle.minSdkVersion + targetSdkVersion gradle.targetSdkVersion + versionCode gradle.versionCode + versionName gradle.versionName + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + lintOptions { + quiet true + abortOnError false + ignoreWarnings true + } + + signingConfigs { + release { + storeFile file(signingProperties['KEYSTORE_FILEPATH']) + storePassword signingProperties['STORE_PASSWORD'] + keyAlias signingProperties['KEY_ALIAS'] + keyPassword signingProperties['KEY_PASSWORD'] + } } buildTypes { release { - minifyEnabled false + buildConfigField "boolean", "debugMode", "false" + signingConfig signingConfigs.release proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + applicationVariants.all { + variant -> generateApk(variant) + } + } + + debug { + buildConfigField "boolean", "debugMode", "true" + signingConfig signingConfigs.release + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + applicationVariants.all { + variant -> generateApk(variant) + } } } } -dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) - compile 'com.android.support:appcompat-v7:23.3.0' - compile 'com.android.support:design:23.3.0' - compile 'com.android.support:cardview-v7:23.3.0' +def generateApk(variant) { + if (variant.buildType.name == "release") { + variant.getPackageApplication().outputDirectory = new File(project.rootDir.absolutePath + "/app/outputs") + variant.getPackageApplication().outputScope.apkDatas.forEach { apkData -> + apkData.outputFileName = "SHLV.apk" + } + } +} - // ButterKnife - compile 'com.jakewharton:butterknife:7.0.1' +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation 'com.android.support:appcompat-v7:' + gradle.supportLibraryVersion + implementation 'com.android.support:design:' + gradle.supportLibraryVersion + implementation 'com.jakewharton:butterknife:8.4.0' + annotationProcessor 'com.jakewharton:butterknife-compiler:8.4.0' - // Glide - compile 'com.github.bumptech.glide:glide:3.7.0' + implementation 'com.sunfusheng:FirUpdater:1.0.7' + implementation 'com.sunfusheng:glideimageview:1.2.0' } diff --git a/app/outputs/SHLV.apk b/app/outputs/SHLV.apk new file mode 100644 index 0000000..5abe2c8 Binary files /dev/null and b/app/outputs/SHLV.apk differ diff --git a/app/outputs/output.json b/app/outputs/output.json new file mode 100644 index 0000000..6a0c09d --- /dev/null +++ b/app/outputs/output.json @@ -0,0 +1 @@ +[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":9},"path":"SHLV.apk","properties":{"packageId":"com.sunfusheng.StickyHeaderListView","split":"","minSdkVersion":"14"}}] \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 8d4845d..3852b45 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -21,7 +21,7 @@ android:theme="@style/AppTheme"> @@ -30,7 +30,7 @@ diff --git a/app/src/main/java/com/sunfusheng/StickyHeaderListView/ui/AboutActivity.java b/app/src/main/java/com/sunfusheng/StickyHeaderListView/AboutActivity.java similarity index 96% rename from app/src/main/java/com/sunfusheng/StickyHeaderListView/ui/AboutActivity.java rename to app/src/main/java/com/sunfusheng/StickyHeaderListView/AboutActivity.java index b07217f..462e9ac 100644 --- a/app/src/main/java/com/sunfusheng/StickyHeaderListView/ui/AboutActivity.java +++ b/app/src/main/java/com/sunfusheng/StickyHeaderListView/AboutActivity.java @@ -1,4 +1,4 @@ -package com.sunfusheng.StickyHeaderListView.ui; +package com.sunfusheng.StickyHeaderListView; import android.content.Context; import android.content.pm.PackageInfo; @@ -17,9 +17,7 @@ import android.webkit.WebView; import android.webkit.WebViewClient; -import com.sunfusheng.StickyHeaderListView.R; - -import butterknife.Bind; +import butterknife.BindView; import butterknife.ButterKnife; /** @@ -27,9 +25,9 @@ */ public class AboutActivity extends AppCompatActivity { - @Bind(R.id.toolbar) + @BindView(R.id.toolbar) Toolbar toolbar; - @Bind(R.id.webView) + @BindView(R.id.webView) WebView webView; private WebSettings settings; diff --git a/app/src/main/java/com/sunfusheng/StickyHeaderListView/ui/MainActivity.java b/app/src/main/java/com/sunfusheng/StickyHeaderListView/MainActivity.java similarity index 62% rename from app/src/main/java/com/sunfusheng/StickyHeaderListView/ui/MainActivity.java rename to app/src/main/java/com/sunfusheng/StickyHeaderListView/MainActivity.java index c882ac4..d5fd45b 100644 --- a/app/src/main/java/com/sunfusheng/StickyHeaderListView/ui/MainActivity.java +++ b/app/src/main/java/com/sunfusheng/StickyHeaderListView/MainActivity.java @@ -1,11 +1,10 @@ -package com.sunfusheng.StickyHeaderListView.ui; +package com.sunfusheng.StickyHeaderListView; 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; @@ -13,7 +12,7 @@ import android.widget.RelativeLayout; import android.widget.TextView; -import com.sunfusheng.StickyHeaderListView.R; +import com.sunfusheng.FirUpdater; import com.sunfusheng.StickyHeaderListView.adapter.TravelingAdapter; import com.sunfusheng.StickyHeaderListView.model.ChannelEntity; import com.sunfusheng.StickyHeaderListView.model.FilterData; @@ -24,85 +23,82 @@ import com.sunfusheng.StickyHeaderListView.util.ColorUtil; import com.sunfusheng.StickyHeaderListView.util.DensityUtil; import com.sunfusheng.StickyHeaderListView.util.ModelUtil; +import com.sunfusheng.StickyHeaderListView.util.StatusBarUtil; 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.HeaderBannerView; +import com.sunfusheng.StickyHeaderListView.view.HeaderChannelView; +import com.sunfusheng.StickyHeaderListView.view.HeaderDividerView; +import com.sunfusheng.StickyHeaderListView.view.HeaderFilterView; +import com.sunfusheng.StickyHeaderListView.view.HeaderOperationView; import com.sunfusheng.StickyHeaderListView.view.SmoothListView.SmoothListView; import java.util.ArrayList; import java.util.List; -import butterknife.Bind; +import butterknife.BindView; import butterknife.ButterKnife; /** * 作者:孙福生 - * + *

* 个人博客:sunfusheng.com */ public class MainActivity extends AppCompatActivity implements SmoothListView.ISmoothListViewListener { - @Bind(R.id.listView) + @BindView(R.id.listView) SmoothListView smoothListView; - @Bind(R.id.fv_top_filter) - FilterView fvTopFilter; - @Bind(R.id.rl_bar) + @BindView(R.id.real_filterView) + FilterView realFilterView; + @BindView(R.id.rl_bar) RelativeLayout rlBar; - @Bind(R.id.tv_title) + @BindView(R.id.tv_title) TextView tvTitle; - @Bind(R.id.view_title_bg) + @BindView(R.id.view_title_bg) View viewTitleBg; - @Bind(R.id.view_action_more_bg) + @BindView(R.id.view_action_more_bg) View viewActionMoreBg; - @Bind(R.id.fl_action_more) + @BindView(R.id.fl_action_more) FrameLayout flActionMore; private Context mContext; private Activity mActivity; private int mScreenHeight; // 屏幕高度 - private List adList = new ArrayList<>(); // 广告数据 + private List bannerList = new ArrayList<>(); // 广告数据 private List channelList = new ArrayList<>(); // 频道数据 private List operationList = new ArrayList<>(); // 运营数据 private List travelingList = new ArrayList<>(); // ListView数据 - private HeaderAdViewView listViewAdHeaderView; // 广告视图 - private HeaderChannelViewView headerChannelView; // 频道视图 - private HeaderOperationViewView headerOperationViewView; // 运营视图 - private HeaderDividerViewView headerDividerViewView; // 分割线占位图 - private HeaderFilterViewView headerFilterViewView; // 分类筛选视图 + private HeaderBannerView headerBannerView; // 广告视图 + private HeaderChannelView headerChannelView; // 频道视图 + private HeaderOperationView headerOperationView; // 运营视图 + private HeaderDividerView headerDividerView; // 分割线占位图 + private HeaderFilterView headerFilterView; // 分类筛选视图 private FilterData filterData; // 筛选数据 - private TravelingAdapter mAdapter; // 主页数据 + private TravelingAdapter mAdapter; + + private int titleViewHeight = 65; // 标题栏的高度 + + private View itemHeaderBannerView; // 从ListView获取的广告子View + private int bannerViewHeight = 180; // 广告视图的高度 + private int bannerViewTopMargin; // 广告视图距离顶部的距离 - private View itemHeaderAdView; // 从ListView获取的广告子View private View itemHeaderFilterView; // 从ListView获取的筛选子View + private int filterViewPosition = 4; // 筛选视图的位置 + private int filterViewTopMargin; // 筛选视图距离顶部的距离 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); + StatusBarUtil.setStatusBarTranslucent(this, true); + + new FirUpdater(this, "3c57fb226edf7facf821501e4eba08d2", "571dd00b00fc74312e00001f").checkVersion(); initData(); initView(); @@ -119,45 +115,40 @@ private void initData() { filterData.setCategory(ModelUtil.getCategoryData()); filterData.setSorts(ModelUtil.getSortData()); filterData.setFilters(ModelUtil.getFilterData()); - // 广告数据 - adList = ModelUtil.getAdData(); - + bannerList = ModelUtil.getBannerData(); // 频道数据 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); + headerBannerView = new HeaderBannerView(this); + headerBannerView.fillView(bannerList, smoothListView); // 设置频道数据 - headerChannelView = new HeaderChannelViewView(this); + headerChannelView = new HeaderChannelView(this); headerChannelView.fillView(channelList, smoothListView); // 设置运营数据 - headerOperationViewView = new HeaderOperationViewView(this); - headerOperationViewView.fillView(operationList, smoothListView); + headerOperationView = new HeaderOperationView(this); + headerOperationView.fillView(operationList, smoothListView); // 设置分割线 - headerDividerViewView = new HeaderDividerViewView(this); - headerDividerViewView.fillView("", smoothListView); + headerDividerView = new HeaderDividerView(this); + headerDividerView.fillView("", smoothListView); - // 设置筛选数据 - headerFilterViewView = new HeaderFilterViewView(this); - headerFilterViewView.fillView(new Object(), smoothListView); + // 设置假FilterView数据 + headerFilterView = new HeaderFilterView(this); + headerFilterView.fillView(new Object(), smoothListView); + + // 设置真FilterView数据 + realFilterView.setFilterData(mActivity, filterData); + realFilterView.setVisibility(View.GONE); // 设置ListView数据 mAdapter = new TravelingAdapter(this, travelingList); @@ -176,7 +167,7 @@ public void onClick(View v) { }); // (假的ListView头部展示的)筛选视图点击 - headerFilterViewView.setOnFilterClickListener(new HeaderFilterViewView.OnFilterClickListener() { + headerFilterView.getFilterView().setOnFilterClickListener(new FilterView.OnFilterClickListener() { @Override public void onFilterClick(int position) { filterPosition = position; @@ -186,29 +177,25 @@ public void onFilterClick(int position) { }); // (真正的)筛选视图点击 - fvTopFilter.setOnFilterClickListener(new FilterView.OnFilterClickListener() { + realFilterView.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)); - } - } + filterPosition = position; + realFilterView.show(position); + smoothListView.smoothScrollToPositionFromTop(filterViewPosition, DensityUtil.dip2px(mContext, titleViewHeight)); } }); // 分类Item点击 - fvTopFilter.setOnItemCategoryClickListener(new FilterView.OnItemCategoryClickListener() { + realFilterView.setOnItemCategoryClickListener(new FilterView.OnItemCategoryClickListener() { @Override - public void onItemCategoryClick(FilterTwoEntity entity) { - fillAdapter(ModelUtil.getCategoryTravelingData(entity)); + public void onItemCategoryClick(FilterTwoEntity leftEntity, FilterEntity rightEntity) { + fillAdapter(ModelUtil.getCategoryTravelingData(leftEntity, rightEntity)); } }); // 排序Item点击 - fvTopFilter.setOnItemSortClickListener(new FilterView.OnItemSortClickListener() { + realFilterView.setOnItemSortClickListener(new FilterView.OnItemSortClickListener() { @Override public void onItemSortClick(FilterEntity entity) { fillAdapter(ModelUtil.getSortTravelingData(entity)); @@ -216,7 +203,7 @@ public void onItemSortClick(FilterEntity entity) { }); // 筛选Item点击 - fvTopFilter.setOnItemFilterClickListener(new FilterView.OnItemFilterClickListener() { + realFilterView.setOnItemFilterClickListener(new FilterView.OnItemFilterClickListener() { @Override public void onItemFilterClick(FilterEntity entity) { fillAdapter(ModelUtil.getFilterTravelingData(entity)); @@ -228,7 +215,8 @@ public void onItemFilterClick(FilterEntity entity) { smoothListView.setSmoothListViewListener(this); smoothListView.setOnScrollListener(new SmoothListView.OnSmoothScrollListener() { @Override - public void onSmoothScrolling(View view) {} + public void onSmoothScrolling(View view) { + } @Override public void onScrollStateChanged(AbsListView view, int scrollState) { @@ -237,15 +225,15 @@ public void onScrollStateChanged(AbsListView view, int scrollState) { @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { - if (isScrollIdle && adViewTopSpace < 0) return; + if (isScrollIdle && bannerViewTopMargin < 0) return; // 获取广告头部View、自身的高度、距离顶部的高度 - if (itemHeaderAdView == null) { - itemHeaderAdView = smoothListView.getChildAt(1-firstVisibleItem); + if (itemHeaderBannerView == null) { + itemHeaderBannerView = smoothListView.getChildAt(1); } - if (itemHeaderAdView != null) { - adViewTopSpace = DensityUtil.px2dip(mContext, itemHeaderAdView.getTop()); - adViewHeight = DensityUtil.px2dip(mContext, itemHeaderAdView.getHeight()); + if (itemHeaderBannerView != null) { + bannerViewTopMargin = DensityUtil.px2dip(mContext, itemHeaderBannerView.getTop()); + bannerViewHeight = DensityUtil.px2dip(mContext, itemHeaderBannerView.getHeight()); } // 获取筛选View、距离顶部的高度 @@ -253,30 +241,23 @@ public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCoun itemHeaderFilterView = smoothListView.getChildAt(filterViewPosition - firstVisibleItem); } if (itemHeaderFilterView != null) { - filterViewTopSpace = DensityUtil.px2dip(mContext, itemHeaderFilterView.getTop()); + filterViewTopMargin = DensityUtil.px2dip(mContext, itemHeaderFilterView.getTop()); } // 处理筛选是否吸附在顶部 - if (filterViewTopSpace > titleViewHeight) { - isStickyTop = false; // 没有吸附在顶部 - fvTopFilter.setVisibility(View.INVISIBLE); - } else { + if (filterViewTopMargin <= titleViewHeight || firstVisibleItem > filterViewPosition) { isStickyTop = true; // 吸附在顶部 - fvTopFilter.setVisibility(View.VISIBLE); - } - - if (firstVisibleItem > filterViewPosition) { - isStickyTop = true; - fvTopFilter.setVisibility(View.VISIBLE); + realFilterView.setVisibility(View.VISIBLE); + } else { + isStickyTop = false; // 没有吸附在顶部 + realFilterView.setVisibility(View.GONE); } if (isSmooth && isStickyTop) { isSmooth = false; - fvTopFilter.showFilterLayout(filterPosition); + realFilterView.show(filterPosition); } - fvTopFilter.setStickyTop(isStickyTop); - // 处理标题栏颜色渐变 handleTitleBarColorEvaluate(); } @@ -286,11 +267,9 @@ public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCoun // 填充数据 private void fillAdapter(List 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); } } @@ -298,15 +277,15 @@ private void fillAdapter(List list) { // 处理标题栏颜色渐变 private void handleTitleBarColorEvaluate() { float fraction; - if (adViewTopSpace > 0) { - fraction = 1f - adViewTopSpace * 1f / 60; + if (bannerViewTopMargin > 0) { + fraction = 1f - bannerViewTopMargin * 1f / 60; if (fraction < 0f) fraction = 0f; rlBar.setAlpha(fraction); - return ; + return; } - float space = Math.abs(adViewTopSpace) * 1f; - fraction = space / (adViewHeight - titleViewHeight); + float space = Math.abs(bannerViewTopMargin) * 1f; + fraction = space / (bannerViewHeight - titleViewHeight); if (fraction < 0f) fraction = 0f; if (fraction > 1f) fraction = 1f; rlBar.setAlpha(1f); @@ -315,34 +294,38 @@ private void handleTitleBarColorEvaluate() { isStickyTop = true; viewTitleBg.setAlpha(0f); viewActionMoreBg.setAlpha(0f); - rlBar.setBackgroundColor(mContext.getResources().getColor(R.color.orange)); + rlBar.setBackgroundColor(mContext.getResources().getColor(R.color.colorPrimary)); } else { viewTitleBg.setAlpha(1f - fraction); viewActionMoreBg.setAlpha(1f - fraction); - rlBar.setBackgroundColor(ColorUtil.getNewColorByStartEndColor(mContext, fraction, R.color.transparent, R.color.orange)); + rlBar.setBackgroundColor(ColorUtil.getNewColorByStartEndColor(mContext, fraction, R.color.transparent, R.color.colorPrimary)); } } @Override - protected void onDestroy() { - super.onDestroy(); - if (listViewAdHeaderView != null) { - listViewAdHeaderView.stopADRotate(); - } + protected void onResume() { + super.onResume(); + headerBannerView.enqueueBannerLoopMessage(); + } + + @Override + protected void onStop() { + super.onStop(); + headerBannerView.removeBannerLoopMessage(); } @Override public void onBackPressed() { - if (!fvTopFilter.isShowing()) { - super.onBackPressed(); + if (realFilterView.isShowing()) { + realFilterView.resetAllStatus(); } else { - fvTopFilter.resetAllStatus(); + super.onBackPressed(); } } @Override public void onRefresh() { - mHandler.postDelayed(new Runnable() { + new Handler().postDelayed(new Runnable() { @Override public void run() { smoothListView.stopRefresh(); @@ -353,7 +336,7 @@ public void run() { @Override public void onLoadMore() { - mHandler.postDelayed(new Runnable() { + new Handler().postDelayed(new Runnable() { @Override public void run() { smoothListView.stopLoadMore(); diff --git a/app/src/main/java/com/sunfusheng/StickyHeaderListView/adapter/BaseListAdapter.java b/app/src/main/java/com/sunfusheng/StickyHeaderListView/adapter/BaseListAdapter.java index 12de1f9..1c3e754 100644 --- a/app/src/main/java/com/sunfusheng/StickyHeaderListView/adapter/BaseListAdapter.java +++ b/app/src/main/java/com/sunfusheng/StickyHeaderListView/adapter/BaseListAdapter.java @@ -4,29 +4,23 @@ import android.view.LayoutInflater; import android.widget.BaseAdapter; -import com.sunfusheng.StickyHeaderListView.manager.ImageManager; - import java.util.ArrayList; import java.util.List; public abstract class BaseListAdapter extends BaseAdapter { - private List mList = new ArrayList(); protected Context mContext; + private List mList = new ArrayList(); protected LayoutInflater mInflater; - protected ImageManager mImageManager; public BaseListAdapter(Context context) { mContext = context; mInflater = LayoutInflater.from(context); - mImageManager = new ImageManager(context); } public BaseListAdapter(Context context, List list) { this(context); mList = list; - mInflater = LayoutInflater.from(context); - mImageManager = new ImageManager(context); } @Override @@ -42,11 +36,9 @@ public List getData() { return mList; } - public void addALL(List lists){ - if(lists==null||lists.size()==0){ - return ; - } - mList.addAll(lists); + public void addALL(List list){ + if(list==null||list.size()==0) return; + mList.addAll(list); } public void add(E item){ mList.add(item); diff --git a/app/src/main/java/com/sunfusheng/StickyHeaderListView/adapter/FilterLeftAdapter.java b/app/src/main/java/com/sunfusheng/StickyHeaderListView/adapter/FilterLeftAdapter.java index 46ff182..c4f5027 100644 --- a/app/src/main/java/com/sunfusheng/StickyHeaderListView/adapter/FilterLeftAdapter.java +++ b/app/src/main/java/com/sunfusheng/StickyHeaderListView/adapter/FilterLeftAdapter.java @@ -1,7 +1,6 @@ package com.sunfusheng.StickyHeaderListView.adapter; import android.content.Context; -import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; @@ -12,7 +11,7 @@ import java.util.List; -import butterknife.Bind; +import butterknife.BindView; import butterknife.ButterKnife; /** @@ -20,8 +19,6 @@ */ public class FilterLeftAdapter extends BaseListAdapter { - private FilterTwoEntity selectedEntity; - public FilterLeftAdapter(Context context) { super(context); } @@ -31,9 +28,8 @@ public FilterLeftAdapter(Context context, List list) { } public void setSelectedEntity(FilterTwoEntity filterEntity) { - this.selectedEntity = filterEntity; for (FilterTwoEntity entity : getData()) { - entity.setSelected(entity.getType().equals(selectedEntity.getType())); + entity.setSelected(filterEntity != null && entity.getType().equals(filterEntity.getType())); } notifyDataSetChanged(); } @@ -42,7 +38,7 @@ public void setSelectedEntity(FilterTwoEntity filterEntity) { public View getView(int position, View convertView, ViewGroup parent) { final ViewHolder holder; if (convertView == null) { - convertView = LayoutInflater.from(mContext).inflate(R.layout.item_filter_left, null); + convertView = mInflater.inflate(R.layout.item_filter_left, null); holder = new ViewHolder(convertView); convertView.setTag(holder); } else { @@ -53,7 +49,7 @@ public View getView(int position, View convertView, ViewGroup parent) { holder.tvTitle.setText(entity.getType()); if (entity.isSelected()) { - holder.tvTitle.setTextColor(mContext.getResources().getColor(R.color.orange)); + holder.tvTitle.setTextColor(mContext.getResources().getColor(R.color.colorPrimary)); holder.llRootView.setBackgroundColor(mContext.getResources().getColor(R.color.white)); } else { holder.tvTitle.setTextColor(mContext.getResources().getColor(R.color.font_black_2)); @@ -64,10 +60,10 @@ public View getView(int position, View convertView, ViewGroup parent) { } static class ViewHolder { - @Bind(R.id.ll_root_view) - LinearLayout llRootView; - @Bind(R.id.tv_title) + @BindView(R.id.tv_title) TextView tvTitle; + @BindView(R.id.ll_root_view) + LinearLayout llRootView; ViewHolder(View view) { ButterKnife.bind(this, view); diff --git a/app/src/main/java/com/sunfusheng/StickyHeaderListView/adapter/FilterOneAdapter.java b/app/src/main/java/com/sunfusheng/StickyHeaderListView/adapter/FilterOneAdapter.java index 504abc3..54b631c 100644 --- a/app/src/main/java/com/sunfusheng/StickyHeaderListView/adapter/FilterOneAdapter.java +++ b/app/src/main/java/com/sunfusheng/StickyHeaderListView/adapter/FilterOneAdapter.java @@ -1,7 +1,6 @@ package com.sunfusheng.StickyHeaderListView.adapter; import android.content.Context; -import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; @@ -12,7 +11,7 @@ import java.util.List; -import butterknife.Bind; +import butterknife.BindView; import butterknife.ButterKnife; /** @@ -20,8 +19,6 @@ */ public class FilterOneAdapter extends BaseListAdapter { - private FilterEntity selectedEntity; - public FilterOneAdapter(Context context) { super(context); } @@ -31,9 +28,8 @@ public FilterOneAdapter(Context context, List list) { } public void setSelectedEntity(FilterEntity filterEntity) { - this.selectedEntity = filterEntity; for (FilterEntity entity : getData()) { - entity.setSelected(entity.getKey().equals(selectedEntity.getKey())); + entity.setSelected(filterEntity != null && entity.getKey().equals(filterEntity.getKey())); } notifyDataSetChanged(); } @@ -42,7 +38,7 @@ public void setSelectedEntity(FilterEntity filterEntity) { public View getView(int position, View convertView, ViewGroup parent) { final ViewHolder holder; if (convertView == null) { - convertView = LayoutInflater.from(mContext).inflate(R.layout.item_filter_one, null); + convertView = mInflater.inflate(R.layout.item_filter_one, null); holder = new ViewHolder(convertView); convertView.setTag(holder); } else { @@ -53,7 +49,7 @@ public View getView(int position, View convertView, ViewGroup parent) { holder.tvTitle.setText(entity.getKey()); if (entity.isSelected()) { - holder.tvTitle.setTextColor(mContext.getResources().getColor(R.color.orange)); + holder.tvTitle.setTextColor(mContext.getResources().getColor(R.color.colorPrimary)); } else { holder.tvTitle.setTextColor(mContext.getResources().getColor(R.color.font_black_3)); } @@ -62,9 +58,9 @@ public View getView(int position, View convertView, ViewGroup parent) { } static class ViewHolder { - @Bind(R.id.iv_image) + @BindView(R.id.iv_image) ImageView ivImage; - @Bind(R.id.tv_title) + @BindView(R.id.tv_title) TextView tvTitle; ViewHolder(View view) { diff --git a/app/src/main/java/com/sunfusheng/StickyHeaderListView/adapter/FilterRightAdapter.java b/app/src/main/java/com/sunfusheng/StickyHeaderListView/adapter/FilterRightAdapter.java index 7ea8da5..197fa14 100644 --- a/app/src/main/java/com/sunfusheng/StickyHeaderListView/adapter/FilterRightAdapter.java +++ b/app/src/main/java/com/sunfusheng/StickyHeaderListView/adapter/FilterRightAdapter.java @@ -1,7 +1,6 @@ package com.sunfusheng.StickyHeaderListView.adapter; import android.content.Context; -import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; @@ -12,7 +11,7 @@ import java.util.List; -import butterknife.Bind; +import butterknife.BindView; import butterknife.ButterKnife; /** @@ -20,20 +19,13 @@ */ public class FilterRightAdapter extends BaseListAdapter { - private FilterEntity selectedEntity; - - public FilterRightAdapter(Context context) { - super(context); - } - public FilterRightAdapter(Context context, List list) { super(context, list); } public void setSelectedEntity(FilterEntity filterEntity) { - this.selectedEntity = filterEntity; for (FilterEntity entity : getData()) { - entity.setSelected(entity.getKey().equals(selectedEntity.getKey())); + entity.setSelected(filterEntity != null && entity.getKey().equals(filterEntity.getKey())); } notifyDataSetChanged(); } @@ -42,7 +34,7 @@ public void setSelectedEntity(FilterEntity filterEntity) { public View getView(int position, View convertView, ViewGroup parent) { final ViewHolder holder; if (convertView == null) { - convertView = LayoutInflater.from(mContext).inflate(R.layout.item_filter_one, null); + convertView = mInflater.inflate(R.layout.item_filter_one, null); holder = new ViewHolder(convertView); convertView.setTag(holder); } else { @@ -53,7 +45,7 @@ public View getView(int position, View convertView, ViewGroup parent) { holder.tvTitle.setText(entity.getKey()); if (entity.isSelected()) { - holder.tvTitle.setTextColor(mContext.getResources().getColor(R.color.orange)); + holder.tvTitle.setTextColor(mContext.getResources().getColor(R.color.colorPrimary)); } else { holder.tvTitle.setTextColor(mContext.getResources().getColor(R.color.font_black_3)); } @@ -62,9 +54,9 @@ public View getView(int position, View convertView, ViewGroup parent) { } static class ViewHolder { - @Bind(R.id.iv_image) + @BindView(R.id.iv_image) ImageView ivImage; - @Bind(R.id.tv_title) + @BindView(R.id.tv_title) TextView tvTitle; ViewHolder(View view) { diff --git a/app/src/main/java/com/sunfusheng/StickyHeaderListView/adapter/HeaderAdAdapter.java b/app/src/main/java/com/sunfusheng/StickyHeaderListView/adapter/HeaderBannerAdapter.java similarity index 66% rename from app/src/main/java/com/sunfusheng/StickyHeaderListView/adapter/HeaderAdAdapter.java rename to app/src/main/java/com/sunfusheng/StickyHeaderListView/adapter/HeaderBannerAdapter.java index ff139af..8089aa5 100644 --- a/app/src/main/java/com/sunfusheng/StickyHeaderListView/adapter/HeaderAdAdapter.java +++ b/app/src/main/java/com/sunfusheng/StickyHeaderListView/adapter/HeaderBannerAdapter.java @@ -1,6 +1,5 @@ package com.sunfusheng.StickyHeaderListView.adapter; -import android.content.Context; import android.support.v4.view.PagerAdapter; import android.view.View; import android.view.ViewGroup; @@ -11,28 +10,22 @@ /** * Created by sunfusheng on 16/4/20. */ -public class HeaderAdAdapter extends PagerAdapter { +public class HeaderBannerAdapter extends PagerAdapter { - private Context mContext; private List ivList; // ImageView的集合 - private int count = 1; // 广告的数量 + private int count; // 广告的数量 - public HeaderAdAdapter(Context context, List ivList) { + public HeaderBannerAdapter(List ivList) { super(); - this.mContext = context; this.ivList = ivList; - if(ivList != null && ivList.size() > 0){ + if(ivList != null){ count = ivList.size(); } } @Override public int getCount() { - if (count == 1) { - return 1; - } else { - return Integer.MAX_VALUE; - } + return Integer.MAX_VALUE; } @Override @@ -47,7 +40,7 @@ public void destroyItem(ViewGroup container, int position, Object object) { @Override public Object instantiateItem(ViewGroup container, int position) { int newPosition = position % count; - // 先移除在添加,更新图片在container中的位置(把iv放至container末尾) + // 先移除再添加,更新图片在container中的位置(把iv放至container末尾) ImageView iv = ivList.get(newPosition); container.removeView(iv); container.addView(iv); diff --git a/app/src/main/java/com/sunfusheng/StickyHeaderListView/adapter/HeaderChannelAdapter.java b/app/src/main/java/com/sunfusheng/StickyHeaderListView/adapter/HeaderChannelAdapter.java index f566593..eb1d786 100644 --- a/app/src/main/java/com/sunfusheng/StickyHeaderListView/adapter/HeaderChannelAdapter.java +++ b/app/src/main/java/com/sunfusheng/StickyHeaderListView/adapter/HeaderChannelAdapter.java @@ -2,18 +2,17 @@ import android.content.Context; import android.text.TextUtils; -import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.ImageView; import android.widget.TextView; import com.sunfusheng.StickyHeaderListView.R; import com.sunfusheng.StickyHeaderListView.model.ChannelEntity; +import com.sunfusheng.glideimageview.GlideImageView; import java.util.List; -import butterknife.Bind; +import butterknife.BindView; import butterknife.ButterKnife; /** @@ -29,7 +28,7 @@ public HeaderChannelAdapter(Context context, List list) { public View getView(int position, View convertView, ViewGroup parent) { final ViewHolder holder; if (convertView == null) { - convertView = LayoutInflater.from(mContext).inflate(R.layout.item_channel, null); + convertView = mInflater.inflate(R.layout.item_channel, null); holder = new ViewHolder(convertView); convertView.setTag(holder); } else { @@ -39,7 +38,8 @@ public View getView(int position, View convertView, ViewGroup parent) { ChannelEntity entity = getItem(position); holder.tvTitle.setText(entity.getTitle()); - mImageManager.loadCircleImage(entity.getImage_url(), holder.ivImage); + holder.givImage.loadImage(entity.getImage_url(), R.color.font_black_6); + if (TextUtils.isEmpty(entity.getTips())) { holder.tvTips.setVisibility(View.INVISIBLE); } else { @@ -51,11 +51,11 @@ public View getView(int position, View convertView, ViewGroup parent) { } static class ViewHolder { - @Bind(R.id.iv_image) - ImageView ivImage; - @Bind(R.id.tv_title) + @BindView(R.id.giv_image) + GlideImageView givImage; + @BindView(R.id.tv_title) TextView tvTitle; - @Bind(R.id.tv_tips) + @BindView(R.id.tv_tips) TextView tvTips; ViewHolder(View view) { diff --git a/app/src/main/java/com/sunfusheng/StickyHeaderListView/adapter/HeaderOperationAdapter.java b/app/src/main/java/com/sunfusheng/StickyHeaderListView/adapter/HeaderOperationAdapter.java index 9346e6a..3bd5080 100644 --- a/app/src/main/java/com/sunfusheng/StickyHeaderListView/adapter/HeaderOperationAdapter.java +++ b/app/src/main/java/com/sunfusheng/StickyHeaderListView/adapter/HeaderOperationAdapter.java @@ -2,18 +2,17 @@ import android.content.Context; import android.text.TextUtils; -import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.ImageView; import android.widget.TextView; import com.sunfusheng.StickyHeaderListView.R; import com.sunfusheng.StickyHeaderListView.model.OperationEntity; +import com.sunfusheng.glideimageview.GlideImageView; import java.util.List; -import butterknife.Bind; +import butterknife.BindView; import butterknife.ButterKnife; /** @@ -33,7 +32,7 @@ public HeaderOperationAdapter(Context context, List list) { public View getView(int position, View convertView, ViewGroup parent) { final ViewHolder holder; if (convertView == null) { - convertView = LayoutInflater.from(mContext).inflate(R.layout.item_operation, null); + convertView = mInflater.inflate(R.layout.item_operation, null); holder = new ViewHolder(convertView); convertView.setTag(holder); } else { @@ -43,7 +42,8 @@ public View getView(int position, View convertView, ViewGroup parent) { OperationEntity entity = getItem(position); holder.tvTitle.setText(entity.getTitle()); - mImageManager.loadUrlImage(entity.getImage_url(), holder.ivImage); + holder.givImage.loadImage(entity.getImage_url(), R.color.font_black_6); + if (TextUtils.isEmpty(entity.getSubtitle())) { holder.tvSubtitle.setVisibility(View.INVISIBLE); } else { @@ -55,11 +55,11 @@ public View getView(int position, View convertView, ViewGroup parent) { } static class ViewHolder { - @Bind(R.id.iv_image) - ImageView ivImage; - @Bind(R.id.tv_title) + @BindView(R.id.giv_image) + GlideImageView givImage; + @BindView(R.id.tv_title) TextView tvTitle; - @Bind(R.id.tv_subtitle) + @BindView(R.id.tv_subtitle) TextView tvSubtitle; ViewHolder(View view) { diff --git a/app/src/main/java/com/sunfusheng/StickyHeaderListView/adapter/TravelingAdapter.java b/app/src/main/java/com/sunfusheng/StickyHeaderListView/adapter/TravelingAdapter.java index 56b156c..6cf7868 100644 --- a/app/src/main/java/com/sunfusheng/StickyHeaderListView/adapter/TravelingAdapter.java +++ b/app/src/main/java/com/sunfusheng/StickyHeaderListView/adapter/TravelingAdapter.java @@ -5,18 +5,19 @@ import android.view.View; import android.view.ViewGroup; import android.widget.AbsListView; -import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; import com.sunfusheng.StickyHeaderListView.R; import com.sunfusheng.StickyHeaderListView.model.TravelingEntity; +import com.sunfusheng.StickyHeaderListView.util.ToastUtil; +import com.sunfusheng.glideimageview.GlideImageView; import java.util.ArrayList; import java.util.List; -import butterknife.Bind; +import butterknife.BindView; import butterknife.ButterKnife; /** @@ -26,7 +27,7 @@ public class TravelingAdapter extends BaseListAdapter { private boolean isNoData; private int mHeight; - public static final int ONE_SCREEN_COUNT = 7; // 一屏能显示的个数,这个根据屏幕高度和各自的需求定 + public static final int ONE_SCREEN_COUNT = 8; // 一屏能显示的个数,这个根据屏幕高度和各自的需求定 public static final int ONE_REQUEST_COUNT = 10; // 一次请求的个数 public TravelingAdapter(Context context) { @@ -95,21 +96,29 @@ public View getView(int position, View convertView, ViewGroup parent) { return convertView; } - holder.tvTitle.setText(entity.getFrom() + entity.getTitle() + entity.getType()); + final String title = entity.getFrom() + entity.getTitle() + entity.getType(); + holder.tvTitle.setText(title); holder.tvRank.setText("排名:" + entity.getRank()); - mImageManager.loadUrlImage(entity.getImage_url(), holder.ivImage); + holder.givImage.loadImage(entity.getImage_url(), R.color.font_black_6); + + convertView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + ToastUtil.show(mContext, title); + } + }); return convertView; } static class ViewHolder { - @Bind(R.id.ll_root_view) + @BindView(R.id.ll_root_view) LinearLayout llRootView; - @Bind(R.id.iv_image) - ImageView ivImage; - @Bind(R.id.tv_title) + @BindView(R.id.giv_image) + GlideImageView givImage; + @BindView(R.id.tv_title) TextView tvTitle; - @Bind(R.id.tv_rank) + @BindView(R.id.tv_rank) TextView tvRank; ViewHolder(View view) { diff --git a/app/src/main/java/com/sunfusheng/StickyHeaderListView/manager/ImageManager.java b/app/src/main/java/com/sunfusheng/StickyHeaderListView/manager/ImageManager.java deleted file mode 100644 index 4b31e3f..0000000 --- a/app/src/main/java/com/sunfusheng/StickyHeaderListView/manager/ImageManager.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.sunfusheng.StickyHeaderListView.manager; - -import android.content.Context; -import android.net.Uri; -import android.widget.ImageView; - -import com.bumptech.glide.Glide; -import com.sunfusheng.StickyHeaderListView.R; -import com.sunfusheng.StickyHeaderListView.view.GlideCircleTransform; - -/** - * Created by sunfusheng on 16/4/6. - */ -public class ImageManager { - - private Context mContext; - public static final String ANDROID_RESOURCE = "android.resource://"; - public static final String FOREWARD_SLASH = "/"; - - public ImageManager(Context context) { - this.mContext = context; - } - - // 将资源ID转为Uri - public Uri resourceIdToUri(int resourceId) { - return Uri.parse(ANDROID_RESOURCE + mContext.getPackageName() + FOREWARD_SLASH + resourceId); - } - - // 加载网络图片 - public void loadUrlImage(String url, ImageView imageView) { - Glide.with(mContext) - .load(url) - .placeholder(R.color.font_black_6) - .error(R.color.font_black_6) - .crossFade() - .into(imageView); - } - - // 加载drawable图片 - public void loadResImage(int resId, ImageView imageView) { - Glide.with(mContext) - .load(resourceIdToUri(resId)) - .placeholder(R.color.font_black_6) - .error(R.color.font_black_6) - .crossFade() - .into(imageView); - } - - // 加载本地图片 - public void loadLocalImage(String path, ImageView imageView) { - Glide.with(mContext) - .load("file://" + path) - .placeholder(R.color.font_black_6) - .error(R.color.font_black_6) - .crossFade() - .into(imageView); - } - - // 加载网络圆型图片 - public void loadCircleImage(String url, ImageView imageView) { - Glide.with(mContext) - .load(url) - .placeholder(R.mipmap.ic_launcher) - .error(R.mipmap.ic_launcher) - .crossFade() - .transform(new GlideCircleTransform(mContext)) - .into(imageView); - } - - // 加载drawable圆型图片 - public void loadCircleResImage(int resId, ImageView imageView) { - Glide.with(mContext) - .load(resourceIdToUri(resId)) - .placeholder(R.color.font_black_6) - .error(R.color.font_black_6) - .crossFade() - .transform(new GlideCircleTransform(mContext)) - .into(imageView); - } - - // 加载本地圆型图片 - public void loadCircleLocalImage(String path, ImageView imageView) { - Glide.with(mContext) - .load("file://" + path) - .placeholder(R.color.font_black_6) - .error(R.color.font_black_6) - .crossFade() - .transform(new GlideCircleTransform(mContext)) - .into(imageView); - } - -} diff --git a/app/src/main/java/com/sunfusheng/StickyHeaderListView/model/FilterTwoEntity.java b/app/src/main/java/com/sunfusheng/StickyHeaderListView/model/FilterTwoEntity.java index cc08ed0..321fc4e 100644 --- a/app/src/main/java/com/sunfusheng/StickyHeaderListView/model/FilterTwoEntity.java +++ b/app/src/main/java/com/sunfusheng/StickyHeaderListView/model/FilterTwoEntity.java @@ -11,7 +11,6 @@ public class FilterTwoEntity implements Serializable { private String type; private List list; private boolean isSelected; - private FilterEntity selectedFilterEntity; public FilterTwoEntity() { } @@ -29,14 +28,6 @@ public void setType(String type) { this.type = type; } - public FilterEntity getSelectedFilterEntity() { - return selectedFilterEntity; - } - - public void setSelectedFilterEntity(FilterEntity selectedFilterEntity) { - this.selectedFilterEntity = selectedFilterEntity; - } - public boolean isSelected() { return isSelected; } diff --git a/app/src/main/java/com/sunfusheng/StickyHeaderListView/util/ColorUtil.java b/app/src/main/java/com/sunfusheng/StickyHeaderListView/util/ColorUtil.java index f3a8194..1d8c9d1 100644 --- a/app/src/main/java/com/sunfusheng/StickyHeaderListView/util/ColorUtil.java +++ b/app/src/main/java/com/sunfusheng/StickyHeaderListView/util/ColorUtil.java @@ -7,13 +7,12 @@ */ public class ColorUtil { - - // 成新的颜色值 + // 合成新的颜色值 public static int getNewColorByStartEndColor(Context context, float fraction, int startValue, int endValue) { return evaluate(fraction, context.getResources().getColor(startValue), context.getResources().getColor(endValue)); } /** - * 成新的颜色值 + * 合成新的颜色值 * @param fraction 颜色取值的级别 (0.0f ~ 1.0f) * @param startValue 开始显示的颜色 * @param endValue 结束显示的颜色 diff --git a/app/src/main/java/com/sunfusheng/StickyHeaderListView/util/ModelUtil.java b/app/src/main/java/com/sunfusheng/StickyHeaderListView/util/ModelUtil.java index 01a5f6b..54d4819 100644 --- a/app/src/main/java/com/sunfusheng/StickyHeaderListView/util/ModelUtil.java +++ b/app/src/main/java/com/sunfusheng/StickyHeaderListView/util/ModelUtil.java @@ -25,11 +25,12 @@ public class ModelUtil { public static final String type_plant = "植物"; // 广告数据 - public static List getAdData() { + public static List getBannerData() { List adList = new ArrayList<>(); - adList.add("http://img0.imgtn.bdimg.com/it/u=1270781761,1881354959&fm=21&gp=0.jpg"); - adList.add("http://img0.imgtn.bdimg.com/it/u=2138116966,3662367390&fm=21&gp=0.jpg"); - adList.add("http://img0.imgtn.bdimg.com/it/u=1296117362,655885600&fm=21&gp=0.jpg"); + adList.add("http://img2.imgtn.bdimg.com/it/u=2850936076,2080165544&fm=206&gp=0.jpg"); + adList.add("http://img3.imgtn.bdimg.com/it/u=524208507,12616758&fm=206&gp=0.jpg"); + adList.add("http://img3.imgtn.bdimg.com/it/u=698582197,4250615262&fm=206&gp=0.jpg"); + adList.add("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1519377816881&di=47c3c5f8f8e2010ac37d2267736a79a2&imgtype=0&src=http%3A%2F%2Fwww.fansimg.com%2Fportal%2F201406%2F10%2F105328z4xjovysf2kbkyfh.jpg.thumb.jpg"); return adList; } @@ -39,7 +40,7 @@ public static List getChannelData() { channelList.add(new ChannelEntity("中国", "天安门", "http://img2.imgtn.bdimg.com/it/u=2850936076,2080165544&fm=206&gp=0.jpg")); channelList.add(new ChannelEntity("美国", "白宫", "http://img3.imgtn.bdimg.com/it/u=524208507,12616758&fm=206&gp=0.jpg")); channelList.add(new ChannelEntity("英国", "伦敦塔桥", "http://img3.imgtn.bdimg.com/it/u=698582197,4250615262&fm=206&gp=0.jpg")); - channelList.add(new ChannelEntity("德国", "城堡", "http://img5.imgtn.bdimg.com/it/u=1467751238,3257336851&fm=11&gp=0.jpg")); + channelList.add(new ChannelEntity("德国", "城堡", "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1519377816881&di=47c3c5f8f8e2010ac37d2267736a79a2&imgtype=0&src=http%3A%2F%2Fwww.fansimg.com%2Fportal%2F201406%2F10%2F105328z4xjovysf2kbkyfh.jpg.thumb.jpg")); channelList.add(new ChannelEntity("西班牙", "巴塞罗那", "http://img5.imgtn.bdimg.com/it/u=3191365283,111438732&fm=21&gp=0.jpg")); channelList.add(new ChannelEntity("意大利", "比萨斜塔", "http://img5.imgtn.bdimg.com/it/u=482494496,1350922497&fm=206&gp=0.jpg")); return channelList; @@ -112,13 +113,12 @@ public static List getFilterData() { } // ListView分类数据 - public static List getCategoryTravelingData(FilterTwoEntity entity) { + public static List getCategoryTravelingData(FilterTwoEntity leftEntity, FilterEntity rightEntity) { List list = getTravelingData(); List travelingList = new ArrayList<>(); int size = list.size(); for (int i=0; i= Build.VERSION_CODES.KITKAT && Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { + window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN + | View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); + window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); + window.setStatusBarColor(Color.TRANSPARENT); + } + + if (isXiaomi()) { + setXiaomiStatusBar(window, isLightStatusBar); + } else if (isMeizu()) { + setMeizuStatusBar(window, isLightStatusBar); + } + } + + // 是否是小米手机 + public static boolean isXiaomi() { + return "Xiaomi".equals(Build.MANUFACTURER); + } + + // 设置小米状态栏 + public static void setXiaomiStatusBar(Window window, boolean isLightStatusBar) { + Class clazz = window.getClass(); + try { + Class layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams"); + Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE"); + int darkModeFlag = field.getInt(layoutParams); + Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class); + extraFlagField.invoke(window, isLightStatusBar ? darkModeFlag : 0, darkModeFlag); + } catch (Exception e) { + e.printStackTrace(); + } + } + + // 是否是魅族手机 + public static boolean isMeizu() { + try { + Method method = Build.class.getMethod("hasSmartBar"); + return method != null; + } catch (NoSuchMethodException e) { + } + return false; + } + + // 设置魅族状态栏 + public static void setMeizuStatusBar(Window window, boolean isLightStatusBar) { + WindowManager.LayoutParams params = window.getAttributes(); + try { + Field darkFlag = WindowManager.LayoutParams.class.getDeclaredField("MEIZU_FLAG_DARK_STATUS_BAR_ICON"); + Field meizuFlags = WindowManager.LayoutParams.class.getDeclaredField("meizuFlags"); + darkFlag.setAccessible(true); + meizuFlags.setAccessible(true); + int bit = darkFlag.getInt(null); + int value = meizuFlags.getInt(params); + if (isLightStatusBar) { + value |= bit; + } else { + value &= ~bit; + } + meizuFlags.setInt(params, value); + window.setAttributes(params); + darkFlag.setAccessible(false); + meizuFlags.setAccessible(false); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/app/src/main/java/com/sunfusheng/StickyHeaderListView/util/ToastUtil.java b/app/src/main/java/com/sunfusheng/StickyHeaderListView/util/ToastUtil.java new file mode 100644 index 0000000..70fc745 --- /dev/null +++ b/app/src/main/java/com/sunfusheng/StickyHeaderListView/util/ToastUtil.java @@ -0,0 +1,30 @@ +package com.sunfusheng.StickyHeaderListView.util; + +import android.content.Context; +import android.text.TextUtils; +import android.widget.Toast; + +/** + * Created by sunfusheng on 15/8/7. + */ +public class ToastUtil { + + private static Toast mToast; + + public static void show(Context context, String message) { + if (context == null || TextUtils.isEmpty(message)) return; + int duration; + if (message.length() > 10) { + duration = Toast.LENGTH_LONG; //如果字符串比较长,那么显示的时间也长一些。 + } else { + duration = Toast.LENGTH_SHORT; + } + if (mToast == null) { + mToast = Toast.makeText(context, message, duration); + } else { + mToast.setText(message); + mToast.setDuration(duration); + } + mToast.show(); + } +} diff --git a/app/src/main/java/com/sunfusheng/StickyHeaderListView/view/HeaderViewInterface.java b/app/src/main/java/com/sunfusheng/StickyHeaderListView/view/AbsHeaderView.java similarity index 73% rename from app/src/main/java/com/sunfusheng/StickyHeaderListView/view/HeaderViewInterface.java rename to app/src/main/java/com/sunfusheng/StickyHeaderListView/view/AbsHeaderView.java index 3f846ab..7af17d0 100644 --- a/app/src/main/java/com/sunfusheng/StickyHeaderListView/view/HeaderViewInterface.java +++ b/app/src/main/java/com/sunfusheng/StickyHeaderListView/view/AbsHeaderView.java @@ -6,15 +6,15 @@ import java.util.List; -public abstract class HeaderViewInterface { +public abstract class AbsHeaderView { - protected Activity mContext; + protected Activity mActivity; protected LayoutInflater mInflate; protected T mEntity; - public HeaderViewInterface(Activity context) { - this.mContext = context; - mInflate = LayoutInflater.from(context); + public AbsHeaderView(Activity activity) { + this.mActivity = activity; + mInflate = LayoutInflater.from(activity); } public boolean fillView(T t, ListView listView) { diff --git a/app/src/main/java/com/sunfusheng/StickyHeaderListView/view/FilterView.java b/app/src/main/java/com/sunfusheng/StickyHeaderListView/view/FilterView.java index 0e49129..5d7c7d5 100644 --- a/app/src/main/java/com/sunfusheng/StickyHeaderListView/view/FilterView.java +++ b/app/src/main/java/com/sunfusheng/StickyHeaderListView/view/FilterView.java @@ -8,6 +8,8 @@ import android.view.MotionEvent; import android.view.View; import android.view.ViewTreeObserver; +import android.view.animation.Animation; +import android.view.animation.RotateAnimation; import android.widget.AdapterView; import android.widget.ImageView; import android.widget.LinearLayout; @@ -22,7 +24,7 @@ import com.sunfusheng.StickyHeaderListView.model.FilterEntity; import com.sunfusheng.StickyHeaderListView.model.FilterTwoEntity; -import butterknife.Bind; +import butterknife.BindView; import butterknife.ButterKnife; /** @@ -30,52 +32,58 @@ */ public class FilterView extends LinearLayout implements View.OnClickListener { - @Bind(R.id.tv_category) - TextView tvCategory; - @Bind(R.id.iv_category_arrow) + @BindView(R.id.tv_category_title) + TextView tvCategoryTitle; + @BindView(R.id.iv_category_arrow) ImageView ivCategoryArrow; - @Bind(R.id.tv_sort) - TextView tvSort; - @Bind(R.id.iv_sort_arrow) + @BindView(R.id.tv_sort_title) + TextView tvSortTitle; + @BindView(R.id.iv_sort_arrow) ImageView ivSortArrow; - @Bind(R.id.tv_filter) - TextView tvFilter; - @Bind(R.id.iv_filter_arrow) + @BindView(R.id.tv_filter_title) + TextView tvFilterTitle; + @BindView(R.id.iv_filter_arrow) ImageView ivFilterArrow; - @Bind(R.id.ll_category) + @BindView(R.id.ll_category) LinearLayout llCategory; - @Bind(R.id.ll_sort) + @BindView(R.id.ll_sort) LinearLayout llSort; - @Bind(R.id.ll_filter) + @BindView(R.id.ll_filter) LinearLayout llFilter; - @Bind(R.id.lv_left) + @BindView(R.id.lv_left) ListView lvLeft; - @Bind(R.id.lv_right) + @BindView(R.id.lv_right) ListView lvRight; - @Bind(R.id.ll_head_layout) + @BindView(R.id.ll_head_layout) LinearLayout llHeadLayout; - @Bind(R.id.ll_content_list_view) + @BindView(R.id.ll_content_list_view) LinearLayout llContentListView; - @Bind(R.id.view_mask_bg) + @BindView(R.id.view_mask_bg) View viewMaskBg; private Context mContext; private Activity mActivity; - private boolean isStickyTop = false; // 是否吸附在顶部 - private boolean isShowing = false; + private int filterPosition = -1; + private int lastFilterPosition = -1; + public static final int POSITION_CATEGORY = 0; // 分类的位置 + public static final int POSITION_SORT = 1; // 排序的位置 + public static final int POSITION_FILTER = 2; // 筛选的位置 + + private boolean isShowing = false; private int panelHeight; private FilterData filterData; - private FilterTwoEntity selectedCategoryEntity; // 被选择的分类项 - private FilterEntity selectedSortEntity; // 被选择的排序项 - private FilterEntity selectedFilterEntity; // 被选择的筛选项 - private FilterLeftAdapter leftAdapter; private FilterRightAdapter rightAdapter; private FilterOneAdapter sortAdapter; private FilterOneAdapter filterAdapter; + private FilterTwoEntity leftSelectedCategoryEntity; // 被选择的分类项左侧数据 + private FilterEntity rightSelectedCategoryEntity; // 被选择的分类项右侧数据 + private FilterEntity selectedSortEntity; // 被选择的排序项 + private FilterEntity selectedFilterEntity; // 被选择的筛选项 + public FilterView(Context context, AttributeSet attrs) { super(context, attrs); init(context); @@ -91,15 +99,10 @@ private void init(Context context) { View view = LayoutInflater.from(context).inflate(R.layout.view_filter_layout, this); ButterKnife.bind(this, view); - initData(); initView(); initListener(); } - private void initData() { - - } - private void initView() { viewMaskBg.setVisibility(GONE); llContentListView.setVisibility(GONE); @@ -143,175 +146,165 @@ public void onClick(View v) { hide(); break; } - } // 复位筛选的显示状态 - public void resetFilterStatus() { - tvCategory.setTextColor(mContext.getResources().getColor(R.color.font_black_2)); + public void resetViewStatus() { + tvCategoryTitle.setTextColor(mContext.getResources().getColor(R.color.font_black_2)); ivCategoryArrow.setImageResource(R.mipmap.home_down_arrow); - tvSort.setTextColor(mContext.getResources().getColor(R.color.font_black_2)); + tvSortTitle.setTextColor(mContext.getResources().getColor(R.color.font_black_2)); ivSortArrow.setImageResource(R.mipmap.home_down_arrow); - tvFilter.setTextColor(mContext.getResources().getColor(R.color.font_black_2)); + tvFilterTitle.setTextColor(mContext.getResources().getColor(R.color.font_black_2)); ivFilterArrow.setImageResource(R.mipmap.home_down_arrow); } // 复位所有的状态 public void resetAllStatus() { - resetFilterStatus(); + resetViewStatus(); hide(); } - // 显示筛选布局 - public void showFilterLayout(int position) { - resetFilterStatus(); - switch (position) { - case 0: - setCategoryAdapter(); - break; - case 1: - setSortAdapter(); - break; - case 2: - setFilterAdapter(); - break; - } - - if (isShowing) return ; - show(); - } - // 设置分类数据 private void setCategoryAdapter() { - tvCategory.setTextColor(mActivity.getResources().getColor(R.color.orange)); - ivCategoryArrow.setImageResource(R.mipmap.home_up_arrow); lvLeft.setVisibility(VISIBLE); lvRight.setVisibility(VISIBLE); - if (selectedCategoryEntity == null) { - selectedCategoryEntity = filterData.getCategory().get(0); - } - // 左边列表视图 leftAdapter = new FilterLeftAdapter(mContext, filterData.getCategory()); lvLeft.setAdapter(leftAdapter); - leftAdapter.setSelectedEntity(selectedCategoryEntity); + if (leftSelectedCategoryEntity == null) { + leftSelectedCategoryEntity = filterData.getCategory().get(0); + } + leftAdapter.setSelectedEntity(leftSelectedCategoryEntity); lvLeft.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { - selectedCategoryEntity = filterData.getCategory().get(position); - leftAdapter.setSelectedEntity(selectedCategoryEntity); + leftSelectedCategoryEntity = filterData.getCategory().get(position); + leftAdapter.setSelectedEntity(leftSelectedCategoryEntity); // 右边列表视图 - rightAdapter = new FilterRightAdapter(mContext, selectedCategoryEntity.getList()); + rightAdapter = new FilterRightAdapter(mContext, leftSelectedCategoryEntity.getList()); lvRight.setAdapter(rightAdapter); - lvRight.setOnItemClickListener(new AdapterView.OnItemClickListener() { - @Override - public void onItemClick(AdapterView parent, View view, int position, long id) { - selectedCategoryEntity.setSelectedFilterEntity(selectedCategoryEntity.getList().get(position)); - rightAdapter.setSelectedEntity(selectedCategoryEntity.getSelectedFilterEntity()); - hide(); - if (onItemCategoryClickListener != null) { - onItemCategoryClickListener.onItemCategoryClick(selectedCategoryEntity); - } - } - }); + rightAdapter.setSelectedEntity(rightSelectedCategoryEntity); } }); - // 如果右边有选中的数据,设置 - if (selectedCategoryEntity.getSelectedFilterEntity() != null) { - rightAdapter = new FilterRightAdapter(mContext, selectedCategoryEntity.getList()); - } else { - rightAdapter = new FilterRightAdapter(mContext, filterData.getCategory().get(0).getList()); - } + // 右边列表视图 + rightAdapter = new FilterRightAdapter(mContext, leftSelectedCategoryEntity.getList()); lvRight.setAdapter(rightAdapter); + rightAdapter.setSelectedEntity(rightSelectedCategoryEntity); lvRight.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { - selectedCategoryEntity.setSelectedFilterEntity(selectedCategoryEntity.getList().get(position)); - rightAdapter.setSelectedEntity(selectedCategoryEntity.getSelectedFilterEntity()); - hide(); + rightSelectedCategoryEntity = leftSelectedCategoryEntity.getList().get(position); + rightAdapter.setSelectedEntity(rightSelectedCategoryEntity); if (onItemCategoryClickListener != null) { - onItemCategoryClickListener.onItemCategoryClick(selectedCategoryEntity); + onItemCategoryClickListener.onItemCategoryClick(leftSelectedCategoryEntity, rightSelectedCategoryEntity); } + hide(); } }); } // 设置排序数据 private void setSortAdapter() { - tvSort.setTextColor(mActivity.getResources().getColor(R.color.orange)); - ivSortArrow.setImageResource(R.mipmap.home_up_arrow); lvLeft.setVisibility(GONE); lvRight.setVisibility(VISIBLE); + sortAdapter = new FilterOneAdapter(mContext, filterData.getSorts()); lvRight.setAdapter(sortAdapter); + lvRight.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { selectedSortEntity = filterData.getSorts().get(position); sortAdapter.setSelectedEntity(selectedSortEntity); - hide(); if (onItemSortClickListener != null) { onItemSortClickListener.onItemSortClick(selectedSortEntity); } + hide(); } }); } // 设置筛选数据 private void setFilterAdapter() { - tvFilter.setTextColor(mActivity.getResources().getColor(R.color.orange)); - ivFilterArrow.setImageResource(R.mipmap.home_up_arrow); lvLeft.setVisibility(GONE); lvRight.setVisibility(VISIBLE); + filterAdapter = new FilterOneAdapter(mContext, filterData.getFilters()); lvRight.setAdapter(filterAdapter); + lvRight.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { selectedFilterEntity = filterData.getFilters().get(position); filterAdapter.setSelectedEntity(selectedFilterEntity); - hide(); if (onItemFilterClickListener != null) { onItemFilterClickListener.onItemFilterClick(selectedFilterEntity); } + hide(); } }); } // 动画显示 - private void show() { + public void show(int position) { + if (isShowing && lastFilterPosition == position) { + hide(); + return; + } else if (!isShowing) { + viewMaskBg.setVisibility(VISIBLE); + llContentListView.setVisibility(VISIBLE); + llContentListView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { + @Override + public void onGlobalLayout() { + llContentListView.getViewTreeObserver().removeGlobalOnLayoutListener(this); + panelHeight = llContentListView.getHeight(); + ObjectAnimator.ofFloat(llContentListView, "translationY", -panelHeight, 0).setDuration(200).start(); + } + }); + } isShowing = true; - viewMaskBg.setVisibility(VISIBLE); - llContentListView.setVisibility(VISIBLE); - llContentListView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { - @Override - public void onGlobalLayout() { - llContentListView.getViewTreeObserver().removeGlobalOnLayoutListener(this); - panelHeight = llContentListView.getHeight(); - ObjectAnimator.ofFloat(llContentListView, "translationY", -panelHeight, 0).setDuration(200).start(); - } - }); + resetViewStatus(); + rotateArrowUp(position); + rotateArrowDown(lastFilterPosition); + lastFilterPosition = position; + + switch (position) { + case POSITION_CATEGORY: + tvCategoryTitle.setTextColor(mActivity.getResources().getColor(R.color.colorPrimary)); + ivCategoryArrow.setImageResource(R.mipmap.home_down_arrow_red); + setCategoryAdapter(); + break; + case POSITION_SORT: + tvSortTitle.setTextColor(mActivity.getResources().getColor(R.color.colorPrimary)); + ivSortArrow.setImageResource(R.mipmap.home_down_arrow_red); + setSortAdapter(); + break; + case POSITION_FILTER: + tvFilterTitle.setTextColor(mActivity.getResources().getColor(R.color.colorPrimary)); + ivFilterArrow.setImageResource(R.mipmap.home_down_arrow_red); + setFilterAdapter(); + break; + } } // 隐藏动画 public void hide() { isShowing = false; - resetFilterStatus(); + resetViewStatus(); + rotateArrowDown(filterPosition); + rotateArrowDown(lastFilterPosition); + filterPosition = -1; + lastFilterPosition = -1; viewMaskBg.setVisibility(View.GONE); ObjectAnimator.ofFloat(llContentListView, "translationY", 0, -panelHeight).setDuration(200).start(); } - // 是否吸附在顶部 - public void setStickyTop(boolean stickyTop) { - isStickyTop = stickyTop; - } - // 设置筛选数据 public void setFilterData(Activity activity, FilterData filterData) { this.mActivity = activity; @@ -323,6 +316,58 @@ public boolean isShowing() { return isShowing; } + public int getFilterPosition() { + return filterPosition; + } + + // 旋转箭头向上 + private void rotateArrowUp(int position) { + switch (position) { + case POSITION_CATEGORY: + rotateArrowUpAnimation(ivCategoryArrow); + break; + case POSITION_SORT: + rotateArrowUpAnimation(ivSortArrow); + break; + case POSITION_FILTER: + rotateArrowUpAnimation(ivFilterArrow); + break; + } + } + + // 旋转箭头向下 + private void rotateArrowDown(int position) { + switch (position) { + case POSITION_CATEGORY: + rotateArrowDownAnimation(ivCategoryArrow); + break; + case POSITION_SORT: + rotateArrowDownAnimation(ivSortArrow); + break; + case POSITION_FILTER: + rotateArrowDownAnimation(ivFilterArrow); + break; + } + } + + // 旋转箭头向上 + public static void rotateArrowUpAnimation(final ImageView iv) { + if (iv == null) return; + RotateAnimation animation = new RotateAnimation(0f, 180f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); + animation.setDuration(200); + animation.setFillAfter(true); + iv.startAnimation(animation); + } + + // 旋转箭头向下 + public static void rotateArrowDownAnimation(final ImageView iv) { + if (iv == null) return; + RotateAnimation animation = new RotateAnimation(180f, 0f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); + animation.setDuration(200); + animation.setFillAfter(true); + iv.startAnimation(animation); + } + // 筛选视图点击 private OnFilterClickListener onFilterClickListener; public void setOnFilterClickListener(OnFilterClickListener onFilterClickListener) { @@ -338,7 +383,7 @@ public void setOnItemCategoryClickListener(OnItemCategoryClickListener onItemCat this.onItemCategoryClickListener = onItemCategoryClickListener; } public interface OnItemCategoryClickListener { - void onItemCategoryClick(FilterTwoEntity entity); + void onItemCategoryClick(FilterTwoEntity leftEntity, FilterEntity rightEntity); } // 排序Item点击 diff --git a/app/src/main/java/com/sunfusheng/StickyHeaderListView/view/FixedSpeedScroller.java b/app/src/main/java/com/sunfusheng/StickyHeaderListView/view/FixedSpeedScroller.java new file mode 100644 index 0000000..3e1f70b --- /dev/null +++ b/app/src/main/java/com/sunfusheng/StickyHeaderListView/view/FixedSpeedScroller.java @@ -0,0 +1,36 @@ +package com.sunfusheng.StickyHeaderListView.view; + +import android.content.Context; +import android.view.animation.Interpolator; +import android.widget.Scroller; + +/** + * Created by sunfusheng on 16/8/18. + */ +public class FixedSpeedScroller extends Scroller { + + private int mDuration = 1000; + + public FixedSpeedScroller(Context context) { + super(context); + } + + public FixedSpeedScroller(Context context, Interpolator interpolator) { + super(context, interpolator); + } + + @Override + public void startScroll(int startX, int startY, int dx, int dy, int duration) { + super.startScroll(startX, startY, dx, dy, mDuration); + } + + @Override + public void startScroll(int startX, int startY, int dx, int dy) { + super.startScroll(startX, startY, dx, dy, mDuration); + } + + public void setDuration(int time) { + mDuration = time; + } + +} diff --git a/app/src/main/java/com/sunfusheng/StickyHeaderListView/view/GlideCircleTransform.java b/app/src/main/java/com/sunfusheng/StickyHeaderListView/view/GlideCircleTransform.java deleted file mode 100644 index efd9e5f..0000000 --- a/app/src/main/java/com/sunfusheng/StickyHeaderListView/view/GlideCircleTransform.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.sunfusheng.StickyHeaderListView.view; - -import android.content.Context; -import android.graphics.Bitmap; -import android.graphics.BitmapShader; -import android.graphics.Canvas; -import android.graphics.Paint; - -import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool; -import com.bumptech.glide.load.resource.bitmap.BitmapTransformation; - -/** - * Created by sunfusheng on 16/4/6. - */ -public class GlideCircleTransform extends BitmapTransformation { - - public GlideCircleTransform(Context context) { - super(context); - } - - @Override - protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) { - return circleCrop(pool, toTransform); - } - - private static Bitmap circleCrop(BitmapPool pool, Bitmap source) { - if (source == null) return null; - - int size = Math.min(source.getWidth(), source.getHeight()); - int x = (source.getWidth() - size) / 2; - int y = (source.getHeight() - size) / 2; - - Bitmap squared = Bitmap.createBitmap(source, x, y, size, size); - - Bitmap result = pool.get(size, size, Bitmap.Config.ARGB_8888); - if (result == null) { - result = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888); - } - - Canvas canvas = new Canvas(result); - Paint paint = new Paint(); - paint.setShader(new BitmapShader(squared, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP)); - paint.setAntiAlias(true); - float r = size / 2f; - canvas.drawCircle(r, r, r, paint); - return result; - } - - @Override - public String getId() { - return getClass().getName(); - } -} diff --git a/app/src/main/java/com/sunfusheng/StickyHeaderListView/view/GlideRoundTransform.java b/app/src/main/java/com/sunfusheng/StickyHeaderListView/view/GlideRoundTransform.java deleted file mode 100644 index f144841..0000000 --- a/app/src/main/java/com/sunfusheng/StickyHeaderListView/view/GlideRoundTransform.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.sunfusheng.StickyHeaderListView.view; - -import android.content.Context; -import android.content.res.Resources; -import android.graphics.Bitmap; -import android.graphics.BitmapShader; -import android.graphics.Canvas; -import android.graphics.Paint; -import android.graphics.RectF; - -import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool; -import com.bumptech.glide.load.resource.bitmap.BitmapTransformation; - -/** - * Created by sunfusheng on 16/4/6. - */ -public class GlideRoundTransform extends BitmapTransformation { - - private static float radius = 0f; - - public GlideRoundTransform(Context context) { - this(context, 4); - } - - public GlideRoundTransform(Context context, int dp) { - super(context); - this.radius = Resources.getSystem().getDisplayMetrics().density * dp; - } - - @Override - protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) { - return roundCrop(pool, toTransform); - } - - private static Bitmap roundCrop(BitmapPool pool, Bitmap source) { - if (source == null) return null; - - Bitmap result = pool.get(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888); - if (result == null) { - result = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888); - } - - Canvas canvas = new Canvas(result); - Paint paint = new Paint(); - paint.setShader(new BitmapShader(source, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP)); - paint.setAntiAlias(true); - RectF rectF = new RectF(0f, 0f, source.getWidth(), source.getHeight()); - canvas.drawRoundRect(rectF, radius, radius, paint); - return result; - } - - @Override - public String getId() { - return getClass().getName() + Math.round(radius); - } -} diff --git a/app/src/main/java/com/sunfusheng/StickyHeaderListView/view/HeaderAdViewView.java b/app/src/main/java/com/sunfusheng/StickyHeaderListView/view/HeaderAdViewView.java deleted file mode 100644 index 9e473f7..0000000 --- a/app/src/main/java/com/sunfusheng/StickyHeaderListView/view/HeaderAdViewView.java +++ /dev/null @@ -1,166 +0,0 @@ -package com.sunfusheng.StickyHeaderListView.view; - -import android.app.Activity; -import android.os.Handler; -import android.os.Message; -import android.os.SystemClock; -import android.support.v4.view.ViewPager; -import android.view.View; -import android.view.ViewGroup; -import android.widget.AbsListView; -import android.widget.ImageView; -import android.widget.LinearLayout; -import android.widget.ListView; - -import com.sunfusheng.StickyHeaderListView.R; -import com.sunfusheng.StickyHeaderListView.adapter.HeaderAdAdapter; -import com.sunfusheng.StickyHeaderListView.manager.ImageManager; -import com.sunfusheng.StickyHeaderListView.util.DensityUtil; - -import java.util.ArrayList; -import java.util.List; - -import butterknife.Bind; -import butterknife.ButterKnife; - -public class HeaderAdViewView extends HeaderViewInterface> { - - @Bind(R.id.vp_ad) - ViewPager vpAd; - @Bind(R.id.ll_index_container) - LinearLayout llIndexContainer; - - private static final int TYPE_CHANGE_AD = 0; - private Thread mThread; - private List ivList; - private boolean isStopThread = false; - private ImageManager mImageManager; - - private Handler mHandler = new Handler() { - @Override - public void handleMessage(Message msg) { - super.handleMessage(msg); - if (msg.what == TYPE_CHANGE_AD) { - vpAd.setCurrentItem(vpAd.getCurrentItem() + 1); - } - } - }; - - public HeaderAdViewView(Activity context) { - super(context); - ivList = new ArrayList<>(); - mImageManager = new ImageManager(context); - } - - @Override - protected void getView(List list, ListView listView) { - View view = mInflate.inflate(R.layout.header_ad_layout, listView, false); - ButterKnife.bind(this, view); - - dealWithTheView(list); - listView.addHeaderView(view); - } - - private void dealWithTheView(List list) { - ivList.clear(); - int size = list.size(); - for (int i = 0; i < size; i++) { - ivList.add(createImageView(list.get(i))); - } - - HeaderAdAdapter photoAdapter = new HeaderAdAdapter(mContext, ivList); - vpAd.setAdapter(photoAdapter); - - addIndicatorImageViews(size); - setViewPagerChangeListener(size); - startADRotate(); - } - - // 创建要显示的ImageView - private ImageView createImageView(String url) { - ImageView imageView = new ImageView(mContext); - AbsListView.LayoutParams params = new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); - imageView.setLayoutParams(params); - imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); - mImageManager.loadUrlImage(url, imageView); - return imageView; - } - - // 添加指示图标 - private void addIndicatorImageViews(int size) { - llIndexContainer.removeAllViews(); - for (int i = 0; i < size; i++) { - ImageView iv = new ImageView(mContext); - LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(DensityUtil.dip2px(mContext, 5), DensityUtil.dip2px(mContext, 5)); - if (i != 0) { - lp.leftMargin = DensityUtil.dip2px(mContext, 7); - } - iv.setLayoutParams(lp); - iv.setBackgroundResource(R.drawable.xml_round_orange_grey_sel); - iv.setEnabled(false); - if (i == 0) { - iv.setEnabled(true); - } - llIndexContainer.addView(iv); - } - } - - // 为ViewPager设置监听器 - private void setViewPagerChangeListener(final int size) { - vpAd.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { - @Override - public void onPageSelected(int position) { - if (ivList != null && ivList.size() > 0) { - int newPosition = position % size; - for (int i = 0; i < size; i++) { - llIndexContainer.getChildAt(i).setEnabled(false); - if (i == newPosition) { - llIndexContainer.getChildAt(i).setEnabled(true); - } - } - } - } - - @Override - public void onPageScrolled(int position, float arg1, int arg2) { - } - - @Override - public void onPageScrollStateChanged(int arg0) { - } - }); - } - - // 启动循环广告的线程 - private void startADRotate() { - // 一个广告的时候不用转 - if (ivList == null || ivList.size() <= 1) { - return; - } - if (mThread == null) { - mThread = new Thread(new Runnable() { - - @Override - public void run() { - // 当没离开该页面时一直转 - while (!isStopThread) { - // 每隔5秒转一次 - SystemClock.sleep(5000); - // 在主线程更新界面 - mHandler.sendEmptyMessage(TYPE_CHANGE_AD); - } - } - }); - mThread.start(); - } - } - - // 停止循环广告的线程,清空消息队列 - public void stopADRotate() { - isStopThread = true; - if (mHandler != null && mHandler.hasMessages(TYPE_CHANGE_AD)) { - mHandler.removeMessages(TYPE_CHANGE_AD); - } - } - -} diff --git a/app/src/main/java/com/sunfusheng/StickyHeaderListView/view/HeaderBannerView.java b/app/src/main/java/com/sunfusheng/StickyHeaderListView/view/HeaderBannerView.java new file mode 100644 index 0000000..75e669a --- /dev/null +++ b/app/src/main/java/com/sunfusheng/StickyHeaderListView/view/HeaderBannerView.java @@ -0,0 +1,165 @@ +package com.sunfusheng.StickyHeaderListView.view; + +import android.app.Activity; +import android.os.Handler; +import android.os.Message; +import android.support.v4.view.ViewPager; +import android.view.View; +import android.view.ViewGroup; +import android.view.animation.AccelerateDecelerateInterpolator; +import android.widget.AbsListView; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.ListView; +import android.widget.RelativeLayout; + +import com.sunfusheng.StickyHeaderListView.R; +import com.sunfusheng.StickyHeaderListView.adapter.HeaderBannerAdapter; +import com.sunfusheng.StickyHeaderListView.util.DensityUtil; +import com.sunfusheng.glideimageview.GlideImageView; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import butterknife.ButterKnife; + +public class HeaderBannerView extends AbsHeaderView> { + + @BindView(R.id.vp_banner) + ViewPager vpBanner; + @BindView(R.id.ll_index_container) + LinearLayout llIndexContainer; + @BindView(R.id.rl_banner) + RelativeLayout rlBanner; + + private static final int BANNER_TYPE = 0; + private static final int BANNER_TIME = 5000; // ms + private List ivList; + private int bannerHeight; + private int bannerCount; + + private Handler mHandler = new Handler() { + @Override + public void handleMessage(Message msg) { + super.handleMessage(msg); + if (msg.what == BANNER_TYPE) { + vpBanner.setCurrentItem(vpBanner.getCurrentItem() + 1); + enqueueBannerLoopMessage(); + } + } + }; + + public HeaderBannerView(Activity context) { + super(context); + ivList = new ArrayList<>(); + bannerHeight = DensityUtil.getWindowWidth(context) * 9 / 16; + } + + @Override + protected void getView(List list, ListView listView) { + View view = mInflate.inflate(R.layout.header_banner_layout, listView, false); + ButterKnife.bind(this, view); + + dealWithTheView(list); + listView.addHeaderView(view); + } + + private void dealWithTheView(List list) { + ivList.clear(); + + bannerCount = list.size(); + if (bannerCount == 2) { + list.addAll(list); + } + + AbsListView.LayoutParams layoutParams = (AbsListView.LayoutParams) rlBanner.getLayoutParams(); + layoutParams.height = bannerHeight; + rlBanner.setLayoutParams(layoutParams); + + createImageViews(list); + + HeaderBannerAdapter adapter = new HeaderBannerAdapter(ivList); + vpBanner.setAdapter(adapter); + + addIndicatorImageViews(); + setViewPagerChangeListener(); + controlViewPagerSpeed(vpBanner, 500); + } + + // 创建要显示的ImageView + private void createImageViews(List list) { + for (int i = 0; i < list.size(); i++) { + GlideImageView imageView = new GlideImageView(mActivity); + AbsListView.LayoutParams params = new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); + imageView.setLayoutParams(params); + imageView.loadImage(list.get(i), R.color.font_black_6); + imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); + ivList.add(imageView); + } + } + + // 添加指示图标 + private void addIndicatorImageViews() { + llIndexContainer.removeAllViews(); + if (bannerCount < 2) return; + for (int i = 0; i < bannerCount; i++) { + ImageView iv = new ImageView(mActivity); + LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(DensityUtil.dip2px(mActivity, 5), DensityUtil.dip2px(mActivity, 5)); + lp.leftMargin = DensityUtil.dip2px(mActivity, (i == 0) ? 0 : 7); + iv.setLayoutParams(lp); + iv.setBackgroundResource(R.drawable.xml_round_orange_grey_sel); + iv.setEnabled(i == 0); + llIndexContainer.addView(iv); + } + } + + // 为ViewPager设置监听器 + private void setViewPagerChangeListener() { + vpBanner.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageSelected(int position) { + if (ivList == null || ivList.size() == 0) return; + int newPosition = position % bannerCount; + for (int i = 0; i < bannerCount; i++) { + llIndexContainer.getChildAt(i).setEnabled(i == newPosition); + } + } + + @Override + public void onPageScrolled(int position, float arg1, int arg2) { + } + + @Override + public void onPageScrollStateChanged(int arg0) { + } + }); + } + + // 添加Banner循环消息到队列 + public void enqueueBannerLoopMessage() { + if (ivList == null || ivList.size() <= 1) return; + mHandler.sendEmptyMessageDelayed(BANNER_TYPE, BANNER_TIME); + } + + // 移除Banner循环的消息 + public void removeBannerLoopMessage() { + if (mHandler.hasMessages(BANNER_TYPE)) { + mHandler.removeMessages(BANNER_TYPE); + } + } + + // 反射设置ViewPager的轮播速度 + private void controlViewPagerSpeed(ViewPager viewPager, int speedTimeMillis) { + try { + Field field = ViewPager.class.getDeclaredField("mScroller"); + field.setAccessible(true); + FixedSpeedScroller scroller = new FixedSpeedScroller(mActivity, new AccelerateDecelerateInterpolator()); + scroller.setDuration(speedTimeMillis); + field.set(viewPager, scroller); + } catch (Exception e) { + } + } + +} diff --git a/app/src/main/java/com/sunfusheng/StickyHeaderListView/view/HeaderChannelViewView.java b/app/src/main/java/com/sunfusheng/StickyHeaderListView/view/HeaderChannelView.java similarity index 57% rename from app/src/main/java/com/sunfusheng/StickyHeaderListView/view/HeaderChannelViewView.java rename to app/src/main/java/com/sunfusheng/StickyHeaderListView/view/HeaderChannelView.java index 831c215..d862260 100644 --- a/app/src/main/java/com/sunfusheng/StickyHeaderListView/view/HeaderChannelViewView.java +++ b/app/src/main/java/com/sunfusheng/StickyHeaderListView/view/HeaderChannelView.java @@ -2,26 +2,28 @@ import android.app.Activity; import android.view.View; +import android.widget.AdapterView; import android.widget.ListView; import com.sunfusheng.StickyHeaderListView.R; import com.sunfusheng.StickyHeaderListView.adapter.HeaderChannelAdapter; import com.sunfusheng.StickyHeaderListView.model.ChannelEntity; +import com.sunfusheng.StickyHeaderListView.util.ToastUtil; import java.util.List; -import butterknife.Bind; +import butterknife.BindView; import butterknife.ButterKnife; /** * Created by sunfusheng on 16/4/20. */ -public class HeaderChannelViewView extends HeaderViewInterface> { +public class HeaderChannelView extends AbsHeaderView> { - @Bind(R.id.gv_channel) + @BindView(R.id.gv_channel) FixedGridView gvChannel; - public HeaderChannelViewView(Activity context) { + public HeaderChannelView(Activity context) { super(context); } @@ -34,9 +36,9 @@ protected void getView(List list, ListView listView) { listView.addHeaderView(view); } - private void dealWithTheView(List list) { + private void dealWithTheView(final List list) { + if (list == null || list.size() < 2) return; int size = list.size(); - if (size <= 4) { gvChannel.setNumColumns(size); } else if (size == 6) { @@ -44,11 +46,18 @@ private void dealWithTheView(List list) { } else if (size == 8) { gvChannel.setNumColumns(4); } else { - gvChannel.setNumColumns(4); + return; } - HeaderChannelAdapter adapter = new HeaderChannelAdapter(mContext, list); + final HeaderChannelAdapter adapter = new HeaderChannelAdapter(mActivity, list); gvChannel.setAdapter(adapter); + + gvChannel.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + ToastUtil.show(mActivity, adapter.getItem(position).getTitle()); + } + }); } } diff --git a/app/src/main/java/com/sunfusheng/StickyHeaderListView/view/HeaderDividerViewView.java b/app/src/main/java/com/sunfusheng/StickyHeaderListView/view/HeaderDividerView.java similarity index 78% rename from app/src/main/java/com/sunfusheng/StickyHeaderListView/view/HeaderDividerViewView.java rename to app/src/main/java/com/sunfusheng/StickyHeaderListView/view/HeaderDividerView.java index 31badee..c699077 100644 --- a/app/src/main/java/com/sunfusheng/StickyHeaderListView/view/HeaderDividerViewView.java +++ b/app/src/main/java/com/sunfusheng/StickyHeaderListView/view/HeaderDividerView.java @@ -9,9 +9,9 @@ /** * Created by sunfusheng on 16/4/20. */ -public class HeaderDividerViewView extends HeaderViewInterface { +public class HeaderDividerView extends AbsHeaderView { - public HeaderDividerViewView(Activity context) { + public HeaderDividerView(Activity context) { super(context); } diff --git a/app/src/main/java/com/sunfusheng/StickyHeaderListView/view/HeaderFilterView.java b/app/src/main/java/com/sunfusheng/StickyHeaderListView/view/HeaderFilterView.java new file mode 100644 index 0000000..be181bd --- /dev/null +++ b/app/src/main/java/com/sunfusheng/StickyHeaderListView/view/HeaderFilterView.java @@ -0,0 +1,36 @@ +package com.sunfusheng.StickyHeaderListView.view; + +import android.app.Activity; +import android.view.View; +import android.widget.ListView; + +import com.sunfusheng.StickyHeaderListView.R; + +import butterknife.BindView; +import butterknife.ButterKnife; + +/** + * Created by sunfusheng on 16/4/20. + */ +public class HeaderFilterView extends AbsHeaderView { + + + @BindView(R.id.fake_filterView) + FilterView fakeFilterView; + + public HeaderFilterView(Activity context) { + super(context); + } + + @Override + protected void getView(Object obj, ListView listView) { + View view = mInflate.inflate(R.layout.header_filter_layout, listView, false); + ButterKnife.bind(this, view); + listView.addHeaderView(view); + } + + public FilterView getFilterView() { + return fakeFilterView; + } + +} diff --git a/app/src/main/java/com/sunfusheng/StickyHeaderListView/view/HeaderFilterViewView.java b/app/src/main/java/com/sunfusheng/StickyHeaderListView/view/HeaderFilterViewView.java deleted file mode 100644 index 7d6d3d3..0000000 --- a/app/src/main/java/com/sunfusheng/StickyHeaderListView/view/HeaderFilterViewView.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.sunfusheng.StickyHeaderListView.view; - -import android.app.Activity; -import android.view.View; -import android.widget.ListView; - -import com.sunfusheng.StickyHeaderListView.R; - -import butterknife.Bind; -import butterknife.ButterKnife; - -/** - * Created by sunfusheng on 16/4/20. - */ -public class HeaderFilterViewView extends HeaderViewInterface implements FilterView.OnFilterClickListener { - - @Bind(R.id.fv_filter) - FilterView fvFilter; - - public HeaderFilterViewView(Activity context) { - super(context); - } - - @Override - protected void getView(Object obj, ListView listView) { - View view = mInflate.inflate(R.layout.header_filter_layout, listView, false); - ButterKnife.bind(this, view); - - dealWithTheView(obj); - listView.addHeaderView(view); - } - - // 获得筛选View - public FilterView getFilterView() { - return fvFilter; - } - - private void dealWithTheView(Object obj) { - fvFilter.setOnFilterClickListener(this); - } - - @Override - public void onFilterClick(int position) { - if (onFilterClickListener != null) { - onFilterClickListener.onFilterClick(position); - } - } - - private OnFilterClickListener onFilterClickListener; - public void setOnFilterClickListener(OnFilterClickListener onFilterClickListener) { - this.onFilterClickListener = onFilterClickListener; - } - public interface OnFilterClickListener { - void onFilterClick(int position); - } - -} diff --git a/app/src/main/java/com/sunfusheng/StickyHeaderListView/view/HeaderOperationViewView.java b/app/src/main/java/com/sunfusheng/StickyHeaderListView/view/HeaderOperationView.java similarity index 52% rename from app/src/main/java/com/sunfusheng/StickyHeaderListView/view/HeaderOperationViewView.java rename to app/src/main/java/com/sunfusheng/StickyHeaderListView/view/HeaderOperationView.java index bc705e2..3e47c76 100644 --- a/app/src/main/java/com/sunfusheng/StickyHeaderListView/view/HeaderOperationViewView.java +++ b/app/src/main/java/com/sunfusheng/StickyHeaderListView/view/HeaderOperationView.java @@ -2,26 +2,28 @@ import android.app.Activity; import android.view.View; +import android.widget.AdapterView; import android.widget.ListView; import com.sunfusheng.StickyHeaderListView.R; import com.sunfusheng.StickyHeaderListView.adapter.HeaderOperationAdapter; import com.sunfusheng.StickyHeaderListView.model.OperationEntity; +import com.sunfusheng.StickyHeaderListView.util.ToastUtil; import java.util.List; -import butterknife.Bind; +import butterknife.BindView; import butterknife.ButterKnife; /** * Created by sunfusheng on 16/4/20. */ -public class HeaderOperationViewView extends HeaderViewInterface> { +public class HeaderOperationView extends AbsHeaderView> { - @Bind(R.id.gv_operation) + @BindView(R.id.gv_operation) FixedGridView gvOperation; - public HeaderOperationViewView(Activity context) { + public HeaderOperationView(Activity context) { super(context); } @@ -35,8 +37,18 @@ protected void getView(List list, ListView listView) { } private void dealWithTheView(List list) { - HeaderOperationAdapter adapter = new HeaderOperationAdapter(mContext, list); + if (list == null || list.size() < 2 || list.size() > 6) return; + if (list.size()%2 != 0) return; + + final HeaderOperationAdapter adapter = new HeaderOperationAdapter(mActivity, list); gvOperation.setAdapter(adapter); + + gvOperation.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + ToastUtil.show(mActivity, adapter.getItem(position).getTitle()); + } + }); } } diff --git a/app/src/main/res/drawable/xml_oval_orange_icon.xml b/app/src/main/res/drawable/xml_oval_orange_icon.xml index f64705b..ca476ba 100644 --- a/app/src/main/res/drawable/xml_oval_orange_icon.xml +++ b/app/src/main/res/drawable/xml_oval_orange_icon.xml @@ -2,7 +2,7 @@ - + \ No newline at end of file diff --git a/app/src/main/res/drawable/xml_round_orange_icon.xml b/app/src/main/res/drawable/xml_round_orange_icon.xml index b2c302a..40c514f 100644 --- a/app/src/main/res/drawable/xml_round_orange_icon.xml +++ b/app/src/main/res/drawable/xml_round_orange_icon.xml @@ -2,7 +2,7 @@ - + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index db366b3..8a7dac8 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -22,14 +22,15 @@ + android:visibility="gone"/> \ No newline at end of file diff --git a/app/src/main/res/layout/header_ad_layout.xml b/app/src/main/res/layout/header_banner_layout.xml similarity index 91% rename from app/src/main/res/layout/header_ad_layout.xml rename to app/src/main/res/layout/header_banner_layout.xml index 8a5b613..2b69cf8 100644 --- a/app/src/main/res/layout/header_ad_layout.xml +++ b/app/src/main/res/layout/header_banner_layout.xml @@ -1,11 +1,12 @@ diff --git a/app/src/main/res/layout/header_filter_layout.xml b/app/src/main/res/layout/header_filter_layout.xml index 5def4e3..1833dd9 100644 --- a/app/src/main/res/layout/header_filter_layout.xml +++ b/app/src/main/res/layout/header_filter_layout.xml @@ -1,6 +1,6 @@ - + android:src="@color/font_black_4" + app:siv_shape_type="circle"/> - diff --git a/app/src/main/res/layout/item_travel.xml b/app/src/main/res/layout/item_travel.xml index 2c1223d..003f770 100644 --- a/app/src/main/res/layout/item_travel.xml +++ b/app/src/main/res/layout/item_travel.xml @@ -13,8 +13,8 @@ android:background="@drawable/ripple_item_clicked" android:padding="10dp"> - diff --git a/app/src/main/res/layout/view_filter_layout.xml b/app/src/main/res/layout/view_filter_layout.xml index 8844f21..d6b1677 100644 --- a/app/src/main/res/layout/view_filter_layout.xml +++ b/app/src/main/res/layout/view_filter_layout.xml @@ -29,7 +29,7 @@ android:orientation="horizontal"> - #f27242 - #f27242 - #f27242 + #c34a42 + #c34a42 + #c34a42 #FFFFFF #000000 #00000000 #8f000000 - #f27242 #FFF5F5F5 diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 54e9164..d92066b 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -2,11 +2,10 @@ diff --git a/build.gradle b/build.gradle index edf5113..4a19db4 100644 --- a/build.gradle +++ b/build.gradle @@ -1,16 +1,22 @@ - buildscript { repositories { + google() jcenter() + mavenCentral() + maven { url 'https://dl.bintray.com/sfsheng0322/maven' } } dependencies { - classpath 'com.android.tools.build:gradle:2.1.0' + classpath 'com.android.tools.build:gradle:3.0.1' + classpath 'com.jakewharton:butterknife-gradle-plugin:8.4.0' } } allprojects { repositories { + google() jcenter() + mavenCentral() + maven { url 'https://dl.bintray.com/sfsheng0322/maven' } } } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 122a0dc..0d6228c 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Mon Dec 28 10:00:20 PST 2015 +#Wed Nov 29 10:42:33 CST 2017 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.5-all.zip diff --git a/resources/fir.im.png b/resources/fir.im.png new file mode 100644 index 0000000..60e887e Binary files /dev/null and b/resources/fir.im.png differ diff --git a/resources/res.png b/resources/res.png new file mode 100644 index 0000000..d8886a9 Binary files /dev/null and b/resources/res.png differ diff --git a/screenshots/stickyheader.gif b/resources/stickyheader.gif similarity index 100% rename from screenshots/stickyheader.gif rename to resources/stickyheader.gif diff --git a/screenshots/stickyheader2.gif b/resources/stickyheader2.gif similarity index 100% rename from screenshots/stickyheader2.gif rename to resources/stickyheader2.gif diff --git a/screenshots/StickyHeaderListView2.png b/screenshots/StickyHeaderListView2.png deleted file mode 100644 index caefa8f..0000000 Binary files a/screenshots/StickyHeaderListView2.png and /dev/null differ diff --git a/screenshots/StickyHeaderListView3.png b/screenshots/StickyHeaderListView3.png deleted file mode 100644 index 7308dfe..0000000 Binary files a/screenshots/StickyHeaderListView3.png and /dev/null differ diff --git a/screenshots/StickyHeaderListView4.png b/screenshots/StickyHeaderListView4.png deleted file mode 100644 index 1609099..0000000 Binary files a/screenshots/StickyHeaderListView4.png and /dev/null differ diff --git a/screenshots/StickyHeaderListView5.png b/screenshots/StickyHeaderListView5.png deleted file mode 100644 index bc42416..0000000 Binary files a/screenshots/StickyHeaderListView5.png and /dev/null differ diff --git "a/screenshots/\345\276\256\344\277\241\345\205\254\344\274\227\345\217\267.jpg" "b/screenshots/\345\276\256\344\277\241\345\205\254\344\274\227\345\217\267.jpg" deleted file mode 100644 index f41e88f..0000000 Binary files "a/screenshots/\345\276\256\344\277\241\345\205\254\344\274\227\345\217\267.jpg" and /dev/null differ diff --git a/settings.gradle b/settings.gradle index e7b4def..8b7bc33 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1,10 @@ include ':app' + +gradle.ext.compileSdkVersion = 27 +gradle.ext.buildToolsVersion = '27.1.1' +gradle.ext.supportLibraryVersion = '27.1.1' + +gradle.ext.minSdkVersion = 14 +gradle.ext.targetSdkVersion = 27 +gradle.ext.versionCode = 9 +gradle.ext.versionName = "1.8.0" \ No newline at end of file diff --git a/signings/keystore.jks b/signings/keystore.jks new file mode 100644 index 0000000..8750357 Binary files /dev/null and b/signings/keystore.jks differ diff --git a/signings/signing.properties b/signings/signing.properties new file mode 100644 index 0000000..9f6f089 --- /dev/null +++ b/signings/signing.properties @@ -0,0 +1,4 @@ +KEYSTORE_FILEPATH=../signings/keystore.jks +STORE_PASSWORD=sunfusheng +KEY_ALIAS=sunfusheng +KEY_PASSWORD=sunfusheng \ No newline at end of file