Skip to content
This repository was archived by the owner on Jun 5, 2024. It is now read-only.

Commit a028d42

Browse files
committed
专栏详情页面
1 parent 3fe91d0 commit a028d42

31 files changed

+998
-233
lines changed

.idea/modules.xml

Lines changed: 0 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ buildscript {
1212
jcenter()
1313
}
1414
dependencies {
15-
classpath 'com.android.tools.build:gradle:3.3.0'
15+
classpath 'com.android.tools.build:gradle:3.3.1'
1616
classpath 'com.jakewharton:butterknife-gradle-plugin:9.0.0-SNAPSHOT'
1717
// 热更新插件
1818
// classpath "com.tencent.bugly:tinker-support:1.0.8"
Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
package com.rae.cnblogs.discover.column.detail;
2+
3+
import android.content.Context;
4+
import android.support.annotation.Nullable;
5+
import android.support.v4.content.ContextCompat;
6+
import android.text.TextUtils;
7+
import android.view.View;
8+
import android.widget.ImageView;
9+
import android.widget.TextView;
10+
11+
import com.antcode.sdk.model.AntColumnInfo;
12+
import com.antcode.sdk.model.AntIntroArticlesInfo;
13+
import com.chad.library.adapter.base.BaseMultiItemQuickAdapter;
14+
import com.chad.library.adapter.base.BaseViewHolder;
15+
import com.chad.library.adapter.base.entity.MultiItemEntity;
16+
import com.rae.cnblogs.basic.AppImageLoader;
17+
import com.rae.cnblogs.discover.R;
18+
import com.rae.cnblogs.sdk.utils.ApiUtils;
19+
import com.rae.cnblogs.widget.PlaceholderView;
20+
21+
public class AntColumnDetailAdapter extends BaseMultiItemQuickAdapter<MultiItemEntity, BaseViewHolder> {
22+
23+
private final PlaceholderView mPlaceholderView;
24+
@Nullable
25+
private AntColumnInfo mColumnInfo;
26+
27+
/**
28+
* Same as QuickAdapter#QuickAdapter(Context,int) but with
29+
* some initialization data.
30+
*/
31+
public AntColumnDetailAdapter(Context context) {
32+
super(null);
33+
mPlaceholderView = new PlaceholderView(context);
34+
setEmptyView(mPlaceholderView);
35+
addItemType(ColumnDetailHeaderEntity.TYPE_HEADER, R.layout.item_column_detail_header);
36+
addItemType(ColumnDetailSectionEntity.TYPE_SECTION, R.layout.item_column_section);
37+
addItemType(ColumnDetailCatalogEntity.TYPE_LEVEL_START, R.layout.item_column_category_start);
38+
addItemType(ColumnDetailCatalogEntity.TYPE_LEVEL_END, R.layout.item_column_category_end);
39+
addItemType(ColumnDetailCatalogEntity.TYPE_LEVEL_0, R.layout.item_column_category_level0);
40+
addItemType(ColumnDetailCatalogEntity.TYPE_LEVEL_1, R.layout.item_column_category_level1);
41+
}
42+
43+
@Override
44+
protected void convert(BaseViewHolder helper, MultiItemEntity item) {
45+
int itemViewType = helper.getItemViewType();
46+
switch (itemViewType) {
47+
case ColumnDetailHeaderEntity.TYPE_HEADER:
48+
bindHeaderView(helper, (ColumnDetailHeaderEntity) item);
49+
break;
50+
case ColumnDetailSectionEntity.TYPE_SECTION:
51+
bindSectionView(helper, (ColumnDetailSectionEntity) item);
52+
break;
53+
case ColumnDetailCatalogEntity.TYPE_LEVEL_0:
54+
bindRootLevelView(helper, (ColumnDetailCatalogEntity) item);
55+
break;
56+
case ColumnDetailCatalogEntity.TYPE_LEVEL_1:
57+
bindRootLevel1View(helper, (ColumnDetailCatalogEntity) item);
58+
break;
59+
}
60+
}
61+
62+
/**
63+
* 绑定头部视图
64+
*/
65+
private void bindHeaderView(BaseViewHolder helper, ColumnDetailHeaderEntity item) {
66+
AntColumnInfo columnInfo = item.getColumnInfo();
67+
helper.setText(R.id.tv_title, columnInfo.getTitle());
68+
helper.setText(R.id.tv_sub_title, columnInfo.getRecommendation());
69+
helper.setText(R.id.tv_article_num, ApiUtils.formatNumber(columnInfo.getArticleNum()));
70+
helper.setText(R.id.tv_sub_num, ApiUtils.formatNumber(columnInfo.getSubnum()));
71+
AppImageLoader.display(columnInfo.getLogo(), (ImageView) helper.getView(R.id.img_logo));
72+
}
73+
74+
/**
75+
* 绑定块视图
76+
*/
77+
private void bindSectionView(BaseViewHolder helper, ColumnDetailSectionEntity item) {
78+
helper.setText(R.id.tv_title, item.getTitle());
79+
helper.setText(R.id.tv_desc, item.getContent());
80+
}
81+
82+
/**
83+
* 绑定一级分类
84+
*/
85+
private void bindRootLevelView(final BaseViewHolder helper, final ColumnDetailCatalogEntity item) {
86+
helper.setText(R.id.tv_title, item.getIntroArticlesInfo().getTitle());
87+
final ImageView arrowView = helper.getView(R.id.img_arrow);
88+
arrowView.setRotation(item.isExpanded() ? 0 : 180);
89+
helper.itemView.setOnClickListener(new View.OnClickListener() {
90+
@Override
91+
public void onClick(View v) {
92+
int pos = helper.getAdapterPosition();
93+
if (item.isExpanded()) {
94+
collapse(pos);
95+
} else {
96+
expand(pos);
97+
}
98+
}
99+
});
100+
}
101+
102+
/**
103+
* 绑定二级分类
104+
*/
105+
private void bindRootLevel1View(BaseViewHolder helper, ColumnDetailCatalogEntity item) {
106+
AntIntroArticlesInfo info = item.getIntroArticlesInfo();
107+
TextView textView = helper.getView(R.id.tv_title);
108+
Context context = helper.itemView.getContext();
109+
110+
// 说明
111+
if (item.isDesc()) {
112+
String desc = info.getDescription();
113+
if (TextUtils.isEmpty(desc)) desc = info.getTitle();
114+
textView.setText(desc);
115+
textView.setTextColor(ContextCompat.getColor(context, R.color.ant_color_desc));
116+
} else {
117+
textView.setText(info.getTitle());
118+
textView.setTextColor(ContextCompat.getColor(context, R.color.ant_h1));
119+
}
120+
}
121+
122+
public void setColumnInfo(AntColumnInfo columnInfo) {
123+
mColumnInfo = columnInfo;
124+
}
125+
126+
@Nullable
127+
public AntColumnInfo getColumnInfo() {
128+
return mColumnInfo;
129+
}
130+
131+
public void showEmpty(String message) {
132+
mPlaceholderView.empty(message);
133+
}
134+
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package com.rae.cnblogs.discover.column.detail;
2+
3+
import com.antcode.sdk.model.AntIntroArticlesInfo;
4+
import com.chad.library.adapter.base.entity.AbstractExpandableItem;
5+
import com.chad.library.adapter.base.entity.MultiItemEntity;
6+
7+
public class ColumnDetailCatalogEntity extends AbstractExpandableItem<ColumnDetailCatalogEntity> implements MultiItemEntity {
8+
9+
10+
// 一级目录
11+
public final static int TYPE_LEVEL_START = 0;
12+
13+
public final static int TYPE_LEVEL_END = 1;
14+
15+
public final static int TYPE_LEVEL_0 = 3;
16+
// 二级目录
17+
public final static int TYPE_LEVEL_1 = 4;
18+
// 详情
19+
public final static int TYPE_DESC = 5;
20+
21+
22+
private AntIntroArticlesInfo mIntroArticlesInfo;
23+
24+
private int level;
25+
private int itemType;
26+
private boolean isDesc;
27+
28+
29+
public ColumnDetailCatalogEntity(int level, int itemType, AntIntroArticlesInfo introArticlesInfo) {
30+
this.level = level;
31+
this.itemType = itemType;
32+
this.mIntroArticlesInfo = introArticlesInfo;
33+
}
34+
35+
public AntIntroArticlesInfo getIntroArticlesInfo() {
36+
return mIntroArticlesInfo;
37+
}
38+
39+
public boolean isDesc() {
40+
return isDesc;
41+
}
42+
43+
public void setDesc(boolean desc) {
44+
isDesc = desc;
45+
}
46+
47+
@Override
48+
public int getLevel() {
49+
return this.level;
50+
}
51+
52+
public void setLevel(int level) {
53+
this.level = level;
54+
}
55+
56+
@Override
57+
public int getItemType() {
58+
return itemType;
59+
}
60+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.rae.cnblogs.discover.column.detail;
2+
3+
import com.antcode.sdk.model.AntColumnInfo;
4+
import com.chad.library.adapter.base.entity.MultiItemEntity;
5+
6+
public class ColumnDetailHeaderEntity implements MultiItemEntity {
7+
8+
// 头部
9+
final static int TYPE_HEADER = 11;
10+
11+
private AntColumnInfo mColumnInfo;
12+
13+
@Override
14+
public int getItemType() {
15+
return TYPE_HEADER;
16+
}
17+
18+
public ColumnDetailHeaderEntity(AntColumnInfo columnInfo) {
19+
mColumnInfo = columnInfo;
20+
}
21+
22+
public AntColumnInfo getColumnInfo() {
23+
return mColumnInfo;
24+
}
25+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package com.rae.cnblogs.discover.column.detail;
2+
3+
import com.chad.library.adapter.base.entity.MultiItemEntity;
4+
5+
public class ColumnDetailSectionEntity implements MultiItemEntity {
6+
7+
// 区块
8+
final static int TYPE_SECTION = 12;
9+
10+
11+
private String title;
12+
13+
private String content;
14+
15+
public String getTitle() {
16+
return title;
17+
}
18+
19+
20+
public String getContent() {
21+
return content;
22+
}
23+
24+
25+
public ColumnDetailSectionEntity(String title, String content) {
26+
this.title = title;
27+
this.content = content;
28+
}
29+
30+
@Override
31+
public int getItemType() {
32+
return TYPE_SECTION;
33+
}
34+
}

module-discover/src/main/java/com/rae/cnblogs/discover/fragment/AntColumnFragment.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import com.antcode.sdk.model.AntColumnInfo;
1515
import com.chad.library.adapter.base.BaseQuickAdapter;
1616
import com.chad.library.adapter.base.BaseViewHolder;
17+
import com.rae.cnblogs.AppRoute;
1718
import com.rae.cnblogs.UICompat;
1819
import com.rae.cnblogs.basic.BasicFragment;
1920
import com.rae.cnblogs.discover.R;
@@ -94,6 +95,15 @@ public void onLoadMoreRequested() {
9495
}
9596
}, mRecyclerView);
9697

98+
mAdapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() {
99+
@Override
100+
public void onItemClick(BaseQuickAdapter adapter, View view, int position) {
101+
AntColumnInfo item = mAdapter.getItem(position);
102+
if (item == null) return;
103+
AppRoute.routeToAntColumnDetail(view.getContext(), item.getId());
104+
}
105+
});
106+
97107
}
98108

