From c75366307924f10f23c1b64a53bfcaabf577d081 Mon Sep 17 00:00:00 2001 From: huangzhuanghua <401742778@qq.com> Date: Wed, 9 Nov 2016 19:09:30 +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=E6=9C=AA=E5=AE=8C=E6=88=90=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/gh/base/BaseFragment.java | 71 ++- .../java/com/gh/common/util/ImageUtils.java | 124 ++--- .../java/com/gh/common/util/NewsUtils.java | 56 ++- .../java/com/gh/common/util/ShareUtils.java | 4 +- .../com/gh/gamecenter/NewsSearchActivity.java | 12 +- .../com/gh/gamecenter/ViewImageActivity.java | 8 +- .../gamecenter/adapter/ImagePagerAdapter.java | 3 +- .../gh/gamecenter/adapter/SubjectAdapter.java | 12 +- .../adapter/viewholder/FooterViewHolder.java | 21 +- .../viewholder/NewsImage1ViewHolder.java | 18 +- .../viewholder/NewsImage2ViewHolder.java | 24 +- .../viewholder/NewsImage3ViewHolder.java | 18 +- .../com/gh/gamecenter/entity/ViewsEntity.java | 28 ++ .../gamecenter/game/Game1FragmentAdapter.java | 27 +- .../gamecenter/game/Game2FragmentAdapter.java | 11 +- .../gamecenter/game/Game3FragmentAdapter.java | 24 +- .../com/gh/gamecenter/news/News1Fragment.java | 5 +- .../gamecenter/news/News1FragmentAdapter.java | 35 +- .../com/gh/gamecenter/news/News2Fragment.java | 146 +++--- .../gamecenter/news/News2FragmentAdapter.java | 464 ++++++++---------- .../com/gh/gamecenter/news/News3Fragment.java | 136 ++--- .../gamecenter/news/News3FragmentAdapter.java | 245 ++++----- .../com/gh/gamecenter/news/News4Fragment.java | 2 +- .../gh/gamecenter/retrofit/ApiService.java | 5 +- .../gamecenter/retrofit/ApiServiceImpl.java | 46 ++ .../gh/gamecenter/retrofit/DataService.java | 25 + .../gamecenter/retrofit/DataServiceImpl.java | 37 ++ .../gamecenter/retrofit/ObservableUtil.java | 45 ++ .../retrofit/OkHttpInterceptor.java | 8 +- .../gamecenter/retrofit/RetrofitManager.java | 54 +- app/src/main/res/layout/fm_search.xml | 4 +- app/src/main/res/layout/fragment_news1.xml | 106 ++++ ...agment_original.xml => fragment_news2.xml} | 8 +- app/src/main/res/layout/fragment_news3.xml | 29 +- app/src/main/res/layout/fragment_news4.xml | 106 +--- ...{fm_read_item.xml => news_image1_item.xml} | 14 +- ...ead2_special2.xml => news_image2_item.xml} | 21 +- ...ead2_special1.xml => news_image3_item.xml} | 16 +- .../main/res/layout/refresh_footerview.xml | 8 +- app/src/main/res/values/colors.xml | 12 +- 40 files changed, 1044 insertions(+), 994 deletions(-) create mode 100644 app/src/main/java/com/gh/gamecenter/entity/ViewsEntity.java create mode 100644 app/src/main/java/com/gh/gamecenter/retrofit/ApiServiceImpl.java create mode 100644 app/src/main/java/com/gh/gamecenter/retrofit/DataService.java create mode 100644 app/src/main/java/com/gh/gamecenter/retrofit/DataServiceImpl.java create mode 100644 app/src/main/java/com/gh/gamecenter/retrofit/ObservableUtil.java create mode 100644 app/src/main/res/layout/fragment_news1.xml rename app/src/main/res/layout/{fragment_original.xml => fragment_news2.xml} (81%) rename app/src/main/res/layout/{fm_read_item.xml => news_image1_item.xml} (84%) rename app/src/main/res/layout/{fm_read2_special2.xml => news_image2_item.xml} (79%) rename app/src/main/res/layout/{fm_read2_special1.xml => news_image3_item.xml} (81%) diff --git a/app/src/main/java/com/gh/base/BaseFragment.java b/app/src/main/java/com/gh/base/BaseFragment.java index 17b933f0fe..46d87a9906 100644 --- a/app/src/main/java/com/gh/base/BaseFragment.java +++ b/app/src/main/java/com/gh/base/BaseFragment.java @@ -1,6 +1,7 @@ package com.gh.base; import android.os.Bundle; +import android.os.Handler; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.view.LayoutInflater; @@ -12,41 +13,61 @@ import com.gh.gamecenter.listener.OnCallBackListener; import java.lang.reflect.Field; +import butterknife.ButterKnife; import de.greenrobot.event.EventBus; /** * Created by LGT on 2016/9/4. + * Fragment 基类 */ public class BaseFragment extends Fragment implements OnCallBackListener { +// private Unbinder unbinder; + protected View view; - protected void init(int layout) { + protected Handler handler = new Handler(); + + protected boolean isEverpause; + + protected void init(int layout, boolean flag) { view = View.inflate(getActivity(), layout, null); - //简化findViewById - try { - Class clazz = this.getClass(); - Field[] fields = clazz.getDeclaredFields(); - for (Field field : fields) { - int id = Utils.getId(field.getName()); - if (id != -1) { - Utils.log("reflect name = " + field.getName()); - field.setAccessible(true); - Class fieldType = field.getType(); - Object injectedValue = fieldType.cast(view.findViewById(id)); - field.set(this, injectedValue); - field.setAccessible(false); +// unbinder = ButterKnife.bind(this, view); + + if (flag) { + //简化findViewById + try { + Class clazz = this.getClass(); + Field[] fields = clazz.getDeclaredFields(); + for (Field field : fields) { + int id = Utils.getId(field.getName()); + if (id != -1) { + Utils.log("reflect name = " + field.getName()); + field.setAccessible(true); + Class fieldType = field.getType(); + Object injectedValue = fieldType.cast(view.findViewById(id)); + field.set(this, injectedValue); + field.setAccessible(false); + } } + } catch (IllegalAccessException e) { + e.printStackTrace(); } - } catch (IllegalAccessException e) { - e.printStackTrace(); + } else { + ButterKnife.bind(this, view); } + + } + + protected void init(int layout) { + init(layout, true); } @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); + isEverpause = false; EventBus.getDefault().register(this); } @@ -60,10 +81,27 @@ public class BaseFragment extends Fragment implements OnCallBackListener { return view; } + public boolean isEverpause() { + return isEverpause; + } + + @Override + public void onPause() { + super.onPause(); + isEverpause = true; + } + + @Override + public void onResume() { + super.onResume(); + isEverpause = false; + } + @Override public void onDestroy() { super.onDestroy(); EventBus.getDefault().unregister(this); +// unbinder.unbind(); } @Override @@ -85,4 +123,5 @@ public class BaseFragment extends Fragment implements OnCallBackListener { public void loadEmpty() { } + } diff --git a/app/src/main/java/com/gh/common/util/ImageUtils.java b/app/src/main/java/com/gh/common/util/ImageUtils.java index 55484055ee..d8de4b85e6 100644 --- a/app/src/main/java/com/gh/common/util/ImageUtils.java +++ b/app/src/main/java/com/gh/common/util/ImageUtils.java @@ -1,35 +1,30 @@ package com.gh.common.util; import android.content.Context; -import android.graphics.Color; +import android.content.res.Resources; import android.graphics.drawable.Animatable; import android.graphics.drawable.ColorDrawable; import android.net.Uri; import android.view.ViewGroup; import com.facebook.common.executors.CallerThreadExecutor; -import com.facebook.common.references.CloseableReference; -import com.facebook.datasource.DataSource; import com.facebook.drawee.backends.pipeline.Fresco; import com.facebook.drawee.controller.BaseControllerListener; import com.facebook.drawee.controller.ControllerListener; import com.facebook.drawee.drawable.ScalingUtils; -import com.facebook.drawee.generic.GenericDraweeHierarchy; import com.facebook.drawee.generic.GenericDraweeHierarchyBuilder; -import com.facebook.drawee.interfaces.DraweeController; import com.facebook.drawee.view.SimpleDraweeView; -import com.facebook.imagepipeline.core.ImagePipeline; import com.facebook.imagepipeline.datasource.BaseBitmapDataSubscriber; -import com.facebook.imagepipeline.image.CloseableImage; import com.facebook.imagepipeline.image.ImageInfo; import com.facebook.imagepipeline.request.ImageRequest; import com.facebook.imagepipeline.request.ImageRequestBuilder; import com.gh.gamecenter.R; public class ImageUtils { + private static ImageUtils singleton; - public static ImageUtils getInstance(Context context) { + public static ImageUtils getInstance() { if (singleton == null) { synchronized (ImageUtils.class) { if (singleton == null) { @@ -41,121 +36,70 @@ public class ImageUtils { return singleton; } - // 自适应图片宽高 - public void display (String url , final SimpleDraweeView simpleDraweeView, final Context context, final int paddingSize){ - ControllerListener listener = new BaseControllerListener(){ + public void display(final SimpleDraweeView simpleDraweeView, String url, final int width) { + ControllerListener listener = new BaseControllerListener(){ @Override - public void onFinalImageSet(String id, Object imageInfo, Animatable animatable) { - super.onFinalImageSet(id, imageInfo, animatable); + public void onFinalImageSet(String id, ImageInfo imageInfo, Animatable animatable) { if (imageInfo == null){ return; } - ImageInfo imageInfo1 = (ImageInfo) imageInfo; - int height = imageInfo1.getHeight(); - int width = imageInfo1.getWidth(); - int widthPixels = context.getResources().getDisplayMetrics().widthPixels - DisplayUtils.dip2px(context,paddingSize); - float index = (float) height / (float) width; - int newHeight = (int)(index * widthPixels); ViewGroup.LayoutParams layoutParams = simpleDraweeView.getLayoutParams(); - layoutParams.height = newHeight; + float scale = (float) imageInfo.getHeight() / (float) imageInfo.getWidth(); + layoutParams.height = (int)(width * scale); simpleDraweeView.setLayoutParams(layoutParams); } - - @Override - public void onIntermediateImageSet(String id, Object imageInfo) { - super.onIntermediateImageSet(id, imageInfo); - } - - @Override - public void onIntermediateImageFailed(String id, Throwable throwable) { - super.onIntermediateImageFailed(id, throwable); - } - - @Override - public void onFailure(String id, Throwable throwable) { - super.onFailure(id, throwable); - } - - @Override - public void onRelease(String id) { - super.onRelease(id); - } }; - - DraweeController controller = Fresco.newDraweeControllerBuilder() + simpleDraweeView.setController(Fresco.newDraweeControllerBuilder() .setUri(url) .setControllerListener(listener) - .build(); - - simpleDraweeView.setController(controller); - + .build()); } - //设置缩放类型,设置按压状态下的叠加图 - public void display (String url , SimpleDraweeView simpleDraweeView, ScalingUtils.ScaleType scaleType, Context context){ - GenericDraweeHierarchyBuilder builder = - new GenericDraweeHierarchyBuilder(context.getResources()); - GenericDraweeHierarchy hierarchy = builder + // 设置缩放类型,设置按压状态下的叠加图 + public void display(Resources resources, SimpleDraweeView simpleDraweeView, + ScalingUtils.ScaleType scaleType, String url) { + simpleDraweeView.setHierarchy(new GenericDraweeHierarchyBuilder(resources) .setFadeDuration(500) - .setPressedStateOverlay(new ColorDrawable(context.getResources().getColor(R.color.pressed_bg))) + .setPressedStateOverlay(new ColorDrawable(resources.getColor(R.color.pressed_bg))) .setPlaceholderImage(R.drawable.ocupy2, ScalingUtils.ScaleType.CENTER) - .setBackground(new ColorDrawable(Color.parseColor("#ececec"))) + .setBackground(new ColorDrawable(resources.getColor(R.color.placeholder_bg))) .setActualImageScaleType(scaleType) - .build(); - simpleDraweeView.setHierarchy(hierarchy); + .build()); simpleDraweeView.setImageURI(url); - } - //设置占位符 - public void display (String url , SimpleDraweeView simpleDraweeView, int placeholderImage, Context context){ - - GenericDraweeHierarchyBuilder builder = - new GenericDraweeHierarchyBuilder(context.getResources()); - GenericDraweeHierarchy hierarchy = builder + // 设置占位符 + public void display(Resources resources, SimpleDraweeView simpleDraweeView, String url, int placeholderImage) { + simpleDraweeView.setHierarchy(new GenericDraweeHierarchyBuilder(resources) .setFadeDuration(500) - .setPressedStateOverlay(new ColorDrawable(context.getResources().getColor(R.color.pressed_bg))) - .setBackground(new ColorDrawable(Color.parseColor("#ececec"))) + .setPressedStateOverlay(new ColorDrawable(resources.getColor(R.color.pressed_bg))) + .setBackground(new ColorDrawable(resources.getColor(R.color.placeholder_bg))) .setPlaceholderImage(placeholderImage) - .build(); - simpleDraweeView.setHierarchy(hierarchy); + .build()); simpleDraweeView.setImageURI(url); - } - //图片下载监听和设置低高分辨率图片 - public void display (String url, String lowUrl, SimpleDraweeView simpleDraweeView, ControllerListener listener){ - - DraweeController controller = Fresco.newDraweeControllerBuilder() + // 图片下载监听和设置低高分辨率图片 + public void display(SimpleDraweeView simpleDraweeView, String url, String lowUrl, + ControllerListener listener) { + simpleDraweeView.setController(Fresco.newDraweeControllerBuilder() .setImageRequest(ImageRequest.fromUri(url)) .setControllerListener(listener) - .setLowResImageRequest(ImageRequest.fromUri(lowUrl)) //低分辨率图片 - .build(); - simpleDraweeView.setController(controller); + .setLowResImageRequest(ImageRequest.fromUri(lowUrl)) // 低分辨率图片 + .build()); } - public void display (String url, SimpleDraweeView simpleDraweeView, ControllerListener listener){ - - DraweeController controller = Fresco.newDraweeControllerBuilder() - .setImageRequest(ImageRequest.fromUri(url)) - .setControllerListener(listener) - .build(); - simpleDraweeView.setController(controller); - } - - //获取bitmap - public void display (String url, BaseBitmapDataSubscriber dataSubscriber, Context context){ + // 获取bitmap + public void display(Context context, String url, BaseBitmapDataSubscriber dataSubscriber) { ImageRequest imageRequest = ImageRequestBuilder .newBuilderWithSource(Uri.parse(url)) .setProgressiveRenderingEnabled(true) .build(); - ImagePipeline imagePipeline = Fresco.getImagePipeline(); - DataSource> - dataSource = imagePipeline.fetchDecodedImage(imageRequest, context); - dataSource.subscribe(dataSubscriber, CallerThreadExecutor.getInstance()); - + Fresco.getImagePipeline() + .fetchDecodedImage(imageRequest, context) + .subscribe(dataSubscriber, CallerThreadExecutor.getInstance()); } } 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 23bf3b7806..2d65c148ab 100644 --- a/app/src/main/java/com/gh/common/util/NewsUtils.java +++ b/app/src/main/java/com/gh/common/util/NewsUtils.java @@ -2,6 +2,8 @@ package com.gh.common.util; import android.content.Context; import android.content.Intent; +import android.graphics.Color; +import android.widget.TextView; import com.android.volley.Request; import com.gh.base.AppController; @@ -11,13 +13,12 @@ import com.gh.gamecenter.R; import com.gh.gamecenter.entity.NewsEntity; import com.gh.gamecenter.volley.extended.JsonObjectExtendedRequest; +import java.util.List; + public class NewsUtils { /** * 根据新闻类型获取标签背景资源 - * - * @param type - * @return */ public static int getDrawableIdByType(String type) { if ("活动".equals(type) || "高阶".equals(type)) { @@ -33,11 +34,6 @@ public class NewsUtils { /** * 启动新闻详情页面 - * - * @param context - * @param newsEntity - * @param entrance - * @return */ public static void startNewsActivity(Context context, NewsEntity newsEntity, String entrance) { Intent intent = new Intent(context, NewsDetailActivity.class); @@ -51,7 +47,6 @@ public class NewsUtils { /** * 统计阅读量 - * @param news_id */ public static void statNewsViews(String news_id) { String url = Config.DATA_HOST + "news/stat?news_id=" + news_id; @@ -61,4 +56,47 @@ public class NewsUtils { AppController.addToRequestQueue(request); } + /** + * 去除与重复sourceList相同的数据 + */ + public 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 < rawList.size(); i++) { + id = rawList.get(i).getId(); + for (NewsEntity newsEntity : sourceList) { + if (id.equals(newsEntity.getId())) { + rawList.remove(i); + i--; + break; + } + } + } + return rawList; + } + + /** + * 设置新闻类型 + */ + public static void setNewsType(TextView textView, String type) { + textView.setText(type); + textView.setTextColor(Color.WHITE); + if ("活动".equals(type)) { + textView.setBackgroundResource(R.drawable.textview_orange_style); + } else if ("公告".equals(type)) { + textView.setBackgroundResource(R.drawable.textview_red_style); + } else if ("评测".equals(type)) { + textView.setBackgroundResource(R.drawable.textview_red_style); + } else if ("杂谈".equals(type)) { + textView.setBackgroundResource(R.drawable.textview_orange_style); + } else if ("专题".equals(type)) { + textView.setBackgroundResource(R.drawable.textview_blue_style); + } else { + textView.setBackgroundResource(R.drawable.textview_blue_style); + } + } + } diff --git a/app/src/main/java/com/gh/common/util/ShareUtils.java b/app/src/main/java/com/gh/common/util/ShareUtils.java index adbe23fc14..1b18aaddb2 100644 --- a/app/src/main/java/com/gh/common/util/ShareUtils.java +++ b/app/src/main/java/com/gh/common/util/ShareUtils.java @@ -428,7 +428,7 @@ public class ShareUtils { } private void loadBitMap(final String iconUrl, final WXMediaMessage msg, final SendMessageToWX.Req req){ - ImageUtils.getInstance(context).display(iconUrl, new BaseBitmapDataSubscriber() { + ImageUtils.getInstance().display(context, iconUrl, new BaseBitmapDataSubscriber() { @Override protected void onNewResultImpl(Bitmap bitmap) { Bitmap compressBp = compressBitmap(bitmap); @@ -441,7 +441,7 @@ public class ShareUtils { protected void onFailureImpl(DataSource> dataSource) { Utils.log("分享获取bitmap失败"); } - }, context); + }); } //添加背景,防止图片格式为PNG的图片分享出现黑框问题 diff --git a/app/src/main/java/com/gh/gamecenter/NewsSearchActivity.java b/app/src/main/java/com/gh/gamecenter/NewsSearchActivity.java index b612a28c64..dc680d4352 100644 --- a/app/src/main/java/com/gh/gamecenter/NewsSearchActivity.java +++ b/app/src/main/java/com/gh/gamecenter/NewsSearchActivity.java @@ -314,8 +314,8 @@ public class NewsSearchActivity extends BaseActivity { FooterViewHolder viewHolder = (FooterViewHolder) holder; viewHolder.itemView.setPadding(0, 0, 0, 0); if (isNetworkError) { - viewHolder.footerview_progressbar.setVisibility(View.GONE); - viewHolder.footerview_tv_loading.setText("加载失败,点击重试"); + viewHolder.loading.setVisibility(View.GONE); + viewHolder.hint.setText("加载失败,点击重试"); viewHolder.itemView.setClickable(true); viewHolder.itemView.setOnClickListener(new View.OnClickListener() { @Override @@ -326,12 +326,12 @@ public class NewsSearchActivity extends BaseActivity { } }); } else if (isRemove) { - viewHolder.footerview_progressbar.setVisibility(View.GONE); - viewHolder.footerview_tv_loading.setText("加载完毕"); + viewHolder.loading.setVisibility(View.GONE); + viewHolder.hint.setText("加载完毕"); viewHolder.itemView.setClickable(false); } else { - viewHolder.footerview_progressbar.setVisibility(View.VISIBLE); - viewHolder.footerview_tv_loading.setText("加载中..."); + viewHolder.loading.setVisibility(View.VISIBLE); + viewHolder.hint.setText("加载中..."); viewHolder.itemView.setClickable(false); } } diff --git a/app/src/main/java/com/gh/gamecenter/ViewImageActivity.java b/app/src/main/java/com/gh/gamecenter/ViewImageActivity.java index 97a1507c61..08cc354484 100644 --- a/app/src/main/java/com/gh/gamecenter/ViewImageActivity.java +++ b/app/src/main/java/com/gh/gamecenter/ViewImageActivity.java @@ -19,6 +19,7 @@ import com.facebook.drawee.controller.BaseControllerListener; import com.facebook.drawee.drawable.ScalingUtils; import com.facebook.drawee.interfaces.DraweeController; import com.facebook.imagepipeline.core.ImagePipeline; +import com.facebook.imagepipeline.image.ImageInfo; import com.gc.materialdesign.views.ProgressBarCircularIndeterminate; import com.gh.base.BaseActivity; import com.gh.common.util.DisplayUtils; @@ -74,11 +75,10 @@ public class ViewImageActivity extends BaseActivity implements final ZoomSimpleDraweeView imageView = (ZoomSimpleDraweeView) view.findViewById(R.id.viewimage_iv_show); final ProgressBarCircularIndeterminate progressBar = (ProgressBarCircularIndeterminate) view.findViewById(R.id.viewimage_pb_loading); progressBar.setVisibility(View.VISIBLE); - ImageUtils.getInstance(getApplicationContext()).display(newUrls.get(position), urls.get(position), imageView - , new BaseControllerListener(){ + ImageUtils.getInstance().display(imageView, newUrls.get(position), urls.get(position), + new BaseControllerListener(){ @Override - public void onFinalImageSet(String id, Object imageInfo, Animatable animatable) { - super.onFinalImageSet(id, imageInfo, animatable); + public void onFinalImageSet(String id, ImageInfo imageInfo, Animatable animatable) { progressBar.setVisibility(View.GONE); // if (imageInfo == null){ // return; diff --git a/app/src/main/java/com/gh/gamecenter/adapter/ImagePagerAdapter.java b/app/src/main/java/com/gh/gamecenter/adapter/ImagePagerAdapter.java index cb76b0bda1..574e71c596 100644 --- a/app/src/main/java/com/gh/gamecenter/adapter/ImagePagerAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/adapter/ImagePagerAdapter.java @@ -81,7 +81,8 @@ public class ImagePagerAdapter extends RecyclingPagerAdapter { final SlideEntity slideEntity = slideList.get(getPosition(position)); - ImageUtils.getInstance(context).display(slideEntity.getImage(), holder.imageView, R.drawable.preload, context); + ImageUtils.getInstance().display(context.getResources(), holder.imageView, + slideEntity.getImage(), R.drawable.preload); // indicator.setPosition(slideList.size(), getPosition(position)); holder.imageView.setOnClickListener(new View.OnClickListener() { diff --git a/app/src/main/java/com/gh/gamecenter/adapter/SubjectAdapter.java b/app/src/main/java/com/gh/gamecenter/adapter/SubjectAdapter.java index 2b3ee5c194..69b17aab38 100644 --- a/app/src/main/java/com/gh/gamecenter/adapter/SubjectAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/adapter/SubjectAdapter.java @@ -241,8 +241,8 @@ public class SubjectAdapter extends RecyclerView.Adapter list, final int position, int width, int type) { - SimpleDraweeView imageView; + SimpleDraweeView simpleDraweeView; if (type == 0) { - imageView = new SimpleDraweeView(context); + simpleDraweeView = new SimpleDraweeView(context); LinearLayout.LayoutParams lparams = new LinearLayout.LayoutParams( 0, width / 3 - DisplayUtils.dip2px(context, 4)); lparams.setMargins(DisplayUtils.dip2px(context, 2), 0, DisplayUtils.dip2px(context, 2), DisplayUtils.dip2px(context, 4)); lparams.weight = 1; - imageView.setLayoutParams(lparams); - ImageUtils.getInstance(context).display(list.get(position), imageView, ScalingUtils.ScaleType.CENTER_CROP, context); + simpleDraweeView.setLayoutParams(lparams); } else if (type == 1) { - imageView = new SimpleDraweeView(context); + simpleDraweeView = new SimpleDraweeView(context); LinearLayout.LayoutParams lparams = new LinearLayout.LayoutParams(width, width / 2); lparams.setMargins(DisplayUtils.dip2px(context, 2), 0, DisplayUtils.dip2px(context, 2), DisplayUtils.dip2px(context, 4)); - imageView.setLayoutParams(lparams); - ImageUtils.getInstance(context).display(list.get(position), imageView, ScalingUtils.ScaleType.CENTER_CROP, context); + simpleDraweeView.setLayoutParams(lparams); } else { - imageView = new SimpleDraweeView(context); + simpleDraweeView = new SimpleDraweeView(context); LinearLayout.LayoutParams lparams = new LinearLayout.LayoutParams( 0, width / 2 - DisplayUtils.dip2px(context, 4)); lparams.setMargins(DisplayUtils.dip2px(context, 2), 0, DisplayUtils.dip2px(context, 2), DisplayUtils.dip2px(context, 4)); lparams.weight = 1; - imageView.setLayoutParams(lparams); - ImageUtils.getInstance(context).display(list.get(position), imageView, ScalingUtils.ScaleType.CENTER_CROP, context); + simpleDraweeView.setLayoutParams(lparams); } - imageView.setOnClickListener(new View.OnClickListener() { + ImageUtils.getInstance().display(context.getResources(), simpleDraweeView, + ScalingUtils.ScaleType.CENTER_CROP, list.get(position)); + simpleDraweeView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent checkIntent = new Intent(context, ViewImageActivity.class); @@ -676,7 +675,7 @@ public class News1FragmentAdapter extends RecyclerView.Adapter{ @@ -59,12 +62,13 @@ public class News2FragmentAdapter extends RecyclerView.Adapter viewsMap; private List urlList; + private int itemCount; + private boolean isLoading; - private boolean isRemove; + private boolean isOver; private boolean isNetworkError; - public News2FragmentAdapter(News2Fragment fragment, boolean isLoad) { - + public News2FragmentAdapter(News2Fragment fragment) { this.fragment = fragment; this.context = fragment.getActivity(); this.listener = fragment; @@ -73,46 +77,50 @@ public class News2FragmentAdapter extends RecyclerView.Adapter(); urlList = new ArrayList<>(); - isLoading = false; - isRemove = false; - isNetworkError = false; + itemCount = 0; - if (isLoad) { - addList(0); - } + isLoading = false; + isOver = false; + isNetworkError = false; } + // 加载数据 public void addList(final int offset) { if (isLoading) { return; } isLoading = true; - RetrofitManager.getInstance().getZiXun(offset, - new com.gh.gamecenter.retrofit.Response>(){ + RetrofitManager.getApi() + .getZiXun(offset) + .map(new Func1, List>() { + @Override + public List call(List list) { + // 去掉重复数据 + return NewsUtils.removeDuplicateData(newsList, list); + } + }) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response>(){ @Override public void onResponse(List response) { isLoading = false; - int listSize = response.size(); - - // 去除重复数据 - removeDuplicateData(response); - if (response.size() != 0) { + newsList.addAll(response); + itemCount += response.size(); if (!fragment.isHidden() && !fragment.isEverpause()) { - newsList.addAll(response); notifyItemRangeInserted(newsList.size() - response.size(), response.size()); } else { - newsList.addAll(response); notifyDataSetChanged(); } + } else { + isOver = true; + notifyItemChanged(getItemCount() - 1); } - listener.loadDone(); - - if (listSize == 0 || (offset == 0 && listSize < 20)) { - isRemove = true; - notifyItemChanged(getItemCount() - 1); + if (listener != null) { + listener.loadDone(); } //获取新闻阅读量 @@ -124,7 +132,9 @@ public class News2FragmentAdapter extends RecyclerView.Adapter() { -// @Override -// public void onResponse(JSONArray 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 (!fragment.isHidden() && !fragment.isEverpause()) { -// newsList.addAll(list); -// notifyItemRangeInserted(newsList.size() - list.size(), list.size()); -// } else { -// newsList.addAll(list); -// notifyDataSetChanged(); -// } -// } -// -// listener.loadDone(); -// -// if (listSize == 0 || (offset == 0 && listSize < 20)) { -// isRemove = true; -// notifyItemChanged(getItemCount() - 1); -// } -// -// //获取新闻阅读量 -// getNewsViews(list, offset); -// } -// }, 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) { -// listener.loadError(); -// } else { -// Toast.makeText(context, "加载失败,请检查网络状态", Toast.LENGTH_SHORT).show(); -// isNetworkError = true; -// notifyItemChanged(getItemCount() - 1); -// } -// } -// } -// }); -// AppController.addToRequestQueue(request, News2Fragment.TAG); -// } - - private void removeDuplicateData(List list) { - if (newsList == null || newsList.isEmpty()) { - return; - } - String id; - for (int i = 0; i < list.size(); i++) { - id = list.get(i).getId(); - for (NewsEntity newsEntity : newsList) { - if (id.equals(newsEntity.getId())) { - list.remove(i); - i--; - break; - } - } - } - } - + // 获取新闻阅读量 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")); + 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(); + } + }, 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()); } - notifyItemRangeChanged(start, start + list.size() - 1); - } catch (JSONException e) { - e.printStackTrace(); - } - } - }, null); - AppController.addToRequestQueue(request, News2Fragment.TAG); + }); + } + }); } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if (viewType == ItemViewType.NEWS_IMAGE1) { View view = LayoutInflater.from(parent.getContext()).inflate( - R.layout.fm_read_item, parent, false); + R.layout.news_image1_item, parent, false); return new NewsImage1ViewHolder(view); - } else if (viewType == ItemViewType.NEWS_IMAGE3) { - View view = LayoutInflater.from(parent.getContext()).inflate( - R.layout.fm_read2_special1, parent, false); - return new NewsImage3ViewHolder(view); } else if (viewType == ItemViewType.NEWS_IMAGE2) { View view = LayoutInflater.from(parent.getContext()).inflate( - R.layout.fm_read2_special2, parent, false); + R.layout.news_image2_item, parent, false); return new NewsImage2ViewHolder(view); + } else if (viewType == ItemViewType.NEWS_IMAGE3) { + View view = LayoutInflater.from(parent.getContext()).inflate( + R.layout.news_image3_item, parent, false); + return new NewsImage3ViewHolder(view); } else if (viewType == ItemViewType.LOADING) { View view = LayoutInflater.from(parent.getContext()).inflate( R.layout.refresh_footerview, parent, false); @@ -269,17 +208,19 @@ public class News2FragmentAdapter extends RecyclerView.Adapter() { + @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); } - private void setType(TextView textView, String type) { - - ViewGroup.LayoutParams layoutParams = textView.getLayoutParams(); - layoutParams.width = DisplayUtils.dip2px(context,28); - layoutParams.height = DisplayUtils.dip2px(context,17); - textView.setLayoutParams(layoutParams); - - if ("活动".equals(type)){ - textView.setTextColor(Color.WHITE); - textView.setBackgroundResource(R.drawable.textview_orange_style); - } else if ("公告".equals(type)){ - textView.setTextColor(Color.WHITE); - textView.setBackgroundResource(R.drawable.textview_red_style); - } else { - textView.setTextColor(Color.WHITE); - textView.setBackgroundResource(R.drawable.textview_blue_style); - } - textView.setText(type); - } - - public boolean isRemove() { - return isRemove; + public boolean isOver() { + return isOver; } public boolean isLoading() { @@ -590,7 +508,11 @@ public class News2FragmentAdapter extends RecyclerView.Adapter getNewsList() { - return newsList; + public void setNetworkError(boolean networkError) { + isNetworkError = networkError; + } + + public int getNewsListSize() { + return newsList.size(); } } diff --git a/app/src/main/java/com/gh/gamecenter/news/News3Fragment.java b/app/src/main/java/com/gh/gamecenter/news/News3Fragment.java index 3128d5d861..4125307e49 100644 --- a/app/src/main/java/com/gh/gamecenter/news/News3Fragment.java +++ b/app/src/main/java/com/gh/gamecenter/news/News3Fragment.java @@ -1,7 +1,6 @@ package com.gh.gamecenter.news; import android.os.Bundle; -import android.os.Handler; import android.support.annotation.Nullable; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.widget.LinearLayoutManager; @@ -15,137 +14,110 @@ import com.gh.gamecenter.R; import com.gh.gamecenter.eventbus.EBNetworkState; import com.gh.gamecenter.eventbus.EBUISwitch; +import butterknife.BindView; +import butterknife.OnClick; + /** * Created by khy on 2016/6/29. + * 资讯-原创界面 */ public class News3Fragment extends BaseFragment implements SwipeRefreshLayout.OnRefreshListener { - public static final String TAG = News3Fragment.class.getSimpleName(); - private SwipeRefreshLayout original_swipe_refresh; - private RecyclerView original_list; + @BindView(R.id.news3_srl_refresh) SwipeRefreshLayout refreshLayout; + @BindView(R.id.news3_rv_list) RecyclerView recyclerView; + @BindView(R.id.news3_pb_loading) ProgressBarCircularIndeterminate loadingLayout; + @BindView(R.id.reuse_no_connection) LinearLayout noConnectionLayout; + private LinearLayoutManager layoutManager; private News3FragmentAdapter adapter; - private ProgressBarCircularIndeterminate original_pb_loading; - private LinearLayout reuse_no_connection; - private boolean isEverpause; + Runnable runnable = new Runnable() { + @Override + public void run() { + adapter = new News3FragmentAdapter(News3Fragment.this); + recyclerView.setAdapter(adapter); + adapter.addList(0); + } + }; @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); - init(R.layout.fragment_original); + init(R.layout.fragment_news3, false); - isEverpause = false; + refreshLayout.setColorSchemeResources(R.color.theme); + refreshLayout.setOnRefreshListener(this); - original_swipe_refresh.setColorSchemeResources(R.color.theme); - original_swipe_refresh.setOnRefreshListener(this); - - reuse_no_connection.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - original_swipe_refresh.setRefreshing(true); - original_list.setVisibility(View.VISIBLE); - original_pb_loading.setVisibility(View.VISIBLE); - reuse_no_connection.setVisibility(View.GONE); - handler.postDelayed(runnable, 1000); - } - }); - - original_list.setHasFixedSize(true); + recyclerView.setHasFixedSize(true); layoutManager = new LinearLayoutManager(getActivity()); - original_list.setLayoutManager(layoutManager); - adapter = new News3FragmentAdapter(News3Fragment.this, false); - original_list.setAdapter(adapter); - original_list.setOnScrollListener(new RecyclerView.OnScrollListener() { + recyclerView.setLayoutManager(layoutManager); + adapter = new News3FragmentAdapter(News3Fragment.this); + recyclerView.setAdapter(adapter); + recyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); if (newState == RecyclerView.SCROLL_STATE_IDLE && layoutManager.findLastVisibleItemPosition() + 1 == adapter.getItemCount()) { - if (!adapter.isRemove() && !adapter.isLoading() && !adapter.isNetworkError()) { - adapter.addList(adapter.getNewsList().size()); + if (!adapter.isOver() && !adapter.isLoading() && !adapter.isNetworkError()) { + adapter.addList(adapter.getNewsListSize()); } } } }); } - @Override - public void loadDone() { - if (original_swipe_refresh != null && original_swipe_refresh.isRefreshing()) { - original_swipe_refresh.setRefreshing(false); - } - if (original_pb_loading != null && original_pb_loading.getVisibility() == View.VISIBLE) { - original_pb_loading.setVisibility(View.GONE); - } + @OnClick(R.id.reuse_no_connection) + public void reconnection() { // 重新连接 + refreshLayout.setRefreshing(true); + recyclerView.setVisibility(View.VISIBLE); + loadingLayout.setVisibility(View.VISIBLE); + noConnectionLayout.setVisibility(View.GONE); + handler.postDelayed(runnable, 1000); } @Override - public void loadError() { - if (original_swipe_refresh != null && original_swipe_refresh.isRefreshing()) { - original_swipe_refresh.setRefreshing(false); - } - if (original_pb_loading != null && original_pb_loading.getVisibility() == View.VISIBLE) { - original_pb_loading.setVisibility(View.GONE); - } - original_list.setVisibility(View.GONE); - reuse_no_connection.setVisibility(View.VISIBLE); + public void loadDone() { // 数据加载成功回调 + refreshLayout.setRefreshing(false); + loadingLayout.setVisibility(View.GONE); + } + + @Override + public void loadError() { // 数据加载失败回调 + refreshLayout.setRefreshing(false); + loadingLayout.setVisibility(View.GONE); + recyclerView.setVisibility(View.GONE); + noConnectionLayout.setVisibility(View.VISIBLE); } //连接上网络事件 public void onEventMainThread(EBNetworkState busNetworkState) { if (busNetworkState.isNetworkConnected()) { - if (reuse_no_connection.getVisibility() == View.VISIBLE) { - original_swipe_refresh.setRefreshing(true); - original_list.setVisibility(View.VISIBLE); - original_pb_loading.setVisibility(View.GONE); - reuse_no_connection.setVisibility(View.GONE); - handler.postDelayed(runnable, 1000); + if (noConnectionLayout.getVisibility() == View.VISIBLE) { + reconnection(); + } else if (adapter.isNetworkError()) { + adapter.setNetworkError(false); + adapter.notifyItemChanged(adapter.getItemCount() - 1); + adapter.addList(adapter.getNewsListSize()); } } } - //Fragment界面切换事件 + // 资讯Fragment界面切换事件 public void onEventMainThread(EBUISwitch busNine) { if ("NewsFragment".equals(busNine.getFrom())) { if (busNine.getPosition() == 2) { - if (original_pb_loading.getVisibility() == View.VISIBLE) { + if (loadingLayout.getVisibility() == View.VISIBLE) { adapter.addList(0); } } } } - private Handler handler = new Handler(); - - Runnable runnable = new Runnable() { - @Override - public void run() { - adapter = new News3FragmentAdapter(News3Fragment.this, true); - original_list.setAdapter(adapter); - } - }; - @Override - public void onRefresh() { + public void onRefresh() { // 刷新 handler.postDelayed(runnable, 1000); } - public boolean isEverpause() { - return isEverpause; - } - - @Override - public void onPause() { - super.onPause(); - isEverpause = true; - } - - @Override - public void onResume() { - super.onResume(); - isEverpause = false; - } - } diff --git a/app/src/main/java/com/gh/gamecenter/news/News3FragmentAdapter.java b/app/src/main/java/com/gh/gamecenter/news/News3FragmentAdapter.java index eab8512df5..4153148bcd 100644 --- a/app/src/main/java/com/gh/gamecenter/news/News3FragmentAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/news/News3FragmentAdapter.java @@ -1,7 +1,6 @@ package com.gh.gamecenter.news; import android.content.Context; -import android.graphics.Color; import android.support.v4.util.ArrayMap; import android.support.v7.widget.RecyclerView; import android.util.DisplayMetrics; @@ -9,16 +8,11 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; -import android.widget.TextView; 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.DataUtils; @@ -36,24 +30,28 @@ import com.gh.gamecenter.adapter.viewholder.NewsImage3ViewHolder; import com.gh.gamecenter.entity.NewsEntity; import com.gh.gamecenter.listener.OnCallBackListener; import com.gh.gamecenter.manager.DataCollectionManager; +import com.gh.gamecenter.retrofit.RetrofitManager; 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 org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.io.File; -import java.lang.reflect.Type; import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import java.util.Locale; import java.util.Map; +import rx.android.schedulers.AndroidSchedulers; +import rx.functions.Func1; +import rx.schedulers.Schedulers; + /** * Created by khy on 2016/6/30. + * 资讯-原创-数据适配器 */ public class News3FragmentAdapter extends RecyclerView.Adapter{ @@ -66,11 +64,10 @@ public class News3FragmentAdapter extends RecyclerView.Adapter urlList; private boolean isLoading; - private boolean isRemove; + private boolean isOver; private boolean isNetworkError; - public News3FragmentAdapter(News3Fragment fragment, boolean isLoad) { - + public News3FragmentAdapter(News3Fragment fragment) { this.fragment = fragment; this.context = fragment.getActivity(); this.listener = fragment; @@ -80,12 +77,8 @@ public class News3FragmentAdapter extends RecyclerView.Adapter(); isLoading = false; - isRemove = false; + isOver = false; isNetworkError = false; - - if (isLoad) { - addList(0); - } } public void addList(final int offset) { @@ -93,77 +86,58 @@ public class News3FragmentAdapter extends RecyclerView.Adapter() { + RetrofitManager.getApi() + .getYuanChuang(offset) + .map(new Func1, List>() { @Override - public void onResponse(JSONArray response) { + public List call(List list) { + // 去掉重复数据 + return NewsUtils.removeDuplicateData(newsList, list); + } + }) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new com.gh.gamecenter.retrofit.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) { if (!fragment.isHidden() && !fragment.isEverpause()) { - newsList.addAll(list); - notifyItemRangeInserted(newsList.size() - list.size(), list.size()); + newsList.addAll(response); + notifyItemRangeInserted(newsList.size() - response.size(), response.size()); } else { - newsList.addAll(list); + newsList.addAll(response); notifyDataSetChanged(); } - } - - listener.loadDone(); - - if (listSize == 0 || (offset == 0 && listSize < 20)) { - isRemove = true; + } else { + isOver = true; notifyItemChanged(getItemCount() - 1); } - //获取新闻阅读量 - getNewsViews(list, offset); + if (listener != null) { + listener.loadDone(); + } + + // 获取新闻阅读量 + getNewsViews(response, offset); } - }, new Response.ErrorListener() { + @Override - public void onErrorResponse(VolleyError error) { + public void onFailure(Throwable e) { isLoading = false; - // 无网络连接和访问超时 - if (error.getClass().equals(NoConnectionError.class) - || error.getClass().equals(TimeoutError.class)) { - if (offset == 0) { + // 网络错误 + if (offset == 0) { + if (listener != null) { listener.loadError(); - } else { - Toast.makeText(context, "加载失败,请检查网络状态", Toast.LENGTH_SHORT).show(); - isNetworkError = true; - notifyItemChanged(getItemCount() - 1); } + } else { + Toast.makeText(context, "加载失败,请检查网络状态", Toast.LENGTH_SHORT).show(); + isNetworkError = true; + notifyItemChanged(getItemCount() - 1); } } }); - AppController.addToRequestQueue(request, News3Fragment.TAG); - } - - private void removeDuplicateData(List list) { - if (newsList == null || newsList.isEmpty()) { - return; - } - String id; - for (int i = 0; i < list.size(); i++) { - id = list.get(i).getId(); - for (NewsEntity newsEntity : newsList) { - if (id.equals(newsEntity.getId())) { - list.remove(i); - i--; - break; - } - } - } } private void getNewsViews(final List list, final int start) { @@ -195,22 +169,22 @@ public class News3FragmentAdapter extends RecyclerView.Adapter getNewsList() { - return newsList; + public void setNetworkError(boolean networkError) { + isNetworkError = networkError; + } + + public int getNewsListSize() { + return newsList.size(); } } diff --git a/app/src/main/java/com/gh/gamecenter/news/News4Fragment.java b/app/src/main/java/com/gh/gamecenter/news/News4Fragment.java index 3f24c4348e..4f20c0712c 100644 --- a/app/src/main/java/com/gh/gamecenter/news/News4Fragment.java +++ b/app/src/main/java/com/gh/gamecenter/news/News4Fragment.java @@ -41,7 +41,7 @@ public class News4Fragment extends BaseFragment implements SwipeRefreshLayout.On public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); - init(R.layout.fragment_news3); + init(R.layout.fragment_news4); news_swipe_refresh.setColorSchemeResources(R.color.theme); news_swipe_refresh.setOnRefreshListener(this); 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 f97ba2e32a..83a26d24a9 100644 --- a/app/src/main/java/com/gh/gamecenter/retrofit/ApiService.java +++ b/app/src/main/java/com/gh/gamecenter/retrofit/ApiService.java @@ -16,9 +16,12 @@ import rx.Observable; */ public interface ApiService { - @GET("zixun/zixun?limit=20") // 资讯 + @GET("zixun/zixun?limit=20") // 获取资讯-资讯 Observable> getZiXun(@Query("offset") int offset); + @GET("zixun/yuanchuang?limit=20") // 获取资讯-原创 + Observable> getYuanChuang(@Query("offset") int offset); + @GET("support/time/current") Observable getTime(); diff --git a/app/src/main/java/com/gh/gamecenter/retrofit/ApiServiceImpl.java b/app/src/main/java/com/gh/gamecenter/retrofit/ApiServiceImpl.java new file mode 100644 index 0000000000..e14c8723e8 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/retrofit/ApiServiceImpl.java @@ -0,0 +1,46 @@ +package com.gh.gamecenter.retrofit; + +import com.gh.gamecenter.entity.GameEntity; +import com.gh.gamecenter.entity.NewsEntity; + +import java.util.List; + +import rx.Observable; +import rx.Subscriber; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * Created by LGT on 2016/11/9. + */ +public class ApiServiceImpl { + + private ApiService apiService; + + public ApiServiceImpl(ApiService apiService) { + this.apiService = apiService; + } + + private void subscribe(Observable observable, Subscriber subscriber) { + observable.subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(subscriber); + } + + public Observable> getZiXun(int offset) { + return apiService.getZiXun(offset); + } + + public Observable> getYuanChuang(int offset) { + return apiService.getYuanChuang(offset); + } + + public void getTime(StringResponse subscriber) { + subscribe(apiService.getTime(), subscriber); + } + + public void getGameDigest(String game_id, Response subscriber) { + subscribe(apiService.getGameDigest(game_id), subscriber); + } + +} diff --git a/app/src/main/java/com/gh/gamecenter/retrofit/DataService.java b/app/src/main/java/com/gh/gamecenter/retrofit/DataService.java new file mode 100644 index 0000000000..c9a9a6fa42 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/retrofit/DataService.java @@ -0,0 +1,25 @@ +package com.gh.gamecenter.retrofit; + +import com.gh.gamecenter.entity.ViewsEntity; + +import java.util.List; + +import okhttp3.ResponseBody; +import retrofit2.http.GET; +import retrofit2.http.POST; +import retrofit2.http.Path; +import retrofit2.http.Query; +import rx.Observable; + +/** + * Created by LGT on 2016/11/9. + */ +public interface DataService { + + @GET("v1d46/news/{ids}/visit") // 获取新闻阅读量 + Observable> getNewsViews(@Path("ids") String ids); + + @POST("news/stat") // 统计新闻阅读量 + Observable postNewsViews(@Query("news_id") String news_id); + +} diff --git a/app/src/main/java/com/gh/gamecenter/retrofit/DataServiceImpl.java b/app/src/main/java/com/gh/gamecenter/retrofit/DataServiceImpl.java new file mode 100644 index 0000000000..a0e03e71be --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/retrofit/DataServiceImpl.java @@ -0,0 +1,37 @@ +package com.gh.gamecenter.retrofit; + +import com.gh.gamecenter.entity.ViewsEntity; + +import java.util.List; + +import rx.Observable; +import rx.Subscriber; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * Created by LGT on 2016/11/9. + */ +public class DataServiceImpl { + + private DataService dataService; + + public DataServiceImpl(DataService dataService) { + this.dataService = dataService; + } + + private void subscribe(Observable observable, Subscriber subscriber) { + observable.subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(subscriber); + } + + public void getNewsViews(String ids, Response> subscriber) { + subscribe(dataService.getNewsViews(ids), subscriber); + } + + public void postNewsViews(String news_id, JSONObjectResponse subscriber) { + subscribe(dataService.postNewsViews(news_id), subscriber); + } + +} diff --git a/app/src/main/java/com/gh/gamecenter/retrofit/ObservableUtil.java b/app/src/main/java/com/gh/gamecenter/retrofit/ObservableUtil.java new file mode 100644 index 0000000000..3d9a7b1261 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/retrofit/ObservableUtil.java @@ -0,0 +1,45 @@ +package com.gh.gamecenter.retrofit; + +import rx.Observable; +import rx.android.schedulers.AndroidSchedulers; +import rx.functions.Action1; +import rx.schedulers.Schedulers; + +/** + * Created by LGT on 2016/11/9. + */ +public class ObservableUtil { + + // 用于计算任务,如事件循环或和回调处理 + public static void computation(Observable.OnSubscribe onSubscribe, Action1 action1) { + if (action1 == null) { + action1 = new Action1() { + @Override + public void call(T t) { + + } + }; + } + Observable.create(onSubscribe) + .subscribeOn(Schedulers.computation()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(action1); + } + + // 用于IO密集型任务,如异步阻塞IO操作 + public static void io(Observable.OnSubscribe onSubscribe, Action1 action1) { + if (action1 == null) { + action1 = new Action1() { + @Override + public void call(T t) { + + } + }; + } + Observable.create(onSubscribe) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(action1); + } + +} diff --git a/app/src/main/java/com/gh/gamecenter/retrofit/OkHttpInterceptor.java b/app/src/main/java/com/gh/gamecenter/retrofit/OkHttpInterceptor.java index 4040e9ed37..a20ef18050 100644 --- a/app/src/main/java/com/gh/gamecenter/retrofit/OkHttpInterceptor.java +++ b/app/src/main/java/com/gh/gamecenter/retrofit/OkHttpInterceptor.java @@ -44,10 +44,6 @@ public class OkHttpInterceptor implements Interceptor { Response response = chain.proceed(request); - // log 打印 - Utils.log(String.format("Interceptor Received response for %s in %n%s", - response.request().url(), response.headers())); - // 去除timestamp拿缓存 url = response.request().url().toString(); if (response.code() == 504 && url.contains("timestamp")) { @@ -62,6 +58,10 @@ public class OkHttpInterceptor implements Interceptor { } } + // log 打印 + Utils.log(String.format("Interceptor Received response for %s in %n%s", + response.request().url(), response.headers())); + return response; } diff --git a/app/src/main/java/com/gh/gamecenter/retrofit/RetrofitManager.java b/app/src/main/java/com/gh/gamecenter/retrofit/RetrofitManager.java index b3e7032200..bb371dab88 100644 --- a/app/src/main/java/com/gh/gamecenter/retrofit/RetrofitManager.java +++ b/app/src/main/java/com/gh/gamecenter/retrofit/RetrofitManager.java @@ -3,12 +3,9 @@ package com.gh.gamecenter.retrofit; import com.gh.base.AppController; import com.gh.common.constant.Config; import com.gh.common.util.FileUtils; -import com.gh.gamecenter.entity.GameEntity; -import com.gh.gamecenter.entity.NewsEntity; import java.io.File; import java.io.IOException; -import java.util.List; import java.util.concurrent.TimeUnit; import okhttp3.Cache; @@ -17,10 +14,6 @@ import okhttp3.internal.Util; import retrofit2.Retrofit; import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory; import retrofit2.converter.gson.GsonConverterFactory; -import rx.Observable; -import rx.Subscriber; -import rx.android.schedulers.AndroidSchedulers; -import rx.schedulers.Schedulers; /** * Created by LGT on 2016/11/7. @@ -40,7 +33,16 @@ public class RetrofitManager { return mInstance; } - private ApiService apiService; + public static ApiServiceImpl getApi() { + return getInstance().getApiServiceImpl(); + } + + public static DataServiceImpl getData() { + return getInstance().getDataServiceImpl(); + } + + private ApiServiceImpl apiServiceImpl; + private DataServiceImpl dataServiceImpl; private String cachePath; private RetrofitManager() { @@ -53,35 +55,31 @@ public class RetrofitManager { .connectTimeout(5, TimeUnit.SECONDS) .cache(cache) .build(); - apiService = new Retrofit.Builder() + ApiService apiService = new Retrofit.Builder() .client(okHttpClient) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .baseUrl(Config.HOST) .build() .create(ApiService.class); + this.apiServiceImpl = new ApiServiceImpl(apiService); + + DataService dataService = new Retrofit.Builder() + .client(okHttpClient) + .addConverterFactory(GsonConverterFactory.create()) + .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) + .baseUrl(Config.DATA_HOST) + .build() + .create(DataService.class); + this.dataServiceImpl = new DataServiceImpl(dataService); } - public ApiService getApiService() { - return apiService; + public ApiServiceImpl getApiServiceImpl() { + return apiServiceImpl; } - private void subscribe(Observable observable, Subscriber subscriber) { - observable.subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(subscriber); - } - - public void getZiXun(int offset, Response> subscriber) { - subscribe(apiService.getZiXun(offset), subscriber); - } - - public void getTime(StringResponse subscriber) { - subscribe(apiService.getTime(), subscriber); - } - - public void getGameDigest(String game_id, Response subscriber) { - subscribe(apiService.getGameDigest(game_id), subscriber); + public DataServiceImpl getDataServiceImpl() { + return dataServiceImpl; } // 根据url获取缓存数据 @@ -111,7 +109,7 @@ public class RetrofitManager { } // 根据url修改对应的okhttp的缓存 - public void modifyCache(String url, byte[] data) { + public void updateCache(String url, byte[] data) { if (cachePath == null || url == null || data == null) { return; } diff --git a/app/src/main/res/layout/fm_search.xml b/app/src/main/res/layout/fm_search.xml index 66f66bc847..601afa657a 100644 --- a/app/src/main/res/layout/fm_search.xml +++ b/app/src/main/res/layout/fm_search.xml @@ -19,14 +19,14 @@ android:orientation="horizontal" > + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_original.xml b/app/src/main/res/layout/fragment_news2.xml similarity index 81% rename from app/src/main/res/layout/fragment_original.xml rename to app/src/main/res/layout/fragment_news2.xml index fa510777c5..6f6e27f4c6 100644 --- a/app/src/main/res/layout/fragment_original.xml +++ b/app/src/main/res/layout/fragment_news2.xml @@ -4,24 +4,24 @@ android:layout_height="match_parent" > - + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_news3.xml b/app/src/main/res/layout/fragment_news3.xml index d7b828806b..60bab443c9 100644 --- a/app/src/main/res/layout/fragment_news3.xml +++ b/app/src/main/res/layout/fragment_news3.xml @@ -4,40 +4,19 @@ android:layout_height="match_parent" > + android:layout_height="wrap_content"> - - - - - - @@ -11,12 +9,33 @@ android:layout_height="match_parent" > + android:layout_height="match_parent"> + + + + + - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/fm_read_item.xml b/app/src/main/res/layout/news_image1_item.xml similarity index 84% rename from app/src/main/res/layout/fm_read_item.xml rename to app/src/main/res/layout/news_image1_item.xml index a53a17a0f2..c37199e78e 100644 --- a/app/src/main/res/layout/fm_read_item.xml +++ b/app/src/main/res/layout/news_image1_item.xml @@ -14,7 +14,7 @@ app:bottom="8dp"> @@ -25,7 +25,7 @@ android:layout_marginLeft="10dp"> diff --git a/app/src/main/res/layout/fm_read2_special2.xml b/app/src/main/res/layout/news_image2_item.xml similarity index 79% rename from app/src/main/res/layout/fm_read2_special2.xml rename to app/src/main/res/layout/news_image2_item.xml index 199e7406db..04ed04d9d3 100644 --- a/app/src/main/res/layout/fm_read2_special2.xml +++ b/app/src/main/res/layout/news_image2_item.xml @@ -14,7 +14,7 @@ app:bottom="8dp"> diff --git a/app/src/main/res/layout/fm_read2_special1.xml b/app/src/main/res/layout/news_image3_item.xml similarity index 81% rename from app/src/main/res/layout/fm_read2_special1.xml rename to app/src/main/res/layout/news_image3_item.xml index 02b09a44e7..3025ad997e 100644 --- a/app/src/main/res/layout/fm_read2_special1.xml +++ b/app/src/main/res/layout/news_image3_item.xml @@ -15,7 +15,7 @@ app:bottom="8dp"> - + diff --git a/app/src/main/res/layout/refresh_footerview.xml b/app/src/main/res/layout/refresh_footerview.xml index 092e016a86..f9c29815be 100644 --- a/app/src/main/res/layout/refresh_footerview.xml +++ b/app/src/main/res/layout/refresh_footerview.xml @@ -7,7 +7,7 @@ android:paddingBottom="8dp"> #FF6A28 - #fda34d + #FDA34D - #1ba4fc + #1BA4FC - #d63338 + #D63338 - #fda34d + #FDA34D - #2ec991 + #2EC991 - #ececec + #ECECEC #30000000