Skip to content

Commit 54f1093

Browse files
committed
发现页面
1 parent a09577d commit 54f1093

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

61 files changed

+685
-30
lines changed

app/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,8 @@ android {
3838
debug {
3939
minifyEnabled false
4040
debuggable true
41-
// applicationIdSuffix '.debug'
42-
signingConfig signingConfigs.release
41+
applicationIdSuffix '.debug'
42+
// signingConfig signingConfigs.release
4343
}
4444
release {
4545
minifyEnabled false
Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,37 @@
11
package com.rae.cnblogs.discover;
22

33
import android.content.Context;
4+
import android.view.LayoutInflater;
5+
import android.view.View;
46
import android.widget.ImageView;
57

68
import com.antcode.sdk.model.AntAdInfo;
79
import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions;
8-
import com.bumptech.glide.request.RequestOptions;
910
import com.rae.cnblogs.basic.GlideApp;
10-
import com.youth.banner.loader.ImageLoader;
11+
import com.youth.banner.loader.ImageLoaderInterface;
1112

12-
import jp.wasabeef.glide.transformations.RoundedCornersTransformation;
13+
public class BannerImageLoader implements ImageLoaderInterface<View> {
14+
15+
private LayoutInflater mLayoutInflater;
1316

14-
public class BannerImageLoader extends ImageLoader {
1517
@Override
16-
public void displayImage(Context context, Object path, ImageView imageView) {
18+
public void displayImage(Context context, Object path, View view) {
1719
AntAdInfo adInfo = (AntAdInfo) path;
1820
String url = adInfo.getImageUrl();
21+
ImageView imageView = view.findViewById(R.id.img_logo);
1922

2023
GlideApp.with(context)
2124
.load(url)
2225
.transition(DrawableTransitionOptions.withCrossFade(300))
23-
.apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(45, 0)))
26+
// .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(20, 20)))
2427
.placeholder(R.drawable.default_placeholder_normal)
2528
.error(R.drawable.default_placeholder_error)
2629
.into(imageView);
2730
}
2831

32+
@Override
33+
public View createImageView(Context context) {
34+
if (mLayoutInflater == null) mLayoutInflater = LayoutInflater.from(context);
35+
return mLayoutInflater.inflate(R.layout.item_banner, null);
36+
}
2937
}

module-discover/src/main/java/com/rae/cnblogs/discover/DiscoverFragment.java

Lines changed: 104 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,31 @@
22

33
import android.os.Bundle;
44
import android.support.annotation.Nullable;
5+
import android.support.v4.view.ViewPager;
56
import android.support.v4.widget.SwipeRefreshLayout;
67
import android.support.v7.widget.LinearLayoutManager;
78
import android.support.v7.widget.RecyclerView;
9+
import android.util.TypedValue;
810
import android.view.Gravity;
11+
import android.view.View;
912
import android.view.ViewGroup;
13+
import android.widget.ImageView;
14+
import android.widget.TextView;
1015

1116
import com.alibaba.android.arouter.facade.annotation.Route;
1217
import com.antcode.sdk.model.AntAdInfo;
1318
import com.antcode.sdk.model.AntColumnInfo;
19+
import com.antcode.sdk.model.AntTabInfo;
1420
import com.rae.cnblogs.AppRoute;
21+
import com.rae.cnblogs.basic.AppImageLoader;
1522
import com.rae.cnblogs.basic.BasicFragment;
1623
import com.rae.cnblogs.discover.home.DiscoverHomeAdapter;
1724
import com.rae.cnblogs.discover.home.DiscoverHomePresenterImpl;
1825
import com.rae.cnblogs.discover.home.IDiscoverHomeContract;
1926
import com.youth.banner.Banner;
27+
import com.youth.banner.listener.OnBannerListener;
2028

29+
import java.util.ArrayList;
2130
import java.util.List;
2231

2332
import butterknife.BindView;
@@ -36,7 +45,11 @@ public class DiscoverFragment extends BasicFragment implements IDiscoverHomeCont
3645
SwipeRefreshLayout mRefreshLayout;
3746

3847
IDiscoverHomeContract.Presenter mPresenter;
39-
private final DiscoverHomeAdapter mAdapter = new DiscoverHomeAdapter();
48+
private DiscoverHomeAdapter mAdapter;
49+
@Nullable
50+
private Banner mBanner;
51+
private ViewGroup mTabLayout;
52+
private int mCurrentBannerPosition;
4053

4154
@Override
4255
protected int getLayoutId() {
@@ -53,6 +66,7 @@ public void onCreate(@Nullable Bundle savedInstanceState) {
5366
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
5467
super.onActivityCreated(savedInstanceState);
5568
// init views
69+
mAdapter = new DiscoverHomeAdapter(R.layout.item_discover_home_column, R.layout.item_discover_home_section, null);
5670
mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
5771
mRecyclerView.setAdapter(mAdapter);
5872
mRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@@ -61,24 +75,103 @@ public void onRefresh() {
6175
mPresenter.start();
6276
}
6377
});
64-
65-
78+
initTabs();
6679
mPresenter.start();
6780
}
6881

82+
private void initTabs() {
83+
mTabLayout = (ViewGroup) getLayoutInflater().inflate(R.layout.view_discover_category, (ViewGroup) getView(), false);
84+
mAdapter.addHeaderView(mTabLayout);
85+
}
86+
6987
@Override
70-
public void onLoadAds(List<AntAdInfo> ads) {
71-
mAdapter.removeAllHeaderView();
72-
Banner banner = (Banner) getLayoutInflater().inflate(R.layout.view_discover_banner, (ViewGroup) getView(), false);
73-
banner.setImageLoader(new BannerImageLoader());
74-
banner.setIndicatorGravity(Gravity.CENTER);
75-
banner.setImages(ads);
76-
banner.start();
77-
mAdapter.addHeaderView(banner);
88+
public void onLoadAds(final List<AntAdInfo> ads) {
89+
mRefreshLayout.setRefreshing(false);
90+
91+
if (mBanner == null) {
92+
Banner banner = (Banner) getLayoutInflater().inflate(R.layout.view_discover_banner, (ViewGroup) getView(), false);
93+
banner.setImageLoader(new BannerImageLoader());
94+
banner.setIndicatorGravity(Gravity.CENTER);
95+
mAdapter.addHeaderView(banner, 0);
96+
banner.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
97+
@Override
98+
public void onPageSelected(int position) {
99+
super.onPageSelected(position);
100+
mCurrentBannerPosition = position;
101+
}
102+
});
103+
banner.setOnBannerListener(new OnBannerListener() {
104+
@Override
105+
public void OnBannerClick(int position) {
106+
AntAdInfo adInfo = ads.get(position);
107+
AppRoute.autoRoute(getContext(), adInfo.getType(), adInfo.getUrl(), adInfo.getData());
108+
}
109+
});
110+
111+
ViewPager viewPager = banner.findViewById(R.id.bannerViewPager);
112+
viewPager.setOffscreenPageLimit(4);
113+
viewPager.setPageMargin((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, -35, getResources().getDisplayMetrics()));
114+
mBanner = banner;
115+
}
116+
117+
mBanner.setImages(ads).start();
78118
}
79119

