From 22e51f1216c06bf060f40550625cb165d98efdbd Mon Sep 17 00:00:00 2001 From: huangzhuanghua <401742778@qq.com> Date: Mon, 14 Nov 2016 13:58:02 +0800 Subject: [PATCH] =?UTF-8?q?news=E6=A8=A1=E5=9D=97=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=EF=BC=88=E5=AE=8C=E6=88=90=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gh/common/util/NewsUtils.java | 29 + .../adapter/MessageDetailAdapter.java | 69 +- .../gh/gamecenter/entity/ConcernEntity.java | 6 +- .../gamecenter/entity/NewsDetailEntity.java | 6 +- .../com/gh/gamecenter/news/News1Fragment.java | 69 +- .../gamecenter/news/News1FragmentAdapter.java | 699 +++++++++--------- .../gamecenter/news/News2FragmentAdapter.java | 2 +- .../gamecenter/news/News3FragmentAdapter.java | 2 +- .../news/NewsConcernViewHolder.java | 43 -- .../gamecenter/news/NewsDigestViewHolder.java | 37 + .../newsdetail/NewsDetailAdapter.java | 25 +- .../gh/gamecenter/retrofit/ApiService.java | 15 + .../gamecenter/retrofit/ApiServiceImpl.java | 16 + ...ncern_rv_item.xml => news_digest_item.xml} | 29 +- 14 files changed, 526 insertions(+), 521 deletions(-) delete mode 100644 app/src/main/java/com/gh/gamecenter/news/NewsConcernViewHolder.java create mode 100644 app/src/main/java/com/gh/gamecenter/news/NewsDigestViewHolder.java rename app/src/main/res/layout/{concern_rv_item.xml => news_digest_item.xml} (82%) diff --git a/app/src/main/java/com/gh/common/util/NewsUtils.java b/app/src/main/java/com/gh/common/util/NewsUtils.java index 3582032882..c4ab560dff 100644 --- a/app/src/main/java/com/gh/common/util/NewsUtils.java +++ b/app/src/main/java/com/gh/common/util/NewsUtils.java @@ -15,7 +15,11 @@ import com.gh.gamecenter.entity.ConcernEntity; import com.gh.gamecenter.entity.NewsEntity; import com.gh.gamecenter.volley.extended.JsonObjectExtendedRequest; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; import java.util.List; +import java.util.Locale; public class NewsUtils { @@ -115,4 +119,29 @@ public class NewsUtils { } } + /** + * 设置新闻发布时间 + */ + public static void setNewsPublishOn(TextView textView, long time) { + time = time * 1000; + SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd", Locale.getDefault()); + try { + long today = format.parse(format.format(new Date())).getTime(); + if (time >= today && time < today + 86400 * 1000) { + format.applyPattern("HH:mm"); + textView.setText(String.format("今天 %s", format.format(time))); + } else if (time >= today - 86400 * 1000 && time < today) { + format.applyPattern("HH:mm"); + textView.setText(String.format("昨天 %s", format.format(time))); + } else { + format.applyPattern("yyyy年MM月dd日 HH:mm"); + textView.setText(format.format(time)); + } + } catch (ParseException e) { + e.printStackTrace(); + format.applyPattern("yyyy年MM月dd日 HH:mm"); + textView.setText(format.format(time)); + } + } + } diff --git a/app/src/main/java/com/gh/gamecenter/adapter/MessageDetailAdapter.java b/app/src/main/java/com/gh/gamecenter/adapter/MessageDetailAdapter.java index 959aea455c..ae04b326a0 100644 --- a/app/src/main/java/com/gh/gamecenter/adapter/MessageDetailAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/adapter/MessageDetailAdapter.java @@ -21,6 +21,7 @@ import com.gh.common.util.ConcernContentUtils; import com.gh.common.util.DataUtils; import com.gh.common.util.DisplayUtils; import com.gh.common.util.GzipUtils; +import com.gh.common.util.NewsUtils; import com.gh.common.util.PostCommentUtils; import com.gh.common.util.Utils; import com.gh.common.view.CardLinearLayout; @@ -41,8 +42,7 @@ import com.gh.gamecenter.entity.ConcernEntity; import com.gh.gamecenter.eventbus.EBReuse; import com.gh.gamecenter.listener.OnCallBackListener; import com.gh.gamecenter.manager.DataCollectionManager; -import com.gh.gamecenter.news.News1Fragment; -import com.gh.gamecenter.news.NewsConcernViewHolder; +import com.gh.gamecenter.news.NewsDigestViewHolder; import com.gh.gamecenter.volley.extended.JsonArrayExtendedRequest; import com.gh.gamecenter.volley.extended.JsonObjectExtendedRequest; import com.google.gson.Gson; @@ -207,8 +207,8 @@ public class MessageDetailAdapter extends RecyclerView.Adapter= today && day < today + 86400 * 1000) { - format.applyPattern("HH:mm"); - viewHolder.concerntTime.setText("今天 " + format.format(day)); - } else if (day >= today - 86400 * 1000 && day < today) { - format.applyPattern("HH:mm"); - viewHolder.concerntTime.setText("昨天 " + format.format(day)); - } else { - format.applyPattern("yyyy年MM月dd日 HH:mm"); - viewHolder.concerntTime.setText(format.format(day)); - } - } catch (ParseException e) { - e.printStackTrace(); - format.applyPattern("yyyy年MM月dd日 HH:mm"); - viewHolder.concerntTime.setText(format.format(Long.valueOf(mConcernEntity.getTime() + "000"))); - } - - viewHolder.concernShareIv.setOnClickListener(new View.OnClickListener() { + viewHolder.share.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (mConcernEntity.getImg() != null && mConcernEntity.getImg().size() > 0) { @@ -451,7 +432,7 @@ public class MessageDetailAdapter extends RecyclerView.Adapter= today && day < today + 86400 * 1000) { long min = new Date().getTime()/1000 - day/1000; int hour = (int) (min/ (60 * 60)); @@ -474,7 +455,7 @@ public class MessageDetailAdapter extends RecyclerView.Adapter img; private String link; private String brief; @@ -78,10 +78,10 @@ public class ConcernEntity { return content; } - public void setTime(int time) { + public void setTime(long time) { this.time = time; } - public int getTime() { + public long getTime() { return time; } diff --git a/app/src/main/java/com/gh/gamecenter/entity/NewsDetailEntity.java b/app/src/main/java/com/gh/gamecenter/entity/NewsDetailEntity.java index e7e60698de..619ca1854c 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/NewsDetailEntity.java +++ b/app/src/main/java/com/gh/gamecenter/entity/NewsDetailEntity.java @@ -8,7 +8,7 @@ public class NewsDetailEntity { @SerializedName("_id") private String id; - private String time; + private long time; private String author; private String content; private String title; @@ -44,11 +44,11 @@ public class NewsDetailEntity { this.content = content; } - public String getTime() { + public long getTime() { return time; } - public void setTime(String time) { + public void setTime(long time) { this.time = time; } diff --git a/app/src/main/java/com/gh/gamecenter/news/News1Fragment.java b/app/src/main/java/com/gh/gamecenter/news/News1Fragment.java index 5977f7a1ae..5c22c3951e 100644 --- a/app/src/main/java/com/gh/gamecenter/news/News1Fragment.java +++ b/app/src/main/java/com/gh/gamecenter/news/News1Fragment.java @@ -65,7 +65,7 @@ public class News1Fragment extends BaseFragment implements SwipeRefreshLayout.On private List recommendGameList; // 推荐关注的游戏 private List installGameList; // 安装的游戏 - private Map concernMap; // 记录选择关注 + private Map concernMap; // 记录选择关注 private ConcernManager concernManager; @@ -74,7 +74,7 @@ public class News1Fragment extends BaseFragment implements SwipeRefreshLayout.On public void run() { adapter = new News1FragmentAdapter(News1Fragment.this); recyclerView.setAdapter(adapter); - adapter.loadDataByKey(0); + adapter.addList(0); } }; @@ -103,7 +103,7 @@ public class News1Fragment extends BaseFragment implements SwipeRefreshLayout.On if (newState == RecyclerView.SCROLL_STATE_IDLE && layoutManager.findLastVisibleItemPosition() + 1 == adapter.getItemCount()) { if (!adapter.isOver() && !adapter.isLoading() && !adapter.isNetworkError()) { - adapter.loadDataByKey(adapter.getConcernListSize()); + adapter.addList(adapter.getConcernListSize()); } } } @@ -113,9 +113,9 @@ public class News1Fragment extends BaseFragment implements SwipeRefreshLayout.On @OnClick(R.id.news1_tv_concern) public void concern() { // 关注 推荐关注的游戏 ArrayList list = new ArrayList<>(); - for (Integer integer : concernMap.keySet()) { - if (concernMap.get(integer)){ - list.add(recommendGameList.get(integer)); + for (int key : concernMap.keySet()) { + if (concernMap.get(key)) { + list.add(recommendGameList.get(key)); } } if (list.size() != 0) { @@ -156,6 +156,7 @@ public class News1Fragment extends BaseFragment implements SwipeRefreshLayout.On loadingLayout.setVisibility(View.GONE); recyclerView.setVisibility(View.GONE); emptyLayout.setVisibility(View.VISIBLE); + refreshLayout.setEnabled(false); initInstallGame(); } @@ -168,7 +169,7 @@ public class News1Fragment extends BaseFragment implements SwipeRefreshLayout.On } else if (adapter.isNetworkError()) { adapter.setNetworkError(false); adapter.notifyItemChanged(adapter.getItemCount() - 1); - adapter.loadDataByKey(adapter.getConcernListSize()); + adapter.addList(adapter.getConcernListSize()); } } } @@ -178,7 +179,7 @@ public class News1Fragment extends BaseFragment implements SwipeRefreshLayout.On if ("NewsFragment".equals(swith.getFrom())) { if (swith.getPosition() == 0) { if (loadingLayout.getVisibility() == View.VISIBLE) { - adapter.loadDataByKey(0); + adapter.addList(0); } } } @@ -187,11 +188,13 @@ public class News1Fragment extends BaseFragment implements SwipeRefreshLayout.On // 关注事件 public void onEventMainThread(EBConcernChanged changed) { emptyLayout.setVisibility(View.GONE); + refreshLayout.setEnabled(true); refreshLayout.setRefreshing(true); recyclerView.setVisibility(View.VISIBLE); loadingLayout.setVisibility(View.VISIBLE); adapter = new News1FragmentAdapter(News1Fragment.this); recyclerView.setAdapter(adapter); + adapter.addList(0); } @Override @@ -338,15 +341,19 @@ public class News1Fragment extends BaseFragment implements SwipeRefreshLayout.On if (recommendGameList.isEmpty()) { return; } + concernLayout.setVisibility(View.VISIBLE); concernListLayout.removeAllViews(); SimpleDraweeView icon; TextView name; ImageView concern; + GameEntity gameEntity; for (int i = 0, size = recommendGameList.size(); i < size; i++) { concernMap.put(i, true); + gameEntity = recommendGameList.get(i); + View view = View.inflate(getActivity(), R.layout.concern_item, null); icon = (SimpleDraweeView) view.findViewById(R.id.concern_item_icon); @@ -356,48 +363,52 @@ public class News1Fragment extends BaseFragment implements SwipeRefreshLayout.On concern.setVisibility(View.VISIBLE); ImageUtils.getInstance().display(getActivity().getResources(), icon, - recommendGameList.get(i).getIcon(), R.drawable.ocupy); - name.setText(recommendGameList.get(i).getName()); + gameEntity.getIcon(), R.drawable.ocupy); + name.setText(gameEntity.getName()); concern.setImageResource(R.drawable.concern_select_true); - final ImageView finalIvConcern = concern; final int finalI = i; concern.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (concernMap.get(finalI)){ - finalIvConcern.setImageResource(R.drawable.concern_select_false); + ((ImageView) v).setImageResource(R.drawable.concern_select_false); concernMap.put(finalI, false); } else { - finalIvConcern.setImageResource(R.drawable.concern_select_true); + ((ImageView) v).setImageResource(R.drawable.concern_select_true); concernMap.put(finalI, true); } // 判断关注按钮是否可用 - boolean isEnabled = false; - for (Integer integer : concernMap.keySet()) { - if (concernMap.get(integer)){ - isEnabled = true; - break; - } - } - if (isEnabled) { - News1Fragment.this.concern.setTextColor(getResources().getColor(R.color.theme)); - News1Fragment.this.concern.setEnabled(true); - } else { - News1Fragment.this.concern.setTextColor(getResources().getColor(R.color.btn_pause)); - News1Fragment.this.concern.setEnabled(false); - } + isConcernAvailable(); } }); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( 0, ViewGroup.LayoutParams.MATCH_PARENT); params.weight = 1; - concernLayout.addView(view, params); + concernListLayout.addView(view, params); } - concernLayout.setVisibility(View.VISIBLE); + concernListLayout.setVisibility(View.VISIBLE); + } + + // 判断关注按钮是否可用 + private void isConcernAvailable() { + boolean isEnabled = false; + for (int key : concernMap.keySet()) { + if (concernMap.get(key)){ + isEnabled = true; + break; + } + } + if (isEnabled) { + concern.setTextColor(getResources().getColor(R.color.theme)); + concern.setEnabled(true); + } else { + concern.setTextColor(getResources().getColor(R.color.btn_pause)); + concern.setEnabled(false); + } } } diff --git a/app/src/main/java/com/gh/gamecenter/news/News1FragmentAdapter.java b/app/src/main/java/com/gh/gamecenter/news/News1FragmentAdapter.java index 4452ae1735..cb38d3391b 100644 --- a/app/src/main/java/com/gh/gamecenter/news/News1FragmentAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/news/News1FragmentAdapter.java @@ -6,29 +6,20 @@ import android.os.Bundle; import android.support.v4.util.ArrayMap; import android.support.v7.widget.RecyclerView; import android.text.Html; +import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Toast; -import com.android.volley.NoConnectionError; -import com.android.volley.Request; -import com.android.volley.Response; -import com.android.volley.TimeoutError; -import com.android.volley.VolleyError; -import com.android.volley.toolbox.DiskBasedCache; -import com.gh.base.AppController; import com.gh.common.constant.Config; import com.gh.common.constant.ItemViewType; import com.gh.common.util.ConcernContentUtils; -import com.gh.common.util.ConcernUtils; import com.gh.common.util.DataUtils; import com.gh.common.util.DisplayUtils; -import com.gh.common.util.GzipUtils; import com.gh.common.util.MD5Utils; import com.gh.common.util.NewsUtils; import com.gh.common.util.TokenUtils; -import com.gh.common.util.Utils; import com.gh.common.view.CardLinearLayout; import com.gh.gamecenter.NewsDetailActivity; import com.gh.gamecenter.R; @@ -38,32 +29,37 @@ import com.gh.gamecenter.WebActivity; import com.gh.gamecenter.adapter.viewholder.FooterViewHolder; import com.gh.gamecenter.db.info.ConcernInfo; import com.gh.gamecenter.entity.ConcernEntity; +import com.gh.gamecenter.entity.ViewsEntity; import com.gh.gamecenter.listener.OnCallBackListener; import com.gh.gamecenter.manager.ConcernManager; import com.gh.gamecenter.manager.DataCollectionManager; -import com.gh.gamecenter.volley.extended.JsonArrayExtendedRequest; -import com.gh.gamecenter.volley.extended.JsonObjectExtendedRequest; -import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; +import com.gh.gamecenter.retrofit.JSONObjectResponse; +import com.gh.gamecenter.retrofit.ObservableUtil; +import com.gh.gamecenter.retrofit.Response; +import com.gh.gamecenter.retrofit.RetrofitManager; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; -import java.io.File; -import java.lang.reflect.Type; -import java.net.HttpURLConnection; -import java.text.ParseException; -import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; -import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; +import okhttp3.MediaType; +import okhttp3.RequestBody; +import retrofit2.adapter.rxjava.HttpException; +import rx.Observable; +import rx.Subscriber; +import rx.android.schedulers.AndroidSchedulers; +import rx.functions.Action1; +import rx.functions.Func1; +import rx.schedulers.Schedulers; + /** * Created by khy on 2016/8/15. * 资讯-关注-数据适配器 @@ -82,6 +78,8 @@ public class News1FragmentAdapter extends RecyclerView.Adapter(); - viewsMap = new ArrayMap<>(); urlList = new ArrayList<>(); + gameIdList = new ArrayList<>(); + + itemCount = 0; isNetworkError = false; isOver = false; isLoading = false; - - init(); } - public void init() { - gameIdList = new ArrayList<>(); - - ConcernManager concernManager = new ConcernManager(context); - List concernList = concernManager.getConcernGame(); - if (concernList == null || concernList.isEmpty()) { - listener.loadEmpty(); - return; - } - - for (ConcernInfo concernInfo : concernList) { - gameIdList.add(concernInfo.getId()); - } - - // 对数据进行排序 - Collections.sort(gameIdList, new Comparator() { - @Override - public int compare(String lhs, String rhs) { - return lhs.compareTo(rhs); - } - }); - - StringBuilder concernKey = new StringBuilder(); - StringBuilder gameIdPostData = new StringBuilder(); - for (int i = 0; i < gameIdList.size(); i++) { - concernKey.append(gameIdList.get(i)); - if (i < 5) { - gameIdPostData.append(gameIdList.get(i)); - gameIdPostData.append("-"); - } - } - key = MD5Utils.getContentMD5(concernKey.toString()); - ids = gameIdPostData.substring(0, gameIdPostData.length() - 1); - } - - public void loadDataByKey(final int offset) { + // 加载数据 + public void addList(final int offset) { if (isLoading) { return; } isLoading = true; - JsonArrayExtendedRequest request= new JsonArrayExtendedRequest( - Config.HOST + "zixun/guanzhu?key=" + key + "&limit=20&offset=" + offset, - new Response.Listener() { - @Override - public void onResponse(JSONArray response) { - isLoading = false; + if (TextUtils.isEmpty(key) || TextUtils.isEmpty(ids)) { + ObservableUtil.computation(new Observable.OnSubscribe() { + @Override + public void call(Subscriber subscriber) { + ConcernManager concernManager = new ConcernManager(context); + List concernList = concernManager.getConcernGame(); + if (concernList == null || concernList.isEmpty()) { + subscriber.onNext(null); + } else { + for (ConcernInfo concernInfo : concernList) { + gameIdList.add(concernInfo.getId()); + } - Type listType = new TypeToken>() {}.getType(); - Gson gson = new Gson(); - List list = gson.fromJson(response.toString(), listType); - if (list != null && list.size() != 0) { - if (!fragment.isHidden() && !fragment.isEverpause()) { - concernList.addAll(list); - notifyItemRangeInserted(concernList.size() - list.size(), list.size()); - } else { - concernList.addAll(list); - notifyDataSetChanged(); + // 对数据进行排序 + Collections.sort(gameIdList, new Comparator() { + @Override + public int compare(String lhs, String rhs) { + return lhs.compareTo(rhs); + } + }); + + StringBuilder keyBuilder = new StringBuilder(); + StringBuilder idsBuilder = new StringBuilder(); + for (int i = 0; i < gameIdList.size(); i++) { + keyBuilder.append(gameIdList.get(i)); + if (i < 5) { + idsBuilder.append(gameIdList.get(i)); + idsBuilder.append("-"); + } + } + key = MD5Utils.getContentMD5(keyBuilder.toString()); + ids = idsBuilder.substring(0, idsBuilder.length() - 1); + subscriber.onNext(""); + } + subscriber.onCompleted(); + } + }, new Action1() { + @Override + public void call(String s) { + if (s == null) { + listener.loadEmpty(); + } else { + loadDataByKey(offset); + } + } + }); + } else { + loadDataByKey(offset); + } + } + + private void loadDataByKey(final int offset) { + RetrofitManager.getApi() + .getGuanZhuByKey(key, offset) + .map(new Func1, List>() { + @Override + public List call(List list) { + // 去除重复数据 + return removeDuplicateData(concernList, list); + } + }) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe( + new Response>() { + @Override + public void onResponse(List response) { + isLoading = false; + + if (response.size() != 0) { + concernList.addAll(response); + itemCount += response.size(); + if (!fragment.isHidden() && !fragment.isEverpause()) { + notifyItemRangeInserted(concernList.size() - response.size(), response.size()); + } else { + notifyDataSetChanged(); + } + + getNewsViews(response, offset); + } else { + isOver = true; + notifyItemChanged(getItemCount() - 1); + } + + if (offset == 0 && listener != null) { + if (concernList.isEmpty()) { + listener.loadEmpty(); + } else { + listener.loadDone(); + } + } } - getNewsViews(list, offset); - } + @Override + public void onFailure(Throwable e) { + if (e instanceof HttpException) { + HttpException exception = (HttpException) e; + if (exception.code() == 409) { + loadDataByGameId(offset); + updateConcern(); + return; + } + } - if (list == null || list.isEmpty() || (offset == 0 && list.size() < 20)) { - isOver = true; - notifyItemChanged(getItemCount() - 1); - } + isLoading = false; - if (listener != null) { - listener.loadDone(); - } - - if (concernList.size() == 0){ - listener.loadEmpty(); - } - } - }, new Response.ErrorListener() { - @Override - public void onErrorResponse(VolleyError error) { - isLoading = false; - if (error.networkResponse != null - && error.networkResponse.statusCode == HttpURLConnection.HTTP_CONFLICT) { - loadDataByGameId(offset); - updateConcern(); - } else { - // 无网络连接和访问超时 - if (error.getClass().equals(NoConnectionError.class) - || error.getClass().equals(TimeoutError.class)) { + // 网络错误 if (offset == 0) { if (listener != null) { listener.loadError(); } } else { - Toast.makeText(context, "加载失败,请检查网络状态", - Toast.LENGTH_SHORT).show(); + Toast.makeText(context, "加载失败,请检查网络状态", Toast.LENGTH_SHORT).show(); isNetworkError = true; notifyItemChanged(getItemCount() - 1); } } - } - } - }); -// AppController.addToRequestQueue(request, News1Fragment.TAG); + }); } - public void loadDataByGameId(final int offset) { - if (isLoading) { - return; - } - isLoading = true; - JsonArrayExtendedRequest request= new JsonArrayExtendedRequest( - Config.HOST + "zixun/guanzhu?game_id=" + ids + "&limit=20&offset=" + offset, - new Response.Listener() { + private void loadDataByGameId(final int offset) { + RetrofitManager.getApi() + .getGuanZhuById(ids, offset) + .map(new Func1, List>() { @Override - public void onResponse(JSONArray response) { + public List call(List list) { + // 去除重复数据 + return removeDuplicateData(concernList, list); + } + }) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response>() { + @Override + public void onResponse(List response) { isLoading = false; - Type listType = new TypeToken>() {}.getType(); - Gson gson = new Gson(); - List list = gson.fromJson(response.toString(), listType); - - int listSize = list.size(); - - // 去除重复数据 - removeDuplicateData(list); - - if (list.size() != 0) { + if (response.size() != 0) { + concernList.addAll(response); + itemCount += response.size(); if (!fragment.isHidden() && !fragment.isEverpause()) { - concernList.addAll(list); - notifyItemRangeInserted(concernList.size() - list.size(), list.size()); + notifyItemRangeInserted(concernList.size() - response.size(), response.size()); } else { - concernList.addAll(list); notifyDataSetChanged(); } - getNewsViews(list, offset); - } - - if (listSize == 0 || (offset == 0 && listSize < 20)) { + getNewsViews(response, offset); + } else { isOver = true; notifyItemChanged(getItemCount() - 1); } - if (listener != null) { - listener.loadDone(); - } - - if (concernList.size() == 0){ - listener.loadEmpty(); - } - } - }, new Response.ErrorListener() { - @Override - public void onErrorResponse(VolleyError error) { - isLoading = false; - // 无网络连接和访问超时 - if (error.getClass().equals(NoConnectionError.class) - || error.getClass().equals(TimeoutError.class)) { - if (offset == 0) { - if (listener != null) { - listener.loadError(); - } + if (offset == 0 && listener != null) { + if (concernList.isEmpty()) { + listener.loadEmpty(); } else { - Toast.makeText(context, "加载失败,请检查网络状态", - Toast.LENGTH_SHORT).show(); - isNetworkError = true; - notifyItemChanged(getItemCount() - 1); + listener.loadDone(); } } } + + @Override + public void onFailure(Throwable e) { + isLoading = false; + + // 网络错误 + if (offset == 0) { + if (listener != null) { + listener.loadError(); + } + } else { + Toast.makeText(context, "加载失败,请检查网络状态", Toast.LENGTH_SHORT).show(); + isNetworkError = true; + notifyItemChanged(getItemCount() - 1); + } + } }); -// AppController.addToRequestQueue(request, News1Fragment.TAG); } - private void removeDuplicateData(List list) { - if (concernList == null || concernList.isEmpty()) { - return; + // 去除重复数据 + private static List removeDuplicateData(List sourceList, List rawList) { + if (sourceList == null || sourceList.isEmpty() + || rawList == null || rawList.isEmpty()) { + return rawList; } String id; - for (int i = 0; i < list.size(); i++) { - id = list.get(i).getId(); - for (ConcernEntity concernEntity : concernList) { + for (int i = 0; i < rawList.size(); i++) { + id = rawList.get(i).getId(); + for (ConcernEntity concernEntity : sourceList) { if (id.equals(concernEntity.getId())) { - list.remove(i); + rawList.remove(i); i--; break; } } } + return rawList; } + // 更新设备关注 public void updateConcern() { - String uuid = TokenUtils.getDeviceId(context); - ConcernUtils.updateConcernData(Config.HOST + "device/" + uuid + "/concern", - new JSONArray(gameIdList), - new ConcernUtils.DownJsonListener() { - @Override - public void downSucced(String str) { - Utils.log("更新设备游戏成功"); - } - - @Override - public void downFailed() { - Utils.log("更新设备游戏失败"); - } - }); + RequestBody body = RequestBody.create(MediaType.parse("application/json"), + new JSONArray(gameIdList).toString()); + RetrofitManager.getApi().putConcern(TokenUtils.getDeviceId(context), body); } + // 获取新闻阅读量 private void getNewsViews(final List list, final int start) { if (list == null || list.isEmpty()) { return; } - StringBuilder ids = new StringBuilder(); - for (int i = 0, size = list.size(); i < size; i++) { - ids.append(list.get(i).getId()); - ids.append("-"); - } - final String url = Config.DATA_HOST + "v1d46/news/" + ids.substring(0, ids.length() - 1) + "/visit"; - if (!urlList.contains(url)) { - urlList.add(url); - } - JsonArrayExtendedRequest request = new JsonArrayExtendedRequest(url, - new Response.Listener() { - @Override - public void onResponse(JSONArray response) { - try { - JSONObject jsonObject; - for (int i = 0, size = response.length(); i < size; i++) { - jsonObject = response.getJSONObject(i); - viewsMap.put(jsonObject.getString("id"), jsonObject.getInt("views")); - } - notifyItemRangeChanged(start, start + list.size() - 1); - } catch (JSONException e) { - e.printStackTrace(); - } - } - }, null); -// AppController.addToRequestQueue(request, News1Fragment.TAG); - } - - private void statNewsViews(final String news_id, final int position) { - String url = Config.DATA_HOST + "news/stat?news_id=" + news_id; - JsonObjectExtendedRequest request = new JsonObjectExtendedRequest( - Request.Method.POST, url, - new Response.Listener() { - @Override - public void onResponse(JSONObject response) { - try { - if ("success".equals(response.getString("status"))) { - Integer views = viewsMap.get(news_id); - if (views == null) { - views = 0; - } - views += 1; - viewsMap.put(news_id, views); - notifyItemChanged(position); - - //修改volley缓存 - modifyVolleyCache(news_id); - } - } catch (JSONException e) { - e.printStackTrace(); - } - } - }, null); - request.setShouldCache(false); -// AppController.addToRequestQueue(request, News1Fragment.TAG); - } - - private static final String DEFAULT_CACHE_DIR = "volley"; - - private void modifyVolleyCache(String id) { - String key = null; - for (int i = 0, size = urlList.size(); i < size; i++) { - if (urlList.get(i).contains(id)) { - key = urlList.get(i); - break; + ObservableUtil.computation(new Observable.OnSubscribe() { + @Override + public void call(Subscriber subscriber) { + StringBuilder builder = new StringBuilder(); + for (int i = 0, size = list.size(); i < size; i++) { + builder.append(list.get(i).getId()); + builder.append("-"); + } + builder.deleteCharAt(builder.length() - 1); + String ids = builder.toString(); + String url = Config.DATA_HOST + "v1d46/news/" + ids + "/visit"; + if (!urlList.contains(url)) { + urlList.add(url); + } + subscriber.onNext(ids); + subscriber.onCompleted(); } - } - if (key == null) { - return; - } - File cacheDir = new File(context.getCacheDir(), DEFAULT_CACHE_DIR); - DiskBasedCache cache = new DiskBasedCache(cacheDir); - byte[] data = cache.getData(key); - if (data != null) { - try { - JSONArray jsonArray = new JSONArray(new String(GzipUtils.decompressBytes(data))); - JSONObject jsonObject; - for (int i = 0, size = jsonArray.length(); i < size; i++) { - jsonObject = jsonArray.getJSONObject(i); - if (jsonObject.getString("id").equals(id)) { - jsonObject.put("views", jsonObject.getInt("views") + 1); + }, new Action1() { + @Override + public void call(String ids) { + RetrofitManager.getData().getNewsViews(ids, + new Response>(){ + @Override + public void onResponse(List response) { + for (ViewsEntity viewsEntity : response) { + viewsMap.put(viewsEntity.getId(), viewsEntity.getViews()); + } + notifyItemRangeChanged(start, list.size()); + } + }); + } + }); + } + + // 统计新闻阅读量 + private void statNewsViews(final String news_id, final int position) { + RetrofitManager.getData().postNewsViews(news_id, new JSONObjectResponse(){ + @Override + public void onResponse(JSONObject response) { + try { + if ("success".equals(response.getString("status"))) { + Integer views = viewsMap.get(news_id); + if (views == null) { + views = 0; + } + views += 1; + viewsMap.put(news_id, views); + + notifyItemChanged(position); + + // 更新okhttp缓存数据 + updateOkhttpCache(news_id); + } + } catch (JSONException e) { + e.printStackTrace(); + } + } + }); + } + + // 更新okhttp缓存数据 + private void updateOkhttpCache(final String news_id) { + ObservableUtil.io(new Observable.OnSubscribe() { + @Override + public void call(Subscriber subscriber) { + String key = null; + for (int i = 0, size = urlList.size(); i < size; i++) { + if (urlList.get(i).contains(news_id)) { + key = urlList.get(i); break; } } - Utils.log(jsonArray.toString()); - cache.modify(key, GzipUtils.compressBytes(jsonArray.toString().getBytes())); - } catch (JSONException e) { - e.printStackTrace(); + if (key == null) { + return; + } + byte[] data = RetrofitManager.getInstance().getCache(key); + if (data != null) { + try { + JSONArray jsonArray = new JSONArray(new String(data)); + JSONObject jsonObject; + for (int i = 0, size = jsonArray.length(); i < size; i++) { + jsonObject = jsonArray.getJSONObject(i); + if (jsonObject.getString("id").equals(news_id)) { + jsonObject.put("views", jsonObject.getInt("views") + 1); + break; + } + } + RetrofitManager.getInstance().updateCache(key, jsonArray.toString().getBytes()); + } catch (JSONException e) { + e.printStackTrace(); + } + } } - } else { - Utils.log("modifyVolleyCache is null"); - } + }, null); } @Override @@ -419,53 +425,31 @@ public class News1FragmentAdapter extends RecyclerView.Adapter= today && day < today + 86400 * 1000) { - format.applyPattern("HH:mm"); - viewHolder.concerntTime.setText("今天 " + format.format(day)); - } else if (day >= today - 86400 * 1000 && day < today) { - format.applyPattern("HH:mm"); - viewHolder.concerntTime.setText("昨天 " + format.format(day)); - } else { - format.applyPattern("yyyy年MM月dd日 HH:mm"); - viewHolder.concerntTime.setText(format.format(day)); - } - } catch (ParseException e) { - e.printStackTrace(); - format.applyPattern("yyyy年MM月dd日 HH:mm"); - viewHolder.concerntTime.setText(format.format(Long.valueOf(concernEntity.getTime() + "000"))); + - DisplayUtils.dip2px(context, 34), viewHolder.imgLayout, concernEntity.getImg(), context); } Integer views = viewsMap.get(concernEntity.getId()); if (views == null) { - viewHolder.concernRead.setVisibility(View.GONE); + viewHolder.read.setVisibility(View.GONE); } else { - viewHolder.concernRead.setVisibility(View.VISIBLE); - viewHolder.concernRead.setText("阅读 " + views); + viewHolder.read.setVisibility(View.VISIBLE); + viewHolder.read.setText(String.format(Locale.getDefault(), "阅读 %d", views)); } - viewHolder.concernShareIv.setOnClickListener(new View.OnClickListener() { + if (concernEntity.getLink() != null) { + viewHolder.link.setImageResource(R.drawable.link_iv); + } else { + viewHolder.link.setImageResource(R.drawable.concern_message_icon); + } + + viewHolder.comment.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (viewsMap.size() != 0) { + concernEntity.setMessageDetailViews(viewsMap.get(concernEntity.getId())); + } + NewsUtils.startMessageActivity(context, concernEntity, "资讯-关注"); + } + }); + + viewHolder.share.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (concernEntity.getImg() != null && concernEntity.getImg().size() > 0) { @@ -561,16 +534,6 @@ public class News1FragmentAdapter extends RecyclerView.Adapter getConcernList() { - return concernList; + @Override + public int getItemCount() { + if (itemCount == 0){ + return 0; + } + return itemCount + 1; } public int getConcernListSize() { diff --git a/app/src/main/java/com/gh/gamecenter/news/News2FragmentAdapter.java b/app/src/main/java/com/gh/gamecenter/news/News2FragmentAdapter.java index c810f18f59..74190bb89e 100644 --- a/app/src/main/java/com/gh/gamecenter/news/News2FragmentAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/news/News2FragmentAdapter.java @@ -119,7 +119,7 @@ public class News2FragmentAdapter extends RecyclerView.Adapter= today && day < today + 86400 * 1000) { - format.applyPattern("HH:mm"); - viewHolder.newsdetail_item_tv_time.setText("今天 " + format.format(day)); - } else if (day >= today - 86400 * 1000 && day < today) { - format.applyPattern("HH:mm"); - viewHolder.newsdetail_item_tv_time.setText("昨天 " + format.format(day)); - } else { - format.applyPattern("yyyy年MM月dd日 HH:mm"); - viewHolder.newsdetail_item_tv_time.setText(format.format(day)); - } - } catch (ParseException e) { - e.printStackTrace(); - format.applyPattern("yyyy年MM月dd日 HH:mm"); - viewHolder.newsdetail_item_tv_time.setText(format.format(Long.valueOf(newsDetailEntity.getTime() + "000"))); - } + NewsUtils.setNewsPublishOn(viewHolder.newsdetail_item_tv_time, newsDetailEntity.getTime()); + if (!TextUtils.isEmpty(newsDetailEntity.getAuthor())) { viewHolder.newsdetail_item_tv_author.setText(newsDetailEntity.getAuthor()); } diff --git a/app/src/main/java/com/gh/gamecenter/retrofit/ApiService.java b/app/src/main/java/com/gh/gamecenter/retrofit/ApiService.java index 94d0d86ff8..7345c821e3 100644 --- a/app/src/main/java/com/gh/gamecenter/retrofit/ApiService.java +++ b/app/src/main/java/com/gh/gamecenter/retrofit/ApiService.java @@ -1,12 +1,17 @@ package com.gh.gamecenter.retrofit; +import com.gh.gamecenter.entity.ConcernEntity; import com.gh.gamecenter.entity.GameEntity; import com.gh.gamecenter.entity.NewsEntity; import java.util.List; +import okhttp3.RequestBody; import okhttp3.ResponseBody; +import retrofit2.http.Body; import retrofit2.http.GET; +import retrofit2.http.Headers; +import retrofit2.http.PUT; import retrofit2.http.Path; import retrofit2.http.Query; import rx.Observable; @@ -17,6 +22,12 @@ import rx.Observable; */ public interface ApiService { + @GET("zixun/guanzhu?limit=20") // 获取资讯-关注 根据key + Observable> getGuanZhuByKey(@Query("key") String key, @Query("offset") int offset); + + @GET("zixun/guanzhu?limit=20") // 获取资讯-关注 根据id + Observable> getGuanZhuById(@Query("game_id") String game_id, @Query("offset") int offset); + @GET("zixun/zixun?limit=20") // 获取资讯-资讯 Observable> getZiXun(@Query("offset") int offset); @@ -36,4 +47,8 @@ public interface ApiService { @GET("support/time/current") Observable getTime(); + @Headers({"Content-Type: application/json", "Accept: application/json"}) + @PUT("device/{device_id}/concern") // 更新设备关注 + Observable putConcern(@Path("device_id") String device_id, @Body RequestBody body); + } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/retrofit/ApiServiceImpl.java b/app/src/main/java/com/gh/gamecenter/retrofit/ApiServiceImpl.java index 61b54d77c5..09c04111d9 100644 --- a/app/src/main/java/com/gh/gamecenter/retrofit/ApiServiceImpl.java +++ b/app/src/main/java/com/gh/gamecenter/retrofit/ApiServiceImpl.java @@ -1,10 +1,13 @@ package com.gh.gamecenter.retrofit; +import com.gh.gamecenter.entity.ConcernEntity; import com.gh.gamecenter.entity.GameEntity; import com.gh.gamecenter.entity.NewsEntity; import java.util.List; +import okhttp3.RequestBody; +import okhttp3.ResponseBody; import rx.Observable; import rx.Subscriber; import rx.android.schedulers.AndroidSchedulers; @@ -12,6 +15,7 @@ import rx.schedulers.Schedulers; /** * Created by LGT on 2016/11/9. + * */ public class ApiServiceImpl { @@ -27,6 +31,14 @@ public class ApiServiceImpl { .subscribe(subscriber); } + public Observable> getGuanZhuByKey(String key, int offset) { + return apiService.getGuanZhuByKey(key, offset); + } + + public Observable> getGuanZhuById(String game_id, int offset) { + return apiService.getGuanZhuById(game_id, offset); + } + public Observable> getZiXun(int offset) { return apiService.getZiXun(offset); } @@ -51,4 +63,8 @@ public class ApiServiceImpl { return apiService.getRemenkapai(); } + public void putConcern(String device_id, RequestBody body) { + subscribe(apiService.putConcern(device_id, body), new Response()); + } + } diff --git a/app/src/main/res/layout/concern_rv_item.xml b/app/src/main/res/layout/news_digest_item.xml similarity index 82% rename from app/src/main/res/layout/concern_rv_item.xml rename to app/src/main/res/layout/news_digest_item.xml index 6d407f764f..a0b80b0b21 100644 --- a/app/src/main/res/layout/concern_rv_item.xml +++ b/app/src/main/res/layout/news_digest_item.xml @@ -18,7 +18,7 @@ android:layout_height="wrap_content"> @@ -78,7 +78,7 @@ android:paddingBottom="8dp"> + android:layout_toRightOf="@+id/news_digest_comment" /> -