Skip to content

Commit e340939

Browse files
committed
重构 News 页面
1 parent 2b126c7 commit e340939

8 files changed

Lines changed: 135 additions & 46 deletions

File tree

diycode-app/src/main/java/com/gcssloop/diycode/activity/MainActivity.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,10 @@
4343
import com.gcssloop.diycode.R;
4444
import com.gcssloop.diycode.base.app.BaseActivity;
4545
import com.gcssloop.diycode.base.app.ViewHolder;
46-
import com.gcssloop.diycode.fragment.TopicListFragment;
47-
import com.gcssloop.diycode.fragment.NewsListFragment;
46+
import com.gcssloop.diycode.fragment.NewsListFragment2;
4847
import com.gcssloop.diycode.fragment.SitesListFragment;
4948
import com.gcssloop.diycode.fragment.TextFragment;
49+
import com.gcssloop.diycode.fragment.TopicListFragment;
5050
import com.gcssloop.diycode.test.TestFragment;
5151
import com.gcssloop.diycode.utils.Config;
5252
import com.gcssloop.diycode.utils.DataCache;
@@ -66,7 +66,7 @@ public class MainActivity extends BaseActivity
6666
private Config mConfig;
6767
private int mCurrentPosition = 0;
6868
private TopicListFragment mFragment1;
69-
private NewsListFragment mFragment2;
69+
private NewsListFragment2 mFragment2;
7070
private SitesListFragment mFragment3;
7171
private TestFragment mFragment4;
7272