80120
@Override
81121
public void onLoadColumns(List<AntColumnInfo> columns) {
122+
// load columns
123+
mRefreshLayout.setRefreshing(false);
124+
125+
List<DiscoverItem> data = new ArrayList<>();
126+
data.add(new DiscoverItem(true, "精选专栏"));
127+
128+
for (AntColumnInfo column : columns) {
129+
DiscoverItem item = new DiscoverItem(false, null);
130+
item.setData(column);
131+
data.add(item);
132+
}
133+
134+
mAdapter.setNewData(data);
135+
136+
137+
mAdapter.notifyDataSetChanged();
138+
}
139+
140+
@Override
141+
public void onLoadCategories(List<AntTabInfo> homeTabs) {
142+
mTabLayout.removeAllViews();
143+
for (AntTabInfo homeTab : homeTabs) {
144+
View view = getLayoutInflater().inflate(R.layout.item_discover_home_tab, mTabLayout, false);
145+
TextView textView = view.findViewById(R.id.tv_title);
146+
ImageView logo = view.findViewById(R.id.img_logo);
147+
textView.setText(homeTab.getName());
148+
String iconUrl = homeTab.getIcon();
149+
if (iconUrl.startsWith("res")) {
150+
try {
151+
iconUrl = iconUrl.replace("res/", "");
152+
logo.setImageResource(getResources().getIdentifier(iconUrl, "drawable", getContext().getPackageName()));
153+
} catch (Exception e) {
154+
e.printStackTrace();
155+
}
156+
} else {
157+
AppImageLoader.display(iconUrl, logo);
158+
}
159+
view.setOnClickListener(new TabClickListener(homeTab));
160+
mTabLayout.addView(view);
161+
}
162+
}
163+
164+
class TabClickListener implements View.OnClickListener {
165+
166+
private final AntTabInfo mHomeTab;
167+
168+
TabClickListener(AntTabInfo homeTab) {
169+
mHomeTab = homeTab;
170+
}
82171

172+
@Override
173+
public void onClick(View v) {
174+
AppRoute.autoRoute(v.getContext(), null, mHomeTab.getPath(), null);
175+
}
83176
}
84177
}
Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,42 @@
11
package com.rae.cnblogs.discover;
22

