Skip to content

Commit 7171c70

Browse files
committed
1:增加News详情Activity;
1 parent 84ddde6 commit 7171c70

File tree

14 files changed

+336
-20
lines changed

14 files changed

+336
-20
lines changed

module_news/src/main/AndroidManifest.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,11 @@
66
android:name=".main.NewsCenterActivity"
77
android:theme="@style/AppTheme.NoActionBar"
88
android:screenOrientation="portrait" />
9+
<activity
10+
android:name=".detail.NewsDetailActivity"
11+
android:screenOrientation="portrait"
12+
android:theme="@style/AppTheme.NoActionBar" />
913
</application>
1014

15+
1116
</manifest>

module_news/src/main/java/com/guiying/news/data/NewsDataSource.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.guiying.news.data;
22

3-
import com.guiying.common.http.InfoCallback;
3+
import com.guiying.common.base.InfoCallback;
4+
import com.guiying.news.data.bean.MessageDetail;
45
import com.guiying.news.data.bean.StoryList;
56

67
/**
@@ -14,13 +15,20 @@ public interface NewsDataSource {
1415

1516

1617
/**
17-
* 获取
18+
* 获取当天的新闻列表
1819
*
19-
* @param date
20+
* @param date 日期
2021
* @param callback 回调
2122
*/
2223
void getNewsList(String date, InfoCallback<StoryList> callback);
2324

25+
/**
26+
* 获取某条新闻详情
27+
*
28+
* @param id 新闻Id
29+
* @param callback 回调
30+
*/
31+
void getNewsDetail(String id, InfoCallback<MessageDetail> callback);
2432

2533
}
2634

module_news/src/main/java/com/guiying/news/data/bean/MessageDetail.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,4 +84,19 @@ public String getId() {
8484
public void setId(String id) {
8585
this.id = id;
8686
}
87+
88+
@Override
89+
public String toString() {
90+
return "MessageDetail{" +
91+
"body='" + body + '\'' +
92+
", image_source='" + image_source + '\'' +
93+
", title='" + title + '\'' +
94+
", image='" + image + '\'' +
95+
", share_url='" + share_url + '\'' +
96+
", recommenders=" + recommenders +
97+
", ga_prefix='" + ga_prefix + '\'' +
98+
", type='" + type + '\'' +
99+
", id='" + id + '\'' +
100+
'}';
101+
}
87102
}

module_news/src/main/java/com/guiying/news/data/source/RemoteNewsDataSource.java

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
package com.guiying.news.data.source;
22

3+
import com.guiying.common.base.InfoCallback;
34
import com.guiying.common.http.DataType;
45
import com.guiying.common.http.HttpClient;
5-
import com.guiying.common.http.InfoCallback;
66
import com.guiying.common.http.OnResultListener;
77
import com.guiying.news.Constants;
88
import com.guiying.news.data.NewsDataSource;
9+
import com.guiying.news.data.bean.MessageDetail;
910
import com.guiying.news.data.bean.StoryList;
1011