99109
@Override
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package com.rae.cnblogs.discover.presenter;
2+
3+
import android.support.annotation.Nullable;
4+
5+
import com.antcode.sdk.AntCodeSDK;
6+
import com.antcode.sdk.IAntColumnApi;
7+
import com.antcode.sdk.model.AntColumnInfo;
8+
import com.antcode.sdk.model.AntEmptyInfo;
9+
import com.rae.cnblogs.discover.AntCodeBasicPresenter;
10+
import com.rae.cnblogs.discover.AntSdkDefaultObserver;
11+
12+
public class AntColumnDetailPresenterImpl extends AntCodeBasicPresenter<IAntColumnDetailContract.View> implements IAntColumnDetailContract.Presenter {
13+
14+
private final IAntColumnApi mColumnApi;
15+
@Nullable
16+
private AntColumnInfo mColumnInfo;
17+
18+
public AntColumnDetailPresenterImpl(IAntColumnDetailContract.View view) {
19+
super(view);
20+
AntCodeSDK antCodeSDK = AntCodeSDK.getInstance();
21+
mColumnApi = antCodeSDK.getColumnApi();
22+
}
23+
24+
@Override
25+
protected void onStart() {
26+
String columnId = getView().getColumnId();
27+
mColumnApi.getColumnDetail(columnId).with(this).subscribe(new AntSdkDefaultObserver<AntColumnInfo>() {
28+
@Override
29+
protected void onError(String message) {
30+
getView().onLoadDataError(message);
31+
}
32+
33+
@Override
34+
protected void accept(AntColumnInfo columnInfo) {
35+
mColumnInfo = columnInfo;
36+
getView().onLoadColumnDetail(columnInfo);
37+
}
38+
});
39+
}
40+
41+
@Override
42+
public void subscribe() {
43+
if (mColumnInfo == null) {
44+
getView().onSubscribeError("数据尚未加载完毕,请稍后再试");
45+
return;
46+
}
47+
mColumnApi.subscribe(String.valueOf(mColumnInfo.getId()))
48+
.with(this)
49+
.subscribe(new AntSdkDefaultObserver<AntEmptyInfo>() {
50+
@Override
51+
protected void onError(String message) {
52+
getView().onSubscribeError(message);
53+
}
54+
55+
@Override
56+
protected void accept(AntEmptyInfo antEmptyInfo) {
57+
getView().onSubscribeSuccess();
58+
}
59+
});
60+
}
61+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package com.rae.cnblogs.discover.presenter;
2+
3+
import com.antcode.sdk.model.AntColumnInfo;
4+
import com.rae.cnblogs.basic.IPresenter;
5+
import com.rae.cnblogs.basic.IPresenterView;
6+
7+
public interface IAntColumnDetailContract {
8+
9+
interface Presenter extends IPresenter {
10+
11+
/**
12+
* 订阅
13+
*/
14+
void subscribe();
15+
}
16+
17+
interface View extends IPresenterView {
18+
19+
// 获取专栏ID
20+
String getColumnId();
21+
22+
// 加载专栏详情
23+
void onLoadColumnDetail(AntColumnInfo columnInfo);
24+
25+
// 加载数据失败
26+
void onLoadDataError(String message);
27+
28+
// 订阅失败
29+
void onSubscribeError(String message);
30+
31+
// 订阅成功
32+
void onSubscribeSuccess();
33+
}
34+
}

0 commit comments

Comments
 (0)