3-
public class DiscoverItem {
3+
4+
import com.chad.library.adapter.base.entity.MultiItemEntity;
5+
import com.chad.library.adapter.base.entity.SectionEntity;
6+
7+
public class DiscoverItem extends SectionEntity implements MultiItemEntity {
8+
9+
// 标题
10+
public final static int TYPE_SESSION = 0;
11+
12+
// 横向排列内容
13+
public final static int TYPE_CONTENT_HORIZONTAL = 1;
14+
15+
// 垂直排列内容
16+
public final static int TYPE_CONTENT_VERTICAL = 2;
17+
18+
private int itemType;
19+
20+
private Object data;
21+
22+
public Object getData() {
23+
return data;
24+
}
25+
26+
public void setData(Object data) {
27+
this.data = data;
28+
}
29+
30+
public DiscoverItem(boolean isHeader, String header) {
31+
super(isHeader, header);
32+
}
33+
34+
public void setItemType(int itemType) {
35+
this.itemType = itemType;
36+
}
37+
38+
@Override
39+
public int getItemType() {
40+
return itemType;
41+
}
442
}
Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,52 @@
11
package com.rae.cnblogs.discover.home;
22

3-
import com.chad.library.adapter.base.BaseQuickAdapter;
3+
import android.widget.ImageView;
4+
import android.widget.TextView;
5+
6+
import com.antcode.sdk.model.AntColumnInfo;
7+
import com.chad.library.adapter.base.BaseSectionQuickAdapter;
48
import com.chad.library.adapter.base.BaseViewHolder;
9+
import com.rae.cnblogs.basic.AppImageLoader;
510
import com.rae.cnblogs.discover.DiscoverItem;
11+
import com.rae.cnblogs.discover.R;
12+
13+
import java.util.List;
614

7-
public class DiscoverHomeAdapter extends BaseQuickAdapter<DiscoverItem, BaseViewHolder> {
15+
public class DiscoverHomeAdapter extends BaseSectionQuickAdapter<DiscoverItem, BaseViewHolder> {
816

9-
public DiscoverHomeAdapter() {
10-
super(null);
17+
/**
18+
* Same as QuickAdapter#QuickAdapter(Context,int) but with
19+
* some initialization data.
20+
*
21+
* @param layoutResId The layout resource id of each item.
22+
* @param sectionHeadResId The section head layout id for each item
23+
* @param data A new list is created out of this one to avoid mutable list
24+
*/
25+
public DiscoverHomeAdapter(int layoutResId, int sectionHeadResId, List<DiscoverItem> data) {
26+
super(layoutResId, sectionHeadResId, data);
1127
}
1228

1329
@Override
1430
protected void convert(BaseViewHolder helper, DiscoverItem item) {
31+
AntColumnInfo data = (AntColumnInfo) item.getData();
32+
ImageView logoView = helper.itemView.findViewById(R.id.img_logo);
33+
TextView titleView = helper.itemView.findViewById(R.id.tv_title);
34+
TextView numberView = helper.itemView.findViewById(R.id.tv_article_num);
35+
TextView authorView = helper.itemView.findViewById(R.id.tv_author);
36+
TextView subNumView = helper.itemView.findViewById(R.id.tv_sub_num);
37+
TextView recommendationView = helper.itemView.findViewById(R.id.tv_recommendation);
1538

39+
AppImageLoader.display(data.getLogo(), logoView);
40+
titleView.setText(data.getTitle());
41+
numberView.setText(numberView.getResources().getString(R.string.article_num_format, data.getArticleNum()));
42+
authorView.setText(String.format("%s %s", data.getAntAuthor().getNickname(), data.getAntAuthor().getTitle()));
43+
recommendationView.setText(data.getRecommendation());
44+
subNumView.setText(numberView.getResources().getString(R.string.sub_num_format, data.getSubnum()));
45+
}
46+
47+
@Override
48+
protected void convertHead(BaseViewHolder helper, DiscoverItem item) {
49+
TextView view = helper.itemView.findViewById(R.id.tv_title);
50+
view.setText(item.header);
1651
}
1752
}

module-discover/src/main/java/com/rae/cnblogs/discover/home/DiscoverHomePresenterImpl.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
import com.antcode.sdk.AntCodeSDK;
44
import com.antcode.sdk.IAntAdApi;
55
import com.antcode.sdk.IAntColumnApi;
6+
import com.antcode.sdk.IAntUserApi;
67
import com.antcode.sdk.model.AntAdInfo;
8+
import com.antcode.sdk.model.AntAppConfigInfo;
79
import com.antcode.sdk.model.AntColumnInfo;
810
import com.rae.cnblogs.discover.AntCodeBasicPresenter;
911
import com.rae.cnblogs.sdk.ApiDefaultObserver;
@@ -14,16 +16,32 @@ public class DiscoverHomePresenterImpl extends AntCodeBasicPresenter<IDiscoverHo
1416

1517
private final IAntAdApi mAdApi;
1618
private final IAntColumnApi mColumnApi;
19+
private final IAntUserApi mUserApi;
1720

1821
public DiscoverHomePresenterImpl(IDiscoverHomeContract.View view) {
1922
super(view);
2023
AntCodeSDK antCodeSDK = AntCodeSDK.getInstance();
2124
mAdApi = antCodeSDK.getAdApi();
2225
mColumnApi = antCodeSDK.getColumnApi();
26+
mUserApi = antCodeSDK.getUserApi();
2327
}
2428

2529
@Override
2630
protected void onStart() {
31+
// load category
32+
mUserApi.getAppConfig().with(this)
33+
.subscribe(new ApiDefaultObserver<AntAppConfigInfo>() {
34+
@Override
35+
protected void onError(String message) {
36+
}
37+
38+
@Override
39+
protected void accept(AntAppConfigInfo antAppConfigInfo) {
40+
getView().onLoadCategories(antAppConfigInfo.getHomeTabs());
41+
}
42+
});
43+
44+
2745
// load home ads
2846
mAdApi.getHomePageAds()
2947
.with(this)

module-discover/src/main/java/com/rae/cnblogs/discover/home/IDiscoverHomeContract.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.antcode.sdk.model.AntAdInfo;
44
import com.antcode.sdk.model.AntColumnInfo;
5+
import com.antcode.sdk.model.AntTabInfo;
56
import com.rae.cnblogs.basic.IPresenter;
67
import com.rae.cnblogs.basic.IPresenterView;
78

@@ -18,5 +19,7 @@ interface View extends IPresenterView {
1819
void onLoadAds(List<AntAdInfo> ads);
1920

2021
void onLoadColumns(List<AntColumnInfo> columns);
22+
23+
void onLoadCategories(List<AntTabInfo> homeTabs);
2124
}
2225
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<shape xmlns:android="http://schemas.android.com/apk/res/android">
3+
<solid android:color="#40FFFFFF" />
4+
</shape>
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<shape xmlns:android="http://schemas.android.com/apk/res/android">
3+
<solid android:color="#FFFFFF" />
4+
</shape>

0 commit comments

Comments
 (0)