1112
/**
@@ -42,4 +43,33 @@ public void onFailure(String message) {
4243
}
4344
});
4445
}
46+
47+
48+
@Override
49+
public void getNewsDetail(String id, final InfoCallback<MessageDetail> callback) {
50+
HttpClient client = new HttpClient.Builder()
51+
.baseUrl(Constants.ZHIHU_DAILY_BEFORE_MESSAGE_DETAIL)
52+
.url(id)
53+
.bodyType(DataType.JSON_OBJECT, MessageDetail.class)
54+
.build();
55+
client.get(new OnResultListener<MessageDetail>() {
56+
57+
@Override
58+
public void onSuccess(MessageDetail result) {
59+
callback.onSuccess(result);
60+
}
61+
62+
@Override
63+
public void onError(int code, String message) {
64+
callback.onError(code, message);
65+
}
66+
67+
@Override
68+
public void onFailure(String message) {
69+
callback.onError(0, message);
70+
}
71+
});
72+
}
73+
74+
4575
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.guiying.news.detail;
2+
3+
import android.os.Bundle;
4+
5+
import com.guiying.common.base.BaseActivity;
6+
7+
/**
8+
* <p>类说明</p>
9+
*
10+
* @author 张华洋 2017/7/1 13:13
11+
* @version V1.2.0
12+
* @name NewsDetailActivity
13+
*/
14+
public class NewsDetailActivity extends BaseActivity {
15+
16+
@Override
17+
protected void onCreate(Bundle savedInstanceState) {
18+
super.onCreate(savedInstanceState);
19+
NewsDetailView detailView = new NewsDetailView(this);
20+
setContentView(detailView);
21+
String id = getIntent().getStringExtra("id");
22+
new NewsDetailPresenter(detailView).getNewsDetail(id);
23+
}
24+
25+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.guiying.news.detail;
2+
3+
import com.guiying.common.base.BasePresenter;
4+
import com.guiying.common.base.BaseView;
5+
import com.guiying.news.data.bean.MessageDetail;
6+
7+
/**
8+
* <p>类说明</p>
9+
*
10+
* @author 张华洋 2017/2/22 20:33
11+
* @version V1.2.0
12+
* @name NewsContract
13+
*/
14+
public interface NewsDetailContract {
15+
16+
interface View extends BaseView<Presenter> {
17+
18+
boolean isActive();
19+
20+
void showNewsDetail(MessageDetail detail);
21+
22+
}
23+
24+
interface Presenter extends BasePresenter {
25+
26+
/**
27+
* 获取最新列表
28+
*
29+
* @param newsId 新闻id
30+
*/
31+
void getNewsDetail(String newsId);
32+
33+
}
34+
35+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package com.guiying.news.detail;
2+
3+
import com.guiying.common.base.InfoCallback;
4+
import com.guiying.news.data.NewsDataSource;
5+
import com.guiying.news.data.bean.MessageDetail;
6+
import com.guiying.news.data.source.RemoteNewsDataSource;
7+
8+
/**
9+
* <p>类说明</p>
10+
*
11+
* @author 张华洋 2017/2/22 20:33
12+
* @version V1.2.0
13+
* @name GirlsPresenter
14+
*/
15+
public class NewsDetailPresenter implements NewsDetailContract.Presenter {
16+
17+
private NewsDetailContract.View mView;
18+
private NewsDataSource mDataSource;
19+
20+
public NewsDetailPresenter(NewsDetailContract.View view) {
21+
mView = view;
22+
mDataSource = new RemoteNewsDataSource();
23+
mView.setPresenter(this);
24+
}
25+
26+
@Override
27+
public void start() {
28+
29+
}
30+
31+
32+
@Override
33+
public void getNewsDetail(String newsId) {
34+
mDataSource.getNewsDetail(newsId, new InfoCallback<MessageDetail>() {
35+
@Override
36+
public void onSuccess(MessageDetail detail) {
37+
if (mView.isActive()) {
38+
mView.showNewsDetail(detail);
39+
}
40+
}
41+
42+
@Override
43+
public void onError(int code, String message) {
44+
45+
}
46+
});
47+
}
48+
49+
}
Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
package com.guiying.news.detail;
2+
3+
import android.content.Context;
4+
import android.graphics.Bitmap;
5+
import android.graphics.Canvas;
6+
import android.graphics.Color;
7+
import android.graphics.drawable.BitmapDrawable;
8+
import android.graphics.drawable.Drawable;
9+
import android.support.design.widget.CollapsingToolbarLayout;
10+
import android.text.Html;
11+
import android.text.method.LinkMovementMethod;
12+
import android.util.AttributeSet;
13+
import android.widget.FrameLayout;
14+
import android.widget.ImageView;
15+
import android.widget.TextView;
16+
17+
import com.bumptech.glide.Glide;
18+
import com.bumptech.glide.request.animation.GlideAnimation;
19+
import com.bumptech.glide.request.target.SimpleTarget;
20+
import com.guiying.news.R;
21+
import com.guiying.news.data.bean.MessageDetail;
22+
23+
/**
24+
* <p>类说明</p>
25+
*
26+
* @author 张华洋 2017/7/1 13:18
27+
* @version V1.2.0
28+
* @name NewsDetailView
29+
*/
30+
31+
public class NewsDetailView extends FrameLayout implements NewsDetailContract.View {
32+
33+
private boolean isActive = false;
34+
private NewsDetailContract.Presenter mPresenter;
35+
private ImageView mToolbarImage;
36+
private TextView mToolbarText;
37+
private CollapsingToolbarLayout mCollapsingLayout;
38+
private TextView mDetailText;
39+
40+
41+
public NewsDetailView(Context context) {
42+
super(context);
43+
initView();
44+
}
45+
46+
public NewsDetailView(Context context, AttributeSet attrs) {
47+
super(context, attrs);
48+
initView();
49+
}
50+
51+
private void initView() {
52+
inflate(getContext(), R.layout.view_news_detail, this);
53+
mToolbarImage = (ImageView) findViewById(R.id.toolbar_image);
54+
mToolbarText = (TextView) findViewById(R.id.toolbar_text);
55+
mCollapsingLayout = (CollapsingToolbarLayout) findViewById(R.id.collapsing_layout);
56+
mDetailText = (TextView) findViewById(R.id.news_detail_text);
57+
58+
isActive = true;
59+
}
60+
61+
@Override
62+
protected void onAttachedToWindow() {
63+
super.onAttachedToWindow();
64+
isActive = true;
65+
}
66+
67+
@Override
68+
protected void onDetachedFromWindow() {
69+
super.onDetachedFromWindow();
70+
isActive = false;
71+
}
72+
73+
@Override
74+
public boolean isActive() {
75+
return isActive;
76+
}
77+
78+
79+
@Override
80+
public void setPresenter(NewsDetailContract.Presenter presenter) {
81+
mPresenter = presenter;
82+
}
83+
84+
@Override
85+
public void showNewsDetail(MessageDetail detail) {
86+
mCollapsingLayout.setTitle(detail.getTitle());
87+
//设置还没收缩时状态下字体颜色
88+
mCollapsingLayout.setExpandedTitleColor(Color.WHITE);
89+
//设置收缩后Toolbar上字体的颜色
90+
mCollapsingLayout.setCollapsedTitleTextColor(Color.WHITE);
91+
mToolbarText.setText(detail.getImage_source());
92+
Glide.with(getContext())
93+
.load(detail.getImage())
94+
.thumbnail(0.2f)
95+
.into(mToolbarImage);
96+
mDetailText.setMovementMethod(LinkMovementMethod.getInstance());
97+
mDetailText.setText(Html.fromHtml(detail.getBody(), new Html.ImageGetter() {
98+
@Override
99+
public Drawable getDrawable(String source) {
100+
final URLDrawable urlDrawable = new URLDrawable();
101+
Glide.with(getContext()).load(source).asBitmap().into(new SimpleTarget<Bitmap>() {
102+
103+
@Override
104+
public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
105+
urlDrawable.bitmap = resource;
106+
urlDrawable.setBounds(0, 0, resource.getWidth(), resource.getHeight());
107+
mDetailText.invalidate();
108+
// 解决图文重叠
109+
mDetailText.setText(mDetailText.getText());
110+
}
111+
});
112+
return urlDrawable;
113+
}
114+
}, null));
115+
}
116+
117+
118+
private class URLDrawable extends BitmapDrawable {
119+
120+
private Bitmap bitmap;
121+
122+
@Override
123+
public void draw(Canvas canvas) {
124+
if (bitmap != null) {
125+
canvas.drawBitmap(bitmap, 0, 0, getPaint());
126+
}
127+
}
128+
}
129+
}

module_news/src/main/java/com/guiying/news/main/NewsListAdapter.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package com.guiying.news.main;
22

33
import android.content.Context;
4+
import android.content.Intent;
5+
import android.view.View;
46
import android.view.ViewGroup;
57
import android.widget.ImageView;
68
import android.widget.TextView;
@@ -9,6 +11,7 @@
911
import com.bumptech.glide.load.engine.DiskCacheStrategy;
1012
import com.guiying.news.R;
1113
import com.guiying.news.data.bean.Story;
14+
import com.guiying.news.detail.NewsDetailActivity;
1215
import com.jude.easyrecyclerview.adapter.BaseViewHolder;
1316
import com.jude.easyrecyclerview.adapter.RecyclerArrayAdapter;
1417

@@ -44,7 +47,7 @@ private class NewsListHolder extends BaseViewHolder<Story> {
4447
}
4548

4649
@Override
47-
public void setData(Story data) {
50+
public void setData(final Story data) {
4851
super.setData(data);
4952
mTextView.setText(data.getTitle());
5053
Glide.with(getContext())
@@ -53,6 +56,14 @@ public void setData(Story data) {
5356
.crossFade()
5457
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
5558
.into(mImageView);
59+
itemView.setOnClickListener(new View.OnClickListener() {
60+
@Override
61+
public void onClick(View view) {
62+
Intent intent = new Intent(getContext(), NewsDetailActivity.class);
63+
intent.putExtra("id", data.getId());
64+
getContext().startActivity(intent);
65+
}
66+
});
5667
}
5768
}
5869
}

0 commit comments

Comments
 (0)