@@ -94,7 +94,7 @@ private void initViewPager(ViewHolder holder) {
9494
mViewPager.setOffscreenPageLimit(3); // 防止滑动到第三个页面时,第一个页面被销毁
9595

9696
mFragment1 = TopicListFragment.newInstance();
97-
mFragment2 = NewsListFragment.newInstance();
97+
mFragment2 = NewsListFragment2.newInstance();
9898
mFragment3 = SitesListFragment.newInstance();
9999
mFragment4 = TestFragment.newInstance();
100100

diycode-app/src/main/java/com/gcssloop/diycode/fragment/NewsListFragment2.java

Lines changed: 56 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,19 +23,46 @@
2323
package com.gcssloop.diycode.fragment;
2424

2525
import android.content.Context;
26+
import android.os.Bundle;
2627
import android.support.annotation.NonNull;
2728
import android.support.v7.widget.RecyclerView;
29+
import android.view.View;
2830

2931
import com.gcssloop.diycode.base.recyclerview.SpeedyLinearLayoutManager;
3032
import com.gcssloop.diycode.fragment.provider.NewsProvider;
31-
import com.gcssloop.diycode_sdk.api.base.event.BaseEvent;
3233
import com.gcssloop.diycode_sdk.api.news.bean.New;
34+
import com.gcssloop.diycode_sdk.api.news.event.GetNewsListEvent;
35+
import com.gcssloop.diycode_sdk.log.Logger;
3336
import com.gcssloop.recyclerview.adapter.multitype.HeaderFooterAdapter;
3437

35-
public class NewsListFragment2 extends RefreshRecyclerFragment {
38+
import java.util.List;
3639

37-
@Override public void initData(HeaderFooterAdapter adapter) {
40+
public class NewsListFragment2 extends RefreshRecyclerFragment<New, GetNewsListEvent> {
41+
42+
private boolean isFirstLaunch = true;
43+
44+
public static NewsListFragment2 newInstance() {
45+
Bundle args = new Bundle();
46+
NewsListFragment2 fragment = new NewsListFragment2();
47+
fragment.setArguments(args);
48+
return fragment;
49+
}
3850

51+
@Override public void initData(HeaderFooterAdapter adapter) {
52+
List<Object> news = mDataCache.getNewsListObj();
53+
if (null != news && news.size() > 0) {
54+
Logger.e("news : " + news.size());
55+
pageIndex = mConfig.getNewsListPageIndex();
56+
adapter.addDatas(news);
57+
if (isFirstLaunch) {
58+
int lastPosition = mConfig.getNewsListLastPosition();
59+
mRecyclerView.getLayoutManager().scrollToPosition(lastPosition);
60+
isFirstAddFooter = false;
61+
isFirstLaunch = false;
62+
}
63+
} else {
64+
loadMore();
65+
}
3966
}
4067

4168
@Override protected void setRecyclerViewAdapter(Context context, RecyclerView recyclerView,
@@ -51,15 +78,35 @@ public class NewsListFragment2 extends RefreshRecyclerFragment {
5178
return mDiycode.getNewsList(null, offset,limit);
5279
}
5380

54-
@Override protected void onLoadMore(BaseEvent event, HeaderFooterAdapter adapter) {
55-
81+
@Override protected void onRefresh(GetNewsListEvent event, HeaderFooterAdapter adapter) {
82+
adapter.clearDatas();
83+
adapter.addDatas(event.getBean());
84+
toast("下拉刷新成功");
85+
mDataCache.saveNewsListObj(adapter.getDatas());
5686
}
5787

58-
@Override protected void onRefresh(BaseEvent event, HeaderFooterAdapter adapter) {
59-
88+
@Override protected void onLoadMore(GetNewsListEvent event, HeaderFooterAdapter adapter) {
89+
// TODO 排除重复数据
90+
adapter.addDatas(event.getBean());
91+
toast("加载更多成功");
92+
mDataCache.saveNewsListObj(adapter.getDatas());
6093
}
6194

62-
@Override protected void onError(BaseEvent event, String postType) {
95+
@Override protected void onError(GetNewsListEvent event, String postType) {
96+
if (postType.equals(POST_LOAD_MORE)) {
97+
toast("加载更多失败");
98+
} else if (postType.equals(POST_REFRESH)) {
99+
toast("刷新数据失败");
100+
}
101+
}
63102

103+
@Override public void onDestroyView() {
104+
super.onDestroyView();
105+
// 存储 PageIndex
106+
mConfig.saveNewsListPageIndex(pageIndex);
107+
// 存储 RecyclerView 滚动位置
108+
View view = mRecyclerView.getLayoutManager().getChildAt(0);
109+
int lastPosition = mRecyclerView.getLayoutManager().getPosition(view);
110+
mConfig.saveNewsListPosition(lastPosition);
64111
}
65-
}
112+
}

diycode-app/src/main/java/com/gcssloop/diycode/fragment/TopicListFragment.java

Lines changed: 3 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@
3535
import com.gcssloop.diycode_sdk.log.Logger;
3636
import com.gcssloop.recyclerview.adapter.multitype.HeaderFooterAdapter;
3737

38-
import java.util.ArrayList;
3938
import java.util.List;
4039

4140
public class TopicListFragment extends RefreshRecyclerFragment<Topic, GetTopicsListEvent> {
@@ -50,7 +49,7 @@ public static TopicListFragment newInstance() {
5049
}
5150

5251
@Override public void initData(HeaderFooterAdapter adapter) {
53-
List<Topic> topics = mDataCache.getTopicsList();
52+
List<Object> topics = mDataCache.getTopicsListObj();
5453
if (null != topics && topics.size() > 0) {
5554
Logger.e("topics : " + topics.size());
5655
pageIndex = mConfig.getTopicListPageIndex();
@@ -83,14 +82,14 @@ public static TopicListFragment newInstance() {
8382
adapter.clearDatas();
8483
adapter.addDatas(event.getBean());
8584
toast("刷新成功");
86-
mDataCache.saveTopicsList(convert(adapter.getDatas()));
85+
mDataCache.saveTopicsListObj(adapter.getDatas());
8786
}
8887

8988
@Override protected void onLoadMore(GetTopicsListEvent event, HeaderFooterAdapter adapter) {
9089
// TODO 排除重复数据
9190
adapter.addDatas(event.getBean());
9291
toast("加载更多成功");
93-
mDataCache.saveTopicsList(convert(adapter.getDatas()));
92+
mDataCache.saveTopicsListObj(adapter.getDatas());
9493
}
9594

9695
@Override protected void onError(GetTopicsListEvent event, String postType) {
@@ -101,22 +100,8 @@ public static TopicListFragment newInstance() {
101100
}
102101
}
103102

104-
public ArrayList<Topic> convert(List<Object> objects) {
105-
ArrayList<Topic> topics = new ArrayList<>();
106-
for (Object obj : objects) {
107-
if (obj instanceof Topic)
108-
topics.add((Topic) obj);
109-
}
110-
return topics;
111-
}
112-
113103
@Override public void onDestroyView() {
114104
super.onDestroyView();
115-
saveState();
116-
}
117-
118-
// 保存状态
119-
private void saveState() {
120105
// 存储 PageIndex
121106
mConfig.saveTopicListPageIndex(pageIndex);
122107
// 存储 RecyclerView 滚动位置

diycode-app/src/main/java/com/gcssloop/diycode/fragment/provider/NewsProvider.java

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,18 @@
2424

2525
import android.content.Context;
2626
import android.support.annotation.NonNull;
27+
import android.view.View;
28+
import android.widget.ImageView;
2729

30+
import com.bumptech.glide.Glide;
31+
import com.bumptech.glide.load.engine.DiskCacheStrategy;
2832
import com.gcssloop.diycode.R;
33+
import com.gcssloop.diycode.activity.UserActivity;
34+
import com.gcssloop.diycode.utils.IntentUtil;
35+
import com.gcssloop.diycode.utils.TimeUtil;
36+
import com.gcssloop.diycode.utils.UrlUtil;
2937
import com.gcssloop.diycode_sdk.api.news.bean.New;
38+
import com.gcssloop.diycode_sdk.api.user.bean.User;
3039
import com.gcssloop.recyclerview.adapter.base.RecyclerViewHolder;
3140
import com.gcssloop.recyclerview.adapter.multitype.BaseViewProvider;
3241

@@ -41,7 +50,34 @@ public NewsProvider(@NonNull Context context) {
4150
* @param holder ViewHolder
4251
* @param bean 数据
4352
*/
44-
@Override public void onBindView(RecyclerViewHolder holder, New bean) {
53+
@Override public void onBindView(RecyclerViewHolder holder, final New bean) {
54+
final User user = bean.getUser();
55+
holder.setText(R.id.username, user.getLogin());
56+
holder.setText(R.id.node_name, bean.getNode_name());
57+
holder.setText(R.id.time, TimeUtil.computePastTime(bean.getUpdated_at()));
58+
holder.setText(R.id.title, bean.getTitle());
59+
holder.setText(R.id.host_name, UrlUtil.getHost(bean.getAddress()));
4560

61+
// 加载头像
62+
ImageView imageView = holder.get(R.id.avatar);
63+
String url = user.getAvatar_url();
64+
String url2 = url;
65+
if (url.contains("diycode")) // 添加判断,防止替换掉其他网站掉图片
66+
url2 = url.replace("large_avatar", "avatar");
67+
Glide.with(mContext).load(url2).diskCacheStrategy(DiskCacheStrategy.RESULT).into(imageView);
68+
69+
holder.setOnClickListener(new View.OnClickListener() {
70+
@Override
71+
public void onClick(View v) {
72+
UserActivity.newInstance(mContext, user);
73+
}
74+
}, R.id.avatar, R.id.username);
75+
76+
holder.get(R.id.item).setOnClickListener(new View.OnClickListener() {
77+
@Override
78+
public void onClick(View v) {
79+
IntentUtil.openUrl(mContext, bean.getAddress());
80+
}
81+
});
4682
}
4783
}

diycode-app/src/main/java/com/gcssloop/diycode/fragment/provider/TopicProvider.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -51,15 +51,15 @@ public TopicProvider(@NonNull Context context) {
5151
* 在绑定数据时调用,需要用户自己处理
5252
*
5353
* @param holder ViewHolder
54-
* @param topic 数据
54+
* @param bean 数据
5555
*/
5656
@Override
57-
public void onBindView(RecyclerViewHolder holder, final Topic topic) {
58-
final User user = topic.getUser();
57+
public void onBindView(RecyclerViewHolder holder, final Topic bean) {
58+
final User user = bean.getUser();
5959
holder.setText(R.id.username, user.getLogin());
60-
holder.setText(R.id.node_name, topic.getNode_name());
61-
holder.setText(R.id.time, TimeUtil.computePastTime(topic.getUpdated_at()));
62-
holder.setText(R.id.title, topic.getTitle());
60+
holder.setText(R.id.node_name, bean.getNode_name());
61+
holder.setText(R.id.time, TimeUtil.computePastTime(bean.getUpdated_at()));
62+
holder.setText(R.id.title, bean.getTitle());
6363

6464
// 加载头像
6565
ImageView imageView = holder.get(R.id.avatar);
@@ -69,7 +69,7 @@ public void onBindView(RecyclerViewHolder holder, final Topic topic) {
6969
url2 = url.replace("large_avatar", "avatar");
7070
Glide.with(mContext).load(url2).diskCacheStrategy(DiskCacheStrategy.RESULT).into(imageView);
7171

72-
String state = "评论 "+topic.getReplies_count();
72+
String state = "评论 "+bean.getReplies_count();
7373
holder.setText(R.id.state, state);
7474

7575
holder.setOnClickListener(new View.OnClickListener() {
@@ -84,7 +84,7 @@ public void onClick(View v) {
8484
holder.get(R.id.item).setOnClickListener(new View.OnClickListener() {
8585
@Override
8686
public void onClick(View v) {
87-
TopicContentActivity.newInstance(mContext, topic);
87+
TopicContentActivity.newInstance(mContext, bean);
8888
}
8989
});
9090
}

diycode-app/src/main/java/com/gcssloop/diycode/utils/Config.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,17 @@ public Integer getNewsLastScroll() {
144144
return getData(Key_NewsList_LastScroll, 0);
145145
}
146146

147+
private String Key_NewsList_LastPosition = "Key_NewsList_LastPosition";
148+
149+
public void saveNewsListPosition(Integer lastPosition) {
150+
saveData(Key_NewsList_LastPosition, lastPosition);
151+
}
152+
153+
public Integer getNewsListLastPosition() {
154+
return getData(Key_NewsList_LastPosition, 0);
155+
}
156+
157+
147158
private String Key_NewsList_PageIndex = "Key_NewsList_PageIndex";
148159

149160
public void saveNewsListPageIndex(Integer pageIndex) {

diycode-app/src/main/java/com/gcssloop/diycode/utils/DataCache.java

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828

2929
import com.gcssloop.diycode_sdk.api.news.bean.New;
3030
import com.gcssloop.diycode_sdk.api.sites.bean.Sites;
31-
import com.gcssloop.diycode_sdk.api.topic.bean.Topic;
3231
import com.gcssloop.diycode_sdk.api.topic.bean.TopicContent;
3332
import com.gcssloop.diycode_sdk.api.topic.bean.TopicReply;
3433
import com.gcssloop.diycode_sdk.api.user.bean.UserDetail;
@@ -105,13 +104,13 @@ public List<TopicReply> getTopicRepliesList(int topic_id) {
105104
return getData("topic_reply_" + topic_id);
106105
}
107106

108-
public void saveTopicsList(List<Topic> topicList) {
109-
ArrayList<Topic> topics = new ArrayList<>(topicList);
110-
saveData("topic_list_", topics);
107+
public void saveTopicsListObj(List<Object> topicList) {
108+
ArrayList<Object> topics = new ArrayList<>(topicList);
109+
saveData("topic_list_obj_", topics);
111110
}
112111

113-
public List<Topic> getTopicsList() {
114-
return getData("topic_list_");
112+
public List<Object> getTopicsListObj() {
113+
return getData("topic_list_obj_");
115114
}
116115

117116
public void saveNewsList(List<New> newList) {
@@ -123,6 +122,15 @@ public List<New> getNewsList() {
123122
return getData("news_list_");
124123
}
125124

125+
public void saveNewsListObj(List<Object> newList) {
126+
ArrayList<Object> news = new ArrayList<>(newList);
127+
saveData("news_list_obj_", news);
128+
}
129+
130+
public List<Object> getNewsListObj() {
131+
return getData("news_list_obj_");
132+
}
133+
126134
public void saveMe(UserDetail user) {
127135
saveData("Gcs_Me_", user);
128136
}

recyclerview/src/main/java/com/gcssloop/recyclerview/adapter/multitype/BaseViewProvider.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,12 @@
3737
public abstract class BaseViewProvider<T> {
3838
private LayoutInflater mInflater;
3939
private int mLayoutId;
40+
protected Context mContext;
4041

4142
public BaseViewProvider(@NonNull Context context, @NonNull @LayoutRes int layout_id) {
4243
mInflater = LayoutInflater.from(context);
4344
mLayoutId = layout_id;
45+
mContext = context;
4446
}
4547

4648
public RecyclerViewHolder onCreateViewHolder(ViewGroup parent) {

0 commit comments

Comments
 (0)