Selaa lähdekoodia

支持推送跳转发现中心;
游戏详情界面基本完成

zengjiebin 7 vuotta sitten
vanhempi
commit
16b0294012
39 muutettua tiedostoa jossa 931 lisäystä ja 205 poistoa
  1. 50 0
      app/src/main/java/com/sheep/gamegroup/absBase/BaseRefreshLoadMoreFragment.java
  2. 13 2
      app/src/main/java/com/sheep/gamegroup/model/api/ApiService.java
  3. 7 7
      app/src/main/java/com/sheep/gamegroup/model/entity/FindItem.java
  4. 3 3
      app/src/main/java/com/sheep/gamegroup/model/entity/FindTag.java
  5. 9 0
      app/src/main/java/com/sheep/gamegroup/model/entity/GameApp.java
  6. 10 0
      app/src/main/java/com/sheep/gamegroup/model/entity/GameEntity.java
  7. 23 4
      app/src/main/java/com/sheep/gamegroup/model/entity/GameInfoList.java
  8. 12 0
      app/src/main/java/com/sheep/gamegroup/model/entity/ShowAll.java
  9. 37 29
      app/src/main/java/com/sheep/gamegroup/util/CommonUtil.java
  10. 7 8
      app/src/main/java/com/sheep/gamegroup/util/Jump2View.java
  11. 19 0
      app/src/main/java/com/sheep/gamegroup/util/ListUtil.java
  12. 43 24
      app/src/main/java/com/sheep/gamegroup/util/TextViewUtil.java
  13. 5 5
      app/src/main/java/com/sheep/gamegroup/view/activity/ActFindInformation.java
  14. 50 3
      app/src/main/java/com/sheep/gamegroup/view/activity/ActGcGameAppDetail.java
  15. 2 3
      app/src/main/java/com/sheep/gamegroup/view/activity/ActMain.java
  16. 7 0
      app/src/main/java/com/sheep/gamegroup/view/activity/MiddleAct.java
  17. 47 0
      app/src/main/java/com/sheep/gamegroup/view/adapter/AdpGcGameAppActivityRecommend.java
  18. 49 0
      app/src/main/java/com/sheep/gamegroup/view/adapter/AdpGcGameAppArticleRecommend.java
  19. 81 0
      app/src/main/java/com/sheep/gamegroup/view/adapter/AdpGcGameAppGiftBag.java
  20. 6 5
      app/src/main/java/com/sheep/gamegroup/view/adapter/AdpGcGameAppInfoList.java
  21. 8 46
      app/src/main/java/com/sheep/gamegroup/view/fragment/BaseListFragment3.java
  22. 6 6
      app/src/main/java/com/sheep/gamegroup/view/fragment/FgtFind.java
  23. 10 10
      app/src/main/java/com/sheep/gamegroup/view/fragment/FgtFindChild.java
  24. 21 2
      app/src/main/java/com/sheep/gamegroup/view/fragment/FgtGcGameAppComment.java
  25. 84 34
      app/src/main/java/com/sheep/gamegroup/view/fragment/FgtGcGameAppDetail.java
  26. 107 4
      app/src/main/java/com/sheep/gamegroup/view/fragment/FgtGcGameAppWelfare.java
  27. 3 0
      app/src/main/java/com/sheep/gamegroup/view/fragment/FgtUserCommentDetail.java
  28. 11 0
      app/src/main/res/color/selector_color_stoke_main_btn.xml
  29. 2 2
      app/src/main/res/layout/act_game_make_money.xml
  30. 21 4
      app/src/main/res/layout/act_gc_game_app_detail.xml
  31. 5 1
      app/src/main/res/layout/act_main.xml
  32. 5 0
      app/src/main/res/layout/common_rv.xml
  33. 1 1
      app/src/main/res/layout/fgt_find.xml
  34. 1 0
      app/src/main/res/layout/header_user_comment_detail.xml
  35. 30 0
      app/src/main/res/layout/include_empty_view.xml
  36. 27 0
      app/src/main/res/layout/item_activity_recommend.xml
  37. 50 0
      app/src/main/res/layout/item_article_recommend.xml
  38. 57 0
      app/src/main/res/layout/item_gift_bag.xml
  39. 2 2
      app/src/main/res/layout/try_makemoney_act_layout.xml

+ 50 - 0
app/src/main/java/com/sheep/gamegroup/absBase/BaseRefreshLoadMoreFragment.java

@@ -0,0 +1,50 @@
+package com.sheep.gamegroup.absBase;
+
+import com.scwang.smartrefresh.layout.SmartRefreshLayout;
+import com.sheep.jiuyan.samllsheep.base.BaseFragment;
+
+/**
+ * Created by realicing on 2018/11/5.
+ * realicing@sina.com
+ */
+public abstract class BaseRefreshLoadMoreFragment extends BaseFragment implements IRefresh, ILoadMore{
+
+    protected SmartRefreshLayout smartRefreshLayout;
+
+    public SmartRefreshLayout getSmartRefreshLayout() {
+        return smartRefreshLayout;
+    }
+
+    public void setSmartRefreshLayout(SmartRefreshLayout smartRefreshLayout) {
+        this.smartRefreshLayout = smartRefreshLayout;
+    }
+
+    protected boolean noMore = false;
+
+    public boolean isNoMore() {
+        return noMore;
+    }
+    //设置是否还有更多数据
+    public void setNoMore(boolean noMore) {
+        this.noMore = noMore;
+        setSmartRefreshLayoutNoMore(noMore);
+    }
+    //加载完成时更新header或footer
+    protected void refreshOrLoadMoreComplete() {
+        if (smartRefreshLayout != null && getUserVisibleHint()) {
+            smartRefreshLayout.finishRefresh();
+            smartRefreshLayout.finishLoadMore();
+        }
+    }
+    //设置是否还有更多数据
+    protected void setSmartRefreshLayoutNoMore(boolean noMore) {
+        if (smartRefreshLayout != null && getUserVisibleHint()) {
+            smartRefreshLayout.setNoMoreData(noMore);
+        }
+    }
+    @Override
+    public void setUserVisibleHint(boolean isVisibleToUser) {
+        super.setUserVisibleHint(isVisibleToUser);
+        setSmartRefreshLayoutNoMore(noMore);
+    }
+}

+ 13 - 2
app/src/main/java/com/sheep/gamegroup/model/api/ApiService.java

@@ -1063,7 +1063,18 @@ public interface ApiService {
      */
     @GET("app/find/detail/hot_games")
     Observable<BaseMessage> getDetailHotGames(@Query("app_id") int app_id);
-
+    /**
+     * 玩转游戏-游戏详情 活动推荐
+     * app_id 应用的id
+     */
+    @GET("app/find/detail/activity_recommend")
+    Observable<BaseMessage> getDetailActivityRecommend(@Query("app_id") int app_id);
+    /**
+     * 玩转游戏-游戏详情 文章推荐
+     * app_id 应用的id
+     */
+    @GET("app/find/detail/article_recommend")
+    Observable<BaseMessage> getDetailArticleRecommend(@Query("app_id") int app_id);
 
     //---------------------------start game_user------------------------------
 
@@ -1105,7 +1116,7 @@ public interface ApiService {
      * focus_game_id  * integer (query)	关注应用id
      */
     @POST("app/game_user/focus_game")
-    Observable<BaseMessage> postGameUserFocusGame(@Query("focus_game_id ") int focus_game_id);
+    Observable<BaseMessage> postGameUserFocusGame(@Query("focus_game_id") int focus_game_id);
 
     /**
      * 关注用户

+ 7 - 7
app/src/main/java/com/sheep/gamegroup/model/entity/FindItem.java

@@ -12,10 +12,10 @@ import java.util.List;
  * realicing@sina.com
  *
  */
-public class FindItem {
+public class Article {
     private int updated_at;
 
-    private List<FindTag> tages ;
+    private List<ArticleTag> tages ;
 
     private int recommend_type;//咨询类型1:游戏 2:任务
 
@@ -60,10 +60,10 @@ public class FindItem {
     public int getUpdated_at(){
         return this.updated_at;
     }
-    public void setTages(List<FindTag> tages){
+    public void setTages(List<ArticleTag> tages){
         this.tages = tages;
     }
-    public List<FindTag> getTages(){
+    public List<ArticleTag> getTages(){
         return this.tages;
     }
     public void setRecommend_type(int recommend_type){
@@ -180,7 +180,7 @@ public class FindItem {
 
     @Override
     public boolean equals(Object obj) {
-        return obj instanceof FindItem && ((FindItem) obj).getId() == id;
+        return obj instanceof Article && ((Article) obj).getId() == id;
     }
 
     //是否是游戏,游戏要显示下载游戏与评分
@@ -190,10 +190,10 @@ public class FindItem {
 
     //清除空的或者没有名字的标签
     public void removeNullTag() {
-        ListUtil.removeItem(tages, new ListUtil.CallBack<FindTag, Boolean>(){
+        ListUtil.removeItem(tages, new ListUtil.CallBack<ArticleTag, Boolean>(){
 
             @Override
-            public Boolean call(FindTag findTag) {
+            public Boolean call(ArticleTag findTag) {
                 return findTag == null || TextUtils.isEmpty(findTag.getName());
             }
         });

+ 3 - 3
app/src/main/java/com/sheep/gamegroup/model/entity/FindTag.java

@@ -4,7 +4,7 @@ package com.sheep.gamegroup.model.entity;
  * Created by realicing on 2018/6/27.
  * realicing@sina.com
  */
-public class FindTag {
+public class ArticleTag {
 
     private int updated_at;
 
@@ -18,10 +18,10 @@ public class FindTag {
 
     private int created_at;
 
-    public FindTag() {
+    public ArticleTag() {
     }
 
-    public FindTag(int id, String name) {
+    public ArticleTag(int id, String name) {
         this.id = id;
         this.name = name;
     }

+ 9 - 0
app/src/main/java/com/sheep/gamegroup/model/entity/GameApp.java

@@ -76,6 +76,8 @@ public class GameApp implements IDownload, Serializable {
     private int IsPlay;
 
     private int IsHot;
+    //总评论数
+    private int comment_num;
 
     public int getAvailable_receive() {
         return available_receive;
@@ -333,6 +335,13 @@ public class GameApp implements IDownload, Serializable {
         return this.IsHot;
     }
 
+    public void setComment_num(int comment_num) {
+        this.comment_num = comment_num;
+    }
+
+    public int getComment_num() {
+        return comment_num;
+    }
 
     @Override
     public String getPackage_names() {

+ 10 - 0
app/src/main/java/com/sheep/gamegroup/model/entity/GameEntity.java

@@ -30,6 +30,9 @@ public class GameEntity implements Serializable {
 
     private List<GiftBagApp> has_gift_bag;
 
+    //    IsFocusGame bool                `json:"is_focus_game" description:"是否关注游戏"`
+    private boolean is_focus_game;//是否已经关注了游戏
+
     public TaskReleaseEty getRelease_task() {
         return release_task;
     }
@@ -102,6 +105,13 @@ public class GameEntity implements Serializable {
         this.status = status;
     }
 
+    public boolean isIs_focus_game() {
+        return is_focus_game;
+    }
+
+    public void setIs_focus_game(boolean is_focus_game) {
+        this.is_focus_game = is_focus_game;
+    }
 
     @Override
     public boolean equals(Object obj) {

+ 23 - 4
app/src/main/java/com/sheep/gamegroup/model/entity/GameInfoList.java

@@ -1,5 +1,6 @@
 package com.sheep.gamegroup.model.entity;
 
+import android.support.annotation.NonNull;
 import android.support.v7.widget.LinearLayoutManager;
 import android.support.v7.widget.RecyclerView;
 import android.view.View;
@@ -11,17 +12,29 @@ import com.sheep.jiuyan.samllsheep.SheepApp;
  * Created by realicing on 2018/11/1.
  * realicing@sina.com
  */
-public class GameInfoList {
+public class GameInfoList implements Comparable<GameInfoList> {
     public GameInfoList(String name, RecyclerView.Adapter adapter) {
         this.name = name;
         this.adapter = adapter;
     }
+
     public GameInfoList(String name, RecyclerView.Adapter adapter, View.OnClickListener onClickListener) {
         this.name = name;
         this.onClickListener = onClickListener;
         this.adapter = adapter;
     }
 
+    private int sort;
+
+    public int getSort() {
+        return sort;
+    }
+
+    public GameInfoList setSort(int sort) {
+        this.sort = sort;
+        return this;
+    }
+
     private String name;
     private View.OnClickListener onClickListener;
     private RecyclerView.Adapter adapter;
@@ -43,7 +56,7 @@ public class GameInfoList {
     }
 
     public void setMoreViewOnClickListener(TextView textView) {
-        if(textView != null && onClickListener != null){
+        if (textView != null && onClickListener != null) {
             textView.setOnClickListener(onClickListener);
         }
     }
@@ -55,10 +68,11 @@ public class GameInfoList {
     private RecyclerView.LayoutManager layoutManager;
 
     //设置水平滑动
-    public GameInfoList setHorizontal(){
+    public GameInfoList setHorizontal() {
         layoutManager = new LinearLayoutManager(SheepApp.getInstance(), LinearLayoutManager.HORIZONTAL, false);
         return this;
     }
+
     public void setAdapter(RecyclerView.Adapter adapter) {
         this.adapter = adapter;
     }
@@ -68,8 +82,13 @@ public class GameInfoList {
     }
 
     public RecyclerView.LayoutManager getLayoutManager() {
-        if(layoutManager == null)
+        if (layoutManager == null)
             layoutManager = new LinearLayoutManager(SheepApp.getInstance());
         return layoutManager;
     }
+
+    @Override
+    public int compareTo(@NonNull GameInfoList gameInfoList) {
+        return sort - gameInfoList.getSort();
+    }
 }

+ 12 - 0
app/src/main/java/com/sheep/gamegroup/model/entity/ShowAll.java

@@ -11,6 +11,7 @@ public class ShowAll {
     }
 
     private boolean yes;
+    private int canShowAllState;//0 初始状态, 1, false, 2 true
     private String content;
 
     public boolean isYes() {
@@ -20,6 +21,17 @@ public class ShowAll {
     public void setYes(boolean yes) {
         this.yes = yes;
     }
+    public boolean isFirst(){
+        return canShowAllState == 0;
+    }
+
+    public boolean isCanShowAll() {
+        return canShowAllState == 2;
+    }
+
+    public void setCanShowAll(boolean canShowAll) {
+        this.canShowAllState = canShowAll ? 2 : 1;
+    }
 
     public String getContent() {
         return content;

+ 37 - 29
app/src/main/java/com/sheep/gamegroup/util/CommonUtil.java

@@ -1839,6 +1839,15 @@ public class CommonUtil {
      * @param tabLayout
      */
     public void reflex(final TabLayout tabLayout, final Context context) {
+        reflex(tabLayout, context, false);
+    }
+
+    /**
+     * 通过反射调整tabLayout中下划线的宽度
+     *
+     * @param tabLayout
+     */
+    public void reflex(final TabLayout tabLayout, final Context context, final boolean reMeasure) {
         //了解源码得知 线的宽度是根据 tabView的宽度来设置的
         tabLayout.post(new Runnable() {
             @Override
@@ -1866,7 +1875,7 @@ public class CommonUtil {
                         //因为我想要的效果是   字多宽线就多宽,所以测量mTextView的宽度
                         int width = 0;
                         width = mTextView.getWidth();
-                        if (width == 0) {
+                        if (width == 0 || reMeasure) {
                             mTextView.measure(0, 0);
                             width = mTextView.getMeasuredWidth();
                         }
@@ -2089,35 +2098,34 @@ public class CommonUtil {
             DownLoadInfo task = (DownLoadInfo) event.getData();
             String url = task.getMDownloadUrl();
             TextView tvProgress = view.findViewWithTag(PUBLIC_TAG_PREFIX_TEXTVIEW_LIST + url);
-            switch (event.getEventTypes()) {
-                case DOWNLOAD_RUNNING:
-                    try {
-                        int p = task.getMPercent();    //任务进度百分比
-                        String speed = task.getAverageSpeed();    //转换单位后的下载速度,单位转换需要在配置文件中打开
-                        if (tvProgress == null) {
-                            return;
-                        }
-                        if (isShowSpeed)
-                            tvProgress.setText(String.format(Locale.CHINA, "%d%%(%s)", Math.abs(p), speed));//添加下载速度
-                        else
-                            tvProgress.setText(String.format(Locale.CHINA, "%d%%", Math.abs(p)));
+            if(tvProgress != null) {
+                switch (event.getEventTypes()) {
+                    case DOWNLOAD_RUNNING:
+                        try {
+                            int p = task.getMPercent();    //任务进度百分比
+                            String speed = task.getAverageSpeed();    //转换单位后的下载速度,单位转换需要在配置文件中打开
+                            if (isShowSpeed)
+                                tvProgress.setText(String.format(Locale.CHINA, "%d%%(%s)", Math.abs(p), speed));//添加下载速度
+                            else
+                                tvProgress.setText(String.format(Locale.CHINA, "%d%%", Math.abs(p)));
 
-                    } catch (Exception e) {
-                        e.printStackTrace();
-                    }
-                    break;
-                case DOWNLOAD_STOP:
-                    tvProgress.setText("继续下载");
-                    break;
-                case DOWNLOAD_COMPLETE:
-                    tvProgress.setText("安装游戏");
-                    break;
-                case DOWNLOAD_CANCEL:
-                    tvProgress.setText("下载取消");
-                    break;
-                case DOWNLOAD_FAIL:
-                    tvProgress.setText("下载失败");
-                    break;
+                        } catch (Exception e) {
+                            e.printStackTrace();
+                        }
+                        break;
+                    case DOWNLOAD_STOP:
+                        tvProgress.setText("继续下载");
+                        break;
+                    case DOWNLOAD_COMPLETE:
+                        tvProgress.setText("安装游戏");
+                        break;
+                    case DOWNLOAD_CANCEL:
+                        tvProgress.setText("下载取消");
+                        break;
+                    case DOWNLOAD_FAIL:
+                        tvProgress.setText("下载失败");
+                        break;
+                }
             }
         }
 

+ 7 - 8
app/src/main/java/com/sheep/gamegroup/util/Jump2View.java

@@ -24,7 +24,7 @@ import com.sheep.gamegroup.model.entity.CreditCard;
 import com.sheep.gamegroup.model.entity.DialogConfig;
 import com.sheep.gamegroup.model.entity.DialogEntity;
 import com.sheep.gamegroup.model.entity.GameApp;
-import com.sheep.gamegroup.model.entity.FindItem;
+import com.sheep.gamegroup.model.entity.Article;
 import com.sheep.gamegroup.model.entity.GameListType;
 import com.sheep.gamegroup.model.entity.HomeListEntity;
 import com.sheep.gamegroup.model.entity.LoginEntity;
@@ -34,7 +34,6 @@ import com.sheep.gamegroup.model.entity.RouserArticlesEntity;
 import com.sheep.gamegroup.model.entity.SystemNotification;
 import com.sheep.gamegroup.model.entity.TaskAcceptedEty;
 import com.sheep.gamegroup.model.entity.TaskEty;
-import com.sheep.gamegroup.model.entity.UserComment;
 import com.sheep.gamegroup.model.entity.UserEntity;
 import com.sheep.gamegroup.model.entity.VersionInfo;
 import com.sheep.gamegroup.model.entity.WebviewEntity;
@@ -1572,7 +1571,7 @@ public class Jump2View {
      * @param activity
      * @param item
      */
-    public void goFindGame(Activity activity, FindItem item) {
+    public void goFindGame(Activity activity, Article item) {
         Intent intent = new Intent(activity, ActFindGame.class);
         intent.putExtra("id", item.getApplication_id());
         activity.startActivity(intent);
@@ -1608,7 +1607,7 @@ public class Jump2View {
      * @param activity
      * @param item
      */
-    public void goFindInformation(Activity activity, FindItem item) {
+    public void goFindInformation(Activity activity, Article item) {
         Intent intent = new Intent(activity, ActFindInformation.class);
         intent.putExtra("id", item.getId());
         intent.putExtra("title", item.getTitle());
@@ -1932,7 +1931,7 @@ public class Jump2View {
                 .subscribe(new SheepSubscriber<BaseMessage>(SheepApp.getInstance()) {
                     @Override
                     public void onNext(BaseMessage baseMessage) {
-                        FindItem item = baseMessage.getData(FindItem.class);
+                        Article item = baseMessage.getData(Article.class);
                         if (item == null) {
                             G.showToast(R.string.error_data);
                             return;
@@ -1948,7 +1947,7 @@ public class Jump2View {
     }
 
     //打开一个发现
-    public void goFindItem(Activity activity, FindItem item) {
+    public void goFindItem(Activity activity, Article item) {
         switch (item.getType()) {//类型 1:游戏 2:咨询 3:转跳 4:任务 5:栏目
             case 1:
                 Jump2View.getInstance().goFindGame(activity, item);
@@ -1986,7 +1985,7 @@ public class Jump2View {
      *
      * @param item
      */
-    private void openHomeListItem(final Activity activity, FindItem item) {
+    private void openHomeListItem(final Activity activity, Article item) {
         SheepApp.getInstance().getNetComponent().getApiService().getHomeListItem(item.getHome_list_id())
                 .subscribeOn(Schedulers.io())
                 .observeOn(AndroidSchedulers.mainThread())
@@ -2013,7 +2012,7 @@ public class Jump2View {
      *
      * @param item
      */
-    private void openLink(Activity activity, FindItem item) {
+    private void openLink(Activity activity, Article item) {
         if (TextUtils.isEmpty(item.getUrl())) {
             G.showToast(R.string.error_link);
             return;

+ 19 - 0
app/src/main/java/com/sheep/gamegroup/util/ListUtil.java

@@ -5,6 +5,8 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
+import rx.functions.Action1;
+
 /**
  * Created by realicing on 2018/5/3.
  * realicing@sina.com
@@ -18,6 +20,13 @@ public class ListUtil {
         return list == null || list.isEmpty();
     }
 
+    public static <T> void forEach(List<T> list, Action1<T> action1) {
+        if(list != null)
+            for (T t : list) {
+                action1.call(t);
+            }
+    }
+
     public static <T> T getItem(List<T> list, int index) {
         return hasIndex(list, index) ? list.get(index) : null;
     }
@@ -180,6 +189,16 @@ public class ListUtil {
         list.removeAll(removeList);
         return removeList;
     }
+    public static <T> T getItem(List<T> list, CallBack<T, Boolean> callBack) {
+        if (isEmpty(list)) {
+            return null;
+        }
+        for (T t : list) {
+            if (callBack.call(t))
+                return t;
+        }
+        return null;
+    }
 
     public static <T> void set(List<T> list, T t, int position) {
         if (hasIndex(list, position))

+ 43 - 24
app/src/main/java/com/sheep/gamegroup/util/TextViewUtil.java

@@ -20,16 +20,28 @@ import rx.functions.Action1;
 public class TextViewUtil {
     //监听TextView是否有省略号,返回数据 > 0 代表有省略
     public static void listenEllipsizeChange(final TextView textView, final Action1<Integer> action1) {
-        textView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
+//        textView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
+//            @Override
+//            public void onGlobalLayout() {
+//                Layout layout = textView.getLayout();
+//                if (layout != null) {
+//                    int lines = layout.getLineCount();
+//                    action1.call(layout.getEllipsisCount(lines - 1));
+//                }
+//            }
+//        });
+        textView.postDelayed(new Runnable() {
             @Override
-            public void onGlobalLayout() {
+            public void run() {
                 Layout layout = textView.getLayout();
                 if (layout != null) {
                     int lines = layout.getLineCount();
                     action1.call(layout.getEllipsisCount(lines - 1));
+                } else {
+                    listenEllipsizeChange(textView, action1);
                 }
             }
-        });
+        },100L);
 
     }
     //初始化文本介绍,必须有 intro_content 和 intro_show_all
@@ -42,33 +54,40 @@ public class TextViewUtil {
         final TextView intro_content = itemView.findViewById(R.id.intro_content);
         final TextView intro_show_all = itemView.findViewById(R.id.intro_show_all);
         final View intro_show_all_no = itemView.findViewById(R.id.intro_show_all_no);
-        {
-            boolean canShowAll = showAll.isYes();
-            intro_content.setMaxLines(canShowAll ? Integer.MAX_VALUE : 3);
-            intro_content.setEllipsize(canShowAll ? null : TextUtils.TruncateAt.END);
-            intro_show_all.setText(canShowAll ? "收起" : showAllText);
-        }
-        TextViewUtil.listenEllipsizeChange(intro_content, new Action1<Integer>() {
-            @Override
-            public void call(Integer integer) {
-                showAll.setYes(integer > 0);
-                if (showAll.isYes()) {
-                    ViewUtil.setVisibility(intro_show_all, true);
-                    ViewUtil.setVisibility(intro_show_all_no, false);
+        boolean isFirst = showAll.isFirst();
+
+        ViewUtil.setText(intro_content, text);
+        if(isFirst) {
+            TextViewUtil.listenEllipsizeChange(intro_content, new Action1<Integer>() {
+                @Override
+                public void call(Integer integer) {
+                    boolean canShowAll = integer > 0;
+                    showAll.setYes(false);
+                    showAll.setCanShowAll(canShowAll);
+                    intro_show_all.setText(showAllText);
+                    if (canShowAll) {
+                        ViewUtil.setVisibility(intro_show_all, true);
+                        ViewUtil.setVisibility(intro_show_all_no, false);
+                    }
                 }
-            }
-        });
+            });
+        } else {
+            boolean hasShowAll = showAll.isYes();
+            intro_content.setMaxLines(hasShowAll ? Integer.MAX_VALUE : 3);
+            intro_content.setEllipsize(hasShowAll ? null : TextUtils.TruncateAt.END);
+            intro_show_all.setText(hasShowAll ? "收起" : showAllText);
+            ViewUtil.setVisibility(intro_show_all, showAll.isCanShowAll());
+            ViewUtil.setVisibility(intro_show_all_no, !showAll.isCanShowAll());
+        }
         intro_show_all.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View view) {
-//                boolean canShowAll = intro_content.getMaxLines() == 3;
-                boolean canShowAll = showAll.isYes();
-                intro_content.setMaxLines(canShowAll ? Integer.MAX_VALUE : 3);
-                intro_content.setEllipsize(canShowAll ? null : TextUtils.TruncateAt.END);
-                intro_show_all.setText(canShowAll ? "收起" : showAllText);
                 showAll.setYes(!showAll.isYes());
+                boolean hasShowAll = showAll.isYes();
+                intro_content.setMaxLines(hasShowAll ? Integer.MAX_VALUE : 3);
+                intro_content.setEllipsize(hasShowAll ? null : TextUtils.TruncateAt.END);
+                intro_show_all.setText(hasShowAll ? "收起" : showAllText);
             }
         });
-        ViewUtil.setText(intro_content, text);
     }
 }

+ 5 - 5
app/src/main/java/com/sheep/gamegroup/view/activity/ActFindInformation.java

@@ -31,7 +31,7 @@ import com.sheep.gamegroup.greendao.download.DownLoadInfo;
 import com.sheep.gamegroup.helper.TaskHelper;
 import com.sheep.gamegroup.model.entity.BaseMessage;
 import com.sheep.gamegroup.model.entity.GameApp;
-import com.sheep.gamegroup.model.entity.FindItem;
+import com.sheep.gamegroup.model.entity.Article;
 import com.sheep.gamegroup.model.util.SheepSubscriber;
 import com.sheep.gamegroup.util.CommonUtil;
 import com.sheep.gamegroup.util.DataUtil;
@@ -401,7 +401,7 @@ public class ActFindInformation extends BaseActivity implements Action1<Integer>
                 }
             }
         });
-        FindItem data = DataUtil.getInstance().getCacheResult(ApiKey.articlesItem(id), FindItem.class);
+        Article data = DataUtil.getInstance().getCacheResult(ApiKey.articlesItem(id), Article.class);
         if (data != null) {
             loadFindItem(data);
         }
@@ -413,7 +413,7 @@ public class ActFindInformation extends BaseActivity implements Action1<Integer>
                     public void onNext(BaseMessage baseMessage) {
                         boolean isNewData = DataUtil.getInstance().isNewData(ApiKey.articlesItem(id));
                         if (isNewData) {
-                            FindItem data = baseMessage.getData(FindItem.class);
+                            Article data = baseMessage.getData(Article.class);
                             loadFindItem(data);
                         }
                     }
@@ -426,7 +426,7 @@ public class ActFindInformation extends BaseActivity implements Action1<Integer>
                 });
     }
 
-    private void loadFindItem(FindItem data) {
+    private void loadFindItem(Article data) {
         if (data != null) {
             taskHelper.clear();
             findItem = data;
@@ -476,7 +476,7 @@ public class ActFindInformation extends BaseActivity implements Action1<Integer>
                 });
     }
 
-    private FindItem findItem;
+    private Article findItem;
 
     private void notifyDataSetChanged() {
         if (empty_view == null) {

+ 50 - 3
app/src/main/java/com/sheep/gamegroup/view/activity/ActGcGameAppDetail.java

@@ -16,7 +16,6 @@ import android.widget.TextView;
 import com.kfzs.duanduan.utils.StatusBarUtils;
 import com.scwang.smartrefresh.layout.SmartRefreshLayout;
 import com.scwang.smartrefresh.layout.api.RefreshLayout;
-import com.scwang.smartrefresh.layout.listener.OnRefreshListener;
 import com.scwang.smartrefresh.layout.listener.OnRefreshLoadMoreListener;
 import com.sheep.gamegroup.absBase.AbsGetDownloadListener;
 import com.sheep.gamegroup.absBase.BaseActivity;
@@ -47,6 +46,7 @@ import org.greenrobot.eventbus.EventBus;
 import org.greenrobot.eventbus.Subscribe;
 
 import java.util.List;
+import java.util.Locale;
 
 import butterknife.BindView;
 import rx.android.schedulers.AndroidSchedulers;
@@ -80,6 +80,8 @@ public class ActGcGameAppDetail extends BaseActivity {
     ImageView gc_game_app_detail_iv;
     @BindView(R.id.gc_game_app_detail_icon)
     ImageView gc_game_app_detail_icon;
+    @BindView(R.id.gc_game_app_detail_bt1)
+    TextView gc_game_app_detail_bt1;
     @BindView(R.id.gc_game_app_detail_name)
     TextView gc_game_app_detail_name;
     @BindView(R.id.gc_game_app_detail_bt2)
@@ -104,6 +106,10 @@ public class ActGcGameAppDetail extends BaseActivity {
         fgtGcPlayGameDetail = FgtGcGameAppDetail.newInstance(id);
         fgtGcGameAppComment = FgtGcGameAppComment.newInstance(id);
         fgtGcGameAppWelfare = FgtGcGameAppWelfare.newInstance(id);
+        fgtGcPlayGameDetail.setSmartRefreshLayout(refresh);
+        fgtGcGameAppComment.setSmartRefreshLayout(refresh);
+        fgtGcGameAppComment.setListAction1(fgtGcPlayGameDetail);
+        fgtGcGameAppWelfare.setSmartRefreshLayout(refresh);
         mAdapter.add(fgtGcPlayGameDetail, "详情");
         mAdapter.add(fgtGcGameAppComment, "评价");
         mAdapter.add(fgtGcGameAppWelfare, "福利");
@@ -150,6 +156,16 @@ public class ActGcGameAppDetail extends BaseActivity {
     //加载游戏数据
     private void loadData(GameEntity gameEntity) {
         this.gameEntity = gameEntity;
+        //更新关注状态
+        gc_game_app_detail_bt1.setText(gameEntity.isIs_focus_game() ? "已关注" : "关注");
+        gc_game_app_detail_bt1.setEnabled(!gameEntity.isIs_focus_game());
+        //更新评价数量
+        if(gameEntity.getApp().getComment_num() > 0) {
+            TabLayout.Tab tab = tabLayout.getTabAt(1);
+            if (tab != null)
+                tab.setText(String.format(Locale.CHINA, "评价(%d)", gameEntity.getApp().getComment_num()));
+            CommonUtil.getInstance().reflex(tabLayout, this, true);
+        }
         //加载游戏背景
         ViewUtil.setImage(gc_game_app_detail_iv, gameEntity.getApp().getPictures());
         //加载游戏图标
@@ -195,13 +211,13 @@ public class ActGcGameAppDetail extends BaseActivity {
     public void initData() {
         GameEntity gameEntity = DataUtil.getInstance().getCacheResult(ApiKey.playGameDetail(id), GameEntity.class);
         checkData(gameEntity);
-        initDetailFromNet();
         if (refresh != null) {
             refresh.autoRefresh();
         }
     }
     //刷新数据
     public void refreshData(){
+        initDetailFromNet();
         boolean isRefresh = false;
         if (refreshDataCount != 0) {
             Fragment item = mAdapter.getItem(viewPager.getCurrentItem());
@@ -238,6 +254,7 @@ public class ActGcGameAppDetail extends BaseActivity {
 
     //点击分享
     public void onClickShareImg(View view) {
+        //TODO 点击分享游戏
         G.showToast(R.string.coming_soon);
     }
 
@@ -248,7 +265,31 @@ public class ActGcGameAppDetail extends BaseActivity {
 
     //点击关注
     public void onClickFollowTv(View view) {
-        G.showToast(R.string.coming_soon);
+        if(gameEntity == null){
+            G.showToast(R.string.loading_data);
+            return;
+        }
+        if(gameEntity.isIs_focus_game()){
+            G.showToast("已经关注");
+            return;
+        }
+        //点击关注游戏
+        SheepApp.getInstance().getNetComponent().getApiService().postGameUserFocusGame(id)
+                        .subscribeOn(Schedulers.io())
+                        .observeOn(AndroidSchedulers.mainThread())
+                        .subscribe(new SheepSubscriber<BaseMessage>(SheepApp.getInstance()) {
+                            @Override
+                            public void onNext(BaseMessage baseMessage) {
+                                G.showToast("关注游戏成功");
+                                gc_game_app_detail_bt1.setText("已关注");
+                                gc_game_app_detail_bt1.setEnabled(false);
+                            }
+
+                            @Override
+                            public void onError(BaseMessage baseMessage) {
+                                G.showToast(baseMessage);
+                            }
+                        });
     }
 
     private AbsGetDownloadListener absGetDownloadListener = new AbsGetDownloadListener(true) {
@@ -288,4 +329,10 @@ public class ActGcGameAppDetail extends BaseActivity {
         super.onDestroy();
         EventBus.getDefault().unregister(this);
     }
+
+    //点击领取福利
+    public void onClickDownloadReceiveWelfare(View view) {
+        //TODO 点击领取福利
+        G.showToast(R.string.coming_soon);
+    }
 }

+ 2 - 3
app/src/main/java/com/sheep/gamegroup/view/activity/ActMain.java

@@ -257,15 +257,12 @@ public class ActMain extends BaseActYmPermissionCheck  {
 
     public void initFind() {
         FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
-        Bundle bundle = new Bundle();
         Fragment fragment = getSupportFragmentManager().findFragmentByTag("tag");
         if (fragment == null) {
             fragment = new FgtFind();
-            fragment.setArguments(bundle);
             transaction.add(R.id.frame_container, fragment, "tag");
             transaction.commitAllowingStateLoss();
         } else {
-            fragment.setArguments(bundle);
             transaction.replace(R.id.frame_container, fragment);
             transaction.commitAllowingStateLoss();
         }
@@ -357,6 +354,8 @@ public class ActMain extends BaseActYmPermissionCheck  {
             } else {
                 new DialogGameOrTaskOrGift(this, game_id).showDialog();
             }
+        } else if(action instanceof MainTab){
+            view_pager_container.setCurrentItem(((MainTab) action).ordinal(), false);
         }
     }
 

+ 7 - 0
app/src/main/java/com/sheep/gamegroup/view/activity/MiddleAct.java

@@ -8,6 +8,7 @@ import android.text.TextUtils;
 import com.alibaba.fastjson.JSONObject;
 import com.kfzs.duanduan.utils.NumberFormatUtils;
 import com.sheep.gamegroup.model.entity.JPushMessage;
+import com.sheep.gamegroup.util.ActionUtil;
 import com.sheep.gamegroup.util.Jump2View;
 import com.sheep.gamegroup.util.MainTab;
 import com.sheep.jiuyan.samllsheep.BuildConfig;
@@ -78,6 +79,8 @@ public class MiddleAct extends Activity {
         }
     }
 
+    //跳转发现中心
+    public static final int GO_FIND_CENTER = 22;
     private void gotoNext(Activity activity, Bundle bundle, JPushMessage msg) {
         switch (msg.getType()) {
             case 11://试玩赚钱
@@ -167,6 +170,10 @@ public class MiddleAct extends Activity {
             case 9://打卡赚钱
                 Jump2View.getInstance().goSignCardAct(activity, null);
                 break;
+            case GO_FIND_CENTER://跳转发现中心
+                ActionUtil.getInstance().addNextAction(ActMain.class.getSimpleName(), MainTab.Fgt_Find);
+                Jump2View.getInstance().newTaskTopStartAct(activity, SplashAct.class, bundle);
+                break;
             case 0://直接启动或者重启app
             default:
                 Jump2View.getInstance().newTaskTopStartAct(activity, SplashAct.class, bundle);

+ 47 - 0
app/src/main/java/com/sheep/gamegroup/view/adapter/AdpGcGameAppActivityRecommend.java

@@ -0,0 +1,47 @@
+package com.sheep.gamegroup.view.adapter;
+
+import android.app.Activity;
+import android.content.Context;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.kfzs.appstore.utils.adapter.recyclerview.RecyclerViewAdapter;
+import com.kfzs.appstore.utils.adapter.recyclerview.ViewHolder;
+import com.sheep.gamegroup.model.entity.Article;
+import com.sheep.gamegroup.util.Jump2View;
+import com.sheep.gamegroup.util.ViewUtil;
+import com.sheep.jiuyan.samllsheep.R;
+
+import java.util.List;
+
+/**
+ * Created by realicing on 2018/11/5.
+ * realicing@sina.com
+ */
+public class AdpGcGameAppActivityRecommend extends RecyclerViewAdapter<Article> {
+
+    private Activity activity;
+
+    public AdpGcGameAppActivityRecommend(Context context, List<Article> datas) {
+        super(context, R.layout.item_activity_recommend, datas);
+        activity = (Activity) context;
+    }
+
+    @Override
+    public void convert(ViewHolder viewHolder, final Article item, int position) {
+        ImageView item_activity_recommend_iv = viewHolder.itemView.findViewById(R.id.item_activity_recommend_iv);
+        TextView item_activity_recommend_content = viewHolder.itemView.findViewById(R.id.item_activity_recommend_content);
+
+        ViewUtil.setImage(item_activity_recommend_iv, item.getPictures(), activity.getResources().getDimensionPixelSize(R.dimen.content_padding_5));
+        ViewUtil.setText(item_activity_recommend_content, item.getContent());
+
+        viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                Jump2View.getInstance().goFindItem(activity, item);
+            }
+        });
+    }
+
+}

+ 49 - 0
app/src/main/java/com/sheep/gamegroup/view/adapter/AdpGcGameAppArticleRecommend.java

@@ -0,0 +1,49 @@
+package com.sheep.gamegroup.view.adapter;
+
+import android.app.Activity;
+import android.content.Context;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.kfzs.appstore.utils.adapter.recyclerview.RecyclerViewAdapter;
+import com.kfzs.appstore.utils.adapter.recyclerview.ViewHolder;
+import com.sheep.gamegroup.model.entity.Article;
+import com.sheep.gamegroup.util.Jump2View;
+import com.sheep.gamegroup.util.ViewUtil;
+import com.sheep.jiuyan.samllsheep.R;
+
+import java.util.List;
+
+/**
+ * Created by realicing on 2018/11/5.
+ * realicing@sina.com
+ */
+public class AdpGcGameAppArticleRecommend extends RecyclerViewAdapter<Article> {
+
+    private Activity activity;
+
+    public AdpGcGameAppArticleRecommend(Context context, List<Article> datas) {
+        super(context, R.layout.item_article_recommend, datas);
+        activity = (Activity) context;
+    }
+
+    @Override
+    public void convert(ViewHolder viewHolder, final Article item, int position) {
+        TextView item_article_recommend_title = viewHolder.itemView.findViewById(R.id.item_article_recommend_title);
+        ImageView item_article_recommend_icon = viewHolder.itemView.findViewById(R.id.item_article_recommend_icon);
+        TextView item_article_recommend_content = viewHolder.itemView.findViewById(R.id.item_article_recommend_content);
+
+        ViewUtil.setText(item_article_recommend_title, item.getTitle());
+        ViewUtil.setText(item_article_recommend_content, item.getContent());
+        ViewUtil.setGameImage(item_article_recommend_icon, item.getPictures());
+
+        viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                Jump2View.getInstance().goFindItem(activity, item);
+            }
+        });
+    }
+
+}

+ 81 - 0
app/src/main/java/com/sheep/gamegroup/view/adapter/AdpGcGameAppGiftBag.java

@@ -0,0 +1,81 @@
+package com.sheep.gamegroup.view.adapter;
+
+import android.app.Activity;
+import android.content.Context;
+import android.view.View;
+import android.widget.TextView;
+
+import com.kfzs.appstore.utils.adapter.recyclerview.RecyclerViewAdapter;
+import com.kfzs.appstore.utils.adapter.recyclerview.ViewHolder;
+import com.sheep.gamegroup.model.entity.GameEntity;
+import com.sheep.gamegroup.model.entity.GiftBag;
+import com.sheep.gamegroup.model.entity.GiftBagApp;
+import com.sheep.gamegroup.util.CommonUtil;
+import com.sheep.gamegroup.util.ViewUtil;
+import com.sheep.jiuyan.samllsheep.R;
+
+import java.util.List;
+
+import rx.functions.Action1;
+
+/**
+ * Created by realicing on 2018/11/5.
+ * realicing@sina.com
+ */
+public class AdpGcGameAppGiftBag extends RecyclerViewAdapter<GiftBagApp> {
+
+    private Activity activity;
+    private GameEntity gameEntity;
+    public AdpGcGameAppGiftBag(Context context, List<GiftBagApp> datas, GameEntity gameEntity) {
+        super(context, R.layout.item_gift_bag, datas);
+        activity = (Activity) context;
+        this.gameEntity = gameEntity;
+    }
+
+    @Override
+    public void convert(ViewHolder viewHolder, final GiftBagApp item, int position) {
+        View item_gift_bag_line_top = viewHolder.itemView.findViewById(R.id.item_gift_bag_line_top);
+        final TextView btn_tv = viewHolder.itemView.findViewById(R.id.item_gift_bag_btn);
+        TextView item_gift_bag_num = viewHolder.itemView.findViewById(R.id.item_gift_bag_num);
+        TextView item_gift_bag_name = viewHolder.itemView.findViewById(R.id.item_gift_bag_name);
+
+        ViewUtil.setVisibility2(item_gift_bag_line_top, position != 0);
+
+        GiftBag giftBag;
+        if(item == null || (giftBag = item.getGift_bag()) == null){
+            return;
+        }
+        ViewUtil.setText(item_gift_bag_name, giftBag.getGiftName());
+        ViewUtil.setText(item_gift_bag_num, giftBag.getLastNumText());
+
+        if (!item.isReceived()){
+            btn_tv.setText("领取");
+            btn_tv.setEnabled(true);
+            btn_tv.setTextColor(activity.getResources().getColor(R.color.txt_bule));
+            btn_tv.setBackgroundResource(R.drawable.shape_blue_stroke_rectangle);
+            btn_tv.setOnClickListener(new View.OnClickListener() {
+                @Override
+                public void onClick(View v) {
+                    if(CommonUtil.getInstance().isInstallApp(gameEntity.getApp().getPackage_name(), gameEntity.getApp().getName())){
+                        CommonUtil.getInstance().receiveGiftById(activity, item, new Action1<Integer>() {
+                            @Override
+                            public void call(Integer integer) {
+                                item.setReceived(true);
+                                btn_tv.setText("已领取");
+                                btn_tv.setEnabled(false);
+                                notifyDataSetChanged();
+                            }
+                        },gameEntity.getApp().getPackage_name());
+                    }
+
+                }
+            });
+        }else {
+            btn_tv.setText("已领取");
+            btn_tv.setEnabled(false);
+            btn_tv.setTextColor(activity.getResources().getColor(R.color.time_created));
+            btn_tv.setBackgroundResource(R.drawable.shape_gray_stroke_rectangle_10_radius);
+        }
+    }
+
+}

+ 6 - 5
app/src/main/java/com/sheep/gamegroup/view/adapter/AdpGcGameAppInfoList.java

@@ -4,8 +4,8 @@ import android.content.Context;
 import android.support.v7.widget.RecyclerView;
 import android.widget.TextView;
 
-import com.kfzs.appstore.utils.adapter.recyclerview.RecyclerViewAdapter;
-import com.kfzs.appstore.utils.adapter.recyclerview.ViewHolder;
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.BaseViewHolder;
 import com.sheep.gamegroup.model.entity.GameInfoList;
 import com.sheep.gamegroup.util.ViewUtil;
 import com.sheep.jiuyan.samllsheep.R;
@@ -18,14 +18,15 @@ import java.util.List;
  * Created by realicing on 2018/11/1.
  * realicing@sina.com
  * 游戏详情中详情列表:游戏介绍、详情信息、用户评价、相关游戏、热门试玩
+ * 游戏详情中福利列表:游戏评分、文章推荐、活动推荐
  */
-public class AdpGcGameAppInfoList extends RecyclerViewAdapter<GameInfoList> {
+public class AdpGcGameAppInfoList extends BaseQuickAdapter<GameInfoList, BaseViewHolder> {
     public AdpGcGameAppInfoList(Context context, List<GameInfoList> datas) {
-        super(context, R.layout.item_gc_game_app_detail_list, datas);
+        super(R.layout.item_gc_game_app_detail_list, datas);
     }
 
     @Override
-    public void convert(ViewHolder viewHolder, final GameInfoList itemList, int position) {
+    public void convert(BaseViewHolder viewHolder, final GameInfoList itemList) {
 //        View item_gc_game_app_list_top = viewHolder.itemView.findViewById(R.id.item_gc_game_app_list_top);
         TextView item_gc_game_app_list_tv = viewHolder.itemView.findViewById(R.id.item_gc_game_app_list_tv);
         TextView item_gc_game_app_list_more_tv = viewHolder.itemView.findViewById(R.id.item_gc_game_app_list_more_tv);

+ 8 - 46
app/src/main/java/com/sheep/gamegroup/view/fragment/BaseListFragment3.java

@@ -5,7 +5,7 @@ import android.support.v7.widget.LinearLayoutManager;
 import android.support.v7.widget.RecyclerView;
 import android.view.View;
 
-import com.scwang.smartrefresh.layout.SmartRefreshLayout;
+import com.sheep.gamegroup.absBase.BaseRefreshLoadMoreFragment;
 import com.sheep.gamegroup.absBase.ILoadMore;
 import com.sheep.gamegroup.absBase.IRefresh;
 import com.sheep.gamegroup.model.api.ApiService;
@@ -18,7 +18,6 @@ import com.sheep.gamegroup.util.ListUtil;
 import com.sheep.gamegroup.util.SysAppUtil;
 import com.sheep.jiuyan.samllsheep.R;
 import com.sheep.jiuyan.samllsheep.SheepApp;
-import com.sheep.jiuyan.samllsheep.base.BaseFragment;
 
 import java.util.List;
 
@@ -33,7 +32,7 @@ import rx.schedulers.Schedulers;
  * realicing@sina.com
  * 使用普通的RecyclerView来显示列表,可配合SmartRefreshLayout和ViewPager使用(setSmartRefreshLayout和setViewPager)
  */
-public abstract class BaseListFragment3<T> extends BaseFragment implements IRefresh, ILoadMore {
+public abstract class BaseListFragment3<T> extends BaseRefreshLoadMoreFragment{
     @Override
     public int getLayoutId() {
         return R.layout.net_empty_rv;
@@ -57,7 +56,7 @@ public abstract class BaseListFragment3<T> extends BaseFragment implements IRefr
                 notifyDataSetChanged();
                 break;
         }
-        if(!useSelfEmpty() && empty_view != null)
+        if (!useSelfEmpty() && empty_view != null)
             empty_view.setVisibility(View.GONE);
     }
 
@@ -96,22 +95,6 @@ public abstract class BaseListFragment3<T> extends BaseFragment implements IRefr
         }
     }
 
-    //设置是否还有更多数据
-    public void setNoMore(boolean noMore) {
-        this.noMore = noMore;
-        if (smartRefreshLayout != null && getUserVisibleHint()) {
-            smartRefreshLayout.setNoMoreData(noMore);
-        }
-    }
-
-    //加载完成时更新header或footer
-    protected void refreshOrLoadMoreComplete() {
-        if (smartRefreshLayout != null && getUserVisibleHint()) {
-            smartRefreshLayout.finishRefresh();
-            smartRefreshLayout.finishLoadMore();
-        }
-    }
-
     protected List<T> list = ListUtil.emptyList();
     protected List<T> lastCacheList = ListUtil.emptyList();
 
@@ -127,6 +110,7 @@ public abstract class BaseListFragment3<T> extends BaseFragment implements IRefr
             return resolveData(baseMessage, position);
         }
     };
+
     //加载数据
     public void initData() {
         final String urlKey = getKey(page, per_page);
@@ -177,6 +161,7 @@ public abstract class BaseListFragment3<T> extends BaseFragment implements IRefr
     protected List<T> resolveData(BaseMessage baseMessage, int page) {
         return baseMessage.getDatas(getTClass());
     }
+
     @Override
     public void onResume() {
         super.onResume();
@@ -184,8 +169,9 @@ public abstract class BaseListFragment3<T> extends BaseFragment implements IRefr
             refreshData();
         }
     }
+
     //使用布局中自带的无数据空view
-    public boolean useSelfEmpty(){
+    public boolean useSelfEmpty() {
         return true;
     }
 
@@ -238,26 +224,12 @@ public abstract class BaseListFragment3<T> extends BaseFragment implements IRefr
         refreshOrLoadMoreComplete();
     }
 
-    @Override
-    public void setUserVisibleHint(boolean isVisibleToUser) {
-        super.setUserVisibleHint(isVisibleToUser);
-        if (smartRefreshLayout != null && getUserVisibleHint()) {
-            smartRefreshLayout.setNoMoreData(noMore);
-        }
-    }
-
     //是否显示无数据占位图
     protected void updateEmptyView() {
-        if(useSelfEmpty())
+        if (useSelfEmpty())
             CommonUtil.getInstance().updateEmptyView(empty_view, list.isEmpty());
     }
 
-    protected boolean noMore = false;
-
-    public boolean isNoMore() {
-        return noMore;
-    }
-
     protected abstract RecyclerView.Adapter getAdapter();
 
     protected abstract String getKey(int page, int per_page);
@@ -266,14 +238,4 @@ public abstract class BaseListFragment3<T> extends BaseFragment implements IRefr
 
     protected abstract Class<T> getTClass();
 
-
-    protected SmartRefreshLayout smartRefreshLayout;
-
-    public SmartRefreshLayout getSmartRefreshLayout() {
-        return smartRefreshLayout;
-    }
-
-    public void setSmartRefreshLayout(SmartRefreshLayout smartRefreshLayout) {
-        this.smartRefreshLayout = smartRefreshLayout;
-    }
 }

+ 6 - 6
app/src/main/java/com/sheep/gamegroup/view/fragment/FgtFind.java

@@ -6,7 +6,7 @@ import android.support.v4.view.ViewPager;
 
 import com.kfzs.duanduan.utils.NumberFormatUtils;
 import com.sheep.gamegroup.model.entity.BaseMessage;
-import com.sheep.gamegroup.model.entity.FindTag;
+import com.sheep.gamegroup.model.entity.ArticleTag;
 import com.sheep.gamegroup.model.util.SheepSubscriber;
 import com.sheep.gamegroup.util.CommonUtil;
 import com.sheep.gamegroup.util.DataUtil;
@@ -61,7 +61,7 @@ public class FgtFind extends BaseFragment {
 
     private void initData() {
         //尝试获取缓存数据
-        List<FindTag> newList = DataUtil.getInstance().getCacheList(ApiKey.articles_tags, FindTag.class);
+        List<ArticleTag> newList = DataUtil.getInstance().getCacheList(ApiKey.articles_tags, ArticleTag.class);
         if (ListUtil.isEmpty(newList)) {
             initNetData();
         } else {
@@ -103,7 +103,7 @@ public class FgtFind extends BaseFragment {
                 .subscribe(new SheepSubscriber<BaseMessage>(SheepApp.getInstance()) {
                     @Override
                     public void onNext(BaseMessage baseMessage) {
-                        List<FindTag> newList = baseMessage.getDatas(FindTag.class);
+                        List<ArticleTag> newList = baseMessage.getDatas(ArticleTag.class);
                         if (list.isEmpty() && !ListUtil.isEmpty(newList))//有缓存时不会加载,没有缓存时获取到数据会加载
                             loadList(newList);
                     }
@@ -115,7 +115,7 @@ public class FgtFind extends BaseFragment {
     }
 
     //没有添加数据返回true
-    private void loadList(List<FindTag> newList) {
+    private void loadList(List<ArticleTag> newList) {
         if (!ListUtil.isEmpty(newList)) {
             list.clear();
             ListUtil.addAll(list, newList);
@@ -124,7 +124,7 @@ public class FgtFind extends BaseFragment {
                 public void call(String url) {
                     int awaken_on = NumberFormatUtils.parseInteger(url);
                     int count = 1;
-                    for (FindTag findLabel : list) {
+                    for (ArticleTag findLabel : list) {
                         mAdapter.add(FgtFindChild.newInstance(findLabel.getId()), findLabel.getName());
                         count++;
                     }
@@ -158,6 +158,6 @@ public class FgtFind extends BaseFragment {
         }
     }
 
-    private List<FindTag> list = ListUtil.emptyList();
+    private List<ArticleTag> list = ListUtil.emptyList();
 
 }

+ 10 - 10
app/src/main/java/com/sheep/gamegroup/view/fragment/FgtFindChild.java

@@ -19,8 +19,8 @@ import com.sheep.gamegroup.greendao.download.DownLoadInfo;
 import com.sheep.gamegroup.model.api.ApiService;
 import com.sheep.gamegroup.model.entity.BaseMessage;
 import com.sheep.gamegroup.model.entity.GameApp;
-import com.sheep.gamegroup.model.entity.FindItem;
-import com.sheep.gamegroup.model.entity.FindTag;
+import com.sheep.gamegroup.model.entity.Article;
+import com.sheep.gamegroup.model.entity.ArticleTag;
 import com.sheep.gamegroup.util.CommonUtil;
 import com.sheep.gamegroup.util.DownloadUtil;
 import com.sheep.gamegroup.util.Jump2View;
@@ -49,10 +49,10 @@ import static android.content.Intent.ACTION_PACKAGE_REMOVED;
  * Created by realicing on 2018/9/7.
  * realicing@sina.com
  */
-public class FgtFindChild extends BaseListFragment2<FindItem> {
+public class FgtFindChild extends BaseListFragment2<Article> {
     @Override
     protected RecyclerView.Adapter getAdapter() {
-        return new AdbCommonRecycler<FindItem>(SheepApp.getInstance(), list) {
+        return new AdbCommonRecycler<Article>(SheepApp.getInstance(), list) {
 
             @Override
             public int getItemViewType(int position) {
@@ -65,7 +65,7 @@ public class FgtFindChild extends BaseListFragment2<FindItem> {
             }
 
             @Override
-            public void convert(final ViewHolder holder, final FindItem item) {
+            public void convert(final ViewHolder holder, final Article item) {
                 if (item == null) {
                     return;
                 }
@@ -102,9 +102,9 @@ public class FgtFindChild extends BaseListFragment2<FindItem> {
                     find_item_tags.setVisibility(View.GONE);
                 } else {
                     find_item_tags.setVisibility(View.VISIBLE);
-                    TagAdapter adapter = new TagAdapter<FindTag>(item.getTages()) {
+                    TagAdapter adapter = new TagAdapter<ArticleTag>(item.getTages()) {
                         @Override
-                        public View getView(FlowLayout parent, int position, FindTag item) {
+                        public View getView(FlowLayout parent, int position, ArticleTag item) {
                             TextView tv = (TextView) LayoutInflater.from(activity).inflate(R.layout.find_item_tag, parent, false);
                             ViewUtil.setText(tv, item.getName());
                             return tv;
@@ -142,8 +142,8 @@ public class FgtFindChild extends BaseListFragment2<FindItem> {
     }
 
     @Override
-    protected Class<FindItem> getTClass() {
-        return FindItem.class;
+    protected Class<Article> getTClass() {
+        return Article.class;
     }
 
     private int type;
@@ -161,7 +161,7 @@ public class FgtFindChild extends BaseListFragment2<FindItem> {
      *
      * @param item
      */
-    private void onClickItem(FindItem item) {
+    private void onClickItem(Article item) {
         if (item != null) {
             Jump2View.getInstance().goFindItem(activity, item);
         }

+ 21 - 2
app/src/main/java/com/sheep/gamegroup/view/fragment/FgtGcGameAppComment.java

@@ -35,6 +35,7 @@ import java.util.Locale;
 import cn.modificator.waterwave_progress.WaterWaveProgress;
 import rx.Observable;
 import rx.android.schedulers.AndroidSchedulers;
+import rx.functions.Action1;
 import rx.schedulers.Schedulers;
 
 /**
@@ -87,13 +88,12 @@ public class FgtGcGameAppComment extends BaseListFragment3<UserComment> {
         //评论列表
         AdpGcGameAppComment adapter = new AdpGcGameAppComment(list);
         adapter.addHeaderView(headerView);
-        initAppScoreNum();
         return adapter;
     }
 
     @Override
     protected String getKey(int page, int per_page) {
-        return String.format(Locale.CHINA, "app/game_user/app_comment_list?page_no=%d&page_size=%d&app_id=%d", page, per_page, app_id);
+        return String.format(Locale.CHINA, "app/game_user/app_comment_list?page_no=%d&page_size=%d&app_id=%d&comment_type=%d", page, per_page, app_id, ApiJSONUtil.COMMENT_TYPE_GAME);
     }
 
     @Override
@@ -101,6 +101,19 @@ public class FgtGcGameAppComment extends BaseListFragment3<UserComment> {
         return apiService.getGameUserAppCommentList(page, per_page, app_id, ApiJSONUtil.COMMENT_TYPE_GAME);
     }
 
+    private Action1<List<UserComment>> listAction1;
+
+    public void setListAction1(Action1<List<UserComment>> listAction1) {
+        this.listAction1 = listAction1;
+    }
+
+    @Override
+    protected void loadList(List<UserComment> addList) {
+        super.loadList(addList);
+        if(listAction1 != null && page == 1 && !ListUtil.isEmpty(addList))
+            listAction1.call(addList);
+    }
+
     @Override
     protected Class<UserComment> getTClass() {
         return UserComment.class;
@@ -129,6 +142,12 @@ public class FgtGcGameAppComment extends BaseListFragment3<UserComment> {
         }
     }
 
+    @Override
+    public void refreshData() {
+        initAppScoreNum();
+        super.refreshData();
+    }
+
     //评分排序方法
     private Comparator<GameAppScore> scoreComparable = new Comparator<GameAppScore>() {
         @Override

+ 84 - 34
app/src/main/java/com/sheep/gamegroup/view/fragment/FgtGcGameAppDetail.java

@@ -10,6 +10,7 @@ import android.widget.TextView;
 
 import com.kfzs.appstore.utils.adapter.recyclerview.RecyclerViewAdapter;
 import com.kfzs.appstore.utils.adapter.recyclerview.ViewHolder;
+import com.sheep.gamegroup.absBase.BaseRefreshLoadMoreFragment;
 import com.sheep.gamegroup.helper.ImageListHelper;
 import com.sheep.gamegroup.model.entity.BaseMessage;
 import com.sheep.gamegroup.model.entity.Entry;
@@ -17,12 +18,14 @@ import com.sheep.gamegroup.model.entity.GameApp;
 import com.sheep.gamegroup.model.entity.GameEntity;
 import com.sheep.gamegroup.model.entity.GameInfoList;
 import com.sheep.gamegroup.model.entity.ShowAll;
+import com.sheep.gamegroup.model.entity.UserComment;
 import com.sheep.gamegroup.model.util.SheepSubscriber;
 import com.sheep.gamegroup.util.GlideImageLoader;
 import com.sheep.gamegroup.util.ListUtil;
 import com.sheep.gamegroup.util.TextViewUtil;
 import com.sheep.gamegroup.util.TimeUtil;
 import com.sheep.gamegroup.util.ViewUtil;
+import com.sheep.gamegroup.view.adapter.AdpGcGameAppComment;
 import com.sheep.gamegroup.view.adapter.AdpGcGameAppInfoList;
 import com.sheep.jiuyan.samllsheep.R;
 import com.sheep.jiuyan.samllsheep.SheepApp;
@@ -30,19 +33,21 @@ import com.sheep.jiuyan.samllsheep.base.BaseFragment;
 import com.sheep.jiuyan.samllsheep.utils.G;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 import butterknife.BindView;
 import rx.Observable;
 import rx.android.schedulers.AndroidSchedulers;
 import rx.functions.Action1;
+import rx.schedulers.Schedulers;
 
 /**
  * Created by realicing on 2018/11/1.
  * realicing@sina.com
  * 玩转游戏 详情
  */
-public class FgtGcGameAppDetail extends BaseFragment {
+public class FgtGcGameAppDetail extends BaseRefreshLoadMoreFragment implements Action1<List<UserComment>>{
     @BindView(R.id.gc_game_app_detail_pic_list)
     RecyclerView gc_game_app_detail_pic_list;
     @BindView(R.id.gc_game_app_detail_info_list)
@@ -98,7 +103,7 @@ public class FgtGcGameAppDetail extends BaseFragment {
                 public void convert(ViewHolder viewHolder, ShowAll showAll, int position) {
                     TextViewUtil.initIntroView(viewHolder.itemView, showAll);
                 }
-            }));
+            }).setSort(SORT_GAME_INTRO));
         }
         final List<Entry<String, String>> entryList = ListUtil.emptyList();
         entryList.add(new Entry<>("当前版本", gameApp.getVersions()));
@@ -118,41 +123,15 @@ public class FgtGcGameAppDetail extends BaseFragment {
                 ViewUtil.setText(item_gc_game_info_key, item.getK());
                 ViewUtil.setText(item_gc_game_info_value, item.getV());
             }
-        }));
-        gameInfoListArrayList.add(new GameInfoList("用户评价", new RecyclerViewAdapter<Entry<String, String>>(SheepApp.getInstance(), R.layout.item_gc_game_info, entryList) {
-            @Override
-            public void convert(ViewHolder viewHolder, Entry<String, String> item, int position) {
-                View item_gc_game_info_top = viewHolder.itemView.findViewById(R.id.item_gc_game_info_top);
-                TextView item_gc_game_info_key = viewHolder.itemView.findViewById(R.id.item_gc_game_info_key);
-                TextView item_gc_game_info_value = viewHolder.itemView.findViewById(R.id.item_gc_game_info_value);
-                View item_gc_game_info_bottom = viewHolder.itemView.findViewById(R.id.item_gc_game_info_bottom);
-                ViewUtil.setVisibility(item_gc_game_info_top, position == 0);
-                ViewUtil.setVisibility(item_gc_game_info_bottom, position + 1 == entryList.size());
-                ViewUtil.setText(item_gc_game_info_key, item.getK());
-                ViewUtil.setText(item_gc_game_info_value, item.getV());
-            }
-        }));
-
+        }).setSort(SORT_GAME_INFO));
+        Collections.sort(gameInfoListArrayList);
         gc_game_app_detail_info_list.getAdapter().notifyDataSetChanged();
-        if (appId > 0) {
-            initData("相关游戏", SheepApp.getInstance().getNetComponent().getApiService().getDetailRelevantGames(appId), new View.OnClickListener() {
-                @Override
-                public void onClick(View view) {
-                    G.showToast(R.string.coming_soon);
-                }
-            });
-            initData("热门试玩", SheepApp.getInstance().getNetComponent().getApiService().getDetailHotGames(appId), new View.OnClickListener() {
-                @Override
-                public void onClick(View view) {
-                    G.showToast(R.string.coming_soon);
-                }
-            });
-        }
     }
 
     //加载相关游戏与热门试玩数据列表
-    private void initData(final String name, Observable<BaseMessage> observable, final View.OnClickListener onClickListener) {
-        observable.observeOn(AndroidSchedulers.mainThread())
+    private void initData(final int sort, final String name, Observable<BaseMessage> observable, final View.OnClickListener onClickListener) {
+        observable.subscribeOn(Schedulers.io())
+                .observeOn(AndroidSchedulers.mainThread())
                 .subscribe(new SheepSubscriber<BaseMessage>(SheepApp.getInstance()) {
                     @Override
                     public void onNext(BaseMessage baseMessage) {
@@ -171,12 +150,16 @@ public class FgtGcGameAppDetail extends BaseFragment {
                                         GlideImageLoader.setGameImage(item_gc_game_app_iv, item.getIcon());
                                     }
                                 }
-                            }, onClickListener).setHorizontal());
+                            }, onClickListener).setHorizontal().setSort(sort));
+                            Collections.sort(gameInfoListArrayList);
+                            gc_game_app_detail_info_list.getAdapter().notifyDataSetChanged();
                         }
+                        refreshOrLoadMoreComplete();
                     }
 
                     @Override
                     public void onError(BaseMessage baseMessage) {
+                        refreshOrLoadMoreComplete();
                     }
                 });
     }
@@ -184,4 +167,71 @@ public class FgtGcGameAppDetail extends BaseFragment {
     private int appId;
 
 
+    @Override
+    public void loadMoreData() {
+        setNoMore(true);
+        refreshOrLoadMoreComplete();
+    }
+
+    @Override
+    public void refreshData() {
+        ListUtil.removeItem(gameInfoListArrayList, new ListUtil.CallBack<GameInfoList, Boolean>() {
+            @Override
+            public Boolean call(GameInfoList gameInfoList) {
+                return gameInfoList.getSort() == SORT_GAME_RELEVANT || gameInfoList.getSort() == SORT_GAME_HOT;
+            }
+        });
+        initData(SORT_GAME_RELEVANT, "相关游戏", SheepApp.getInstance().getNetComponent().getApiService().getDetailRelevantGames(appId), new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                G.showToast(R.string.coming_soon);
+            }
+        });
+        initData(SORT_GAME_HOT, "热门试玩", SheepApp.getInstance().getNetComponent().getApiService().getDetailHotGames(appId), new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                G.showToast(R.string.coming_soon);
+            }
+        });
+    }
+
+    //评论列表数据
+    private List<UserComment> userCommentList = ListUtil.emptyList();
+    public static final int MAX_USER_COMMENT_NUM = 2;//最多显示评论的个数
+    @Override
+    public void call(List<UserComment> userComments) {
+        userCommentList.clear();
+        if(userComments != null) {
+            for (int i = 0; i < userComments.size(); i++) {
+                if(i < MAX_USER_COMMENT_NUM)
+                    userCommentList.add(userComments.get(i));
+                else
+                    break;
+            }
+        }
+
+        GameInfoList item = ListUtil.getItem(gameInfoListArrayList, new ListUtil.CallBack<GameInfoList, Boolean>(){
+
+            @Override
+            public Boolean call(GameInfoList gameInfoList) {
+               return gameInfoList.getSort() == SORT_USER_COMMENT;
+            }
+        });
+        if(item == null) {
+            gameInfoListArrayList.add(new GameInfoList("用户评价", new AdpGcGameAppComment(userCommentList)).setSort(SORT_USER_COMMENT));
+            Collections.sort(gameInfoListArrayList);
+        }
+        gc_game_app_detail_info_list.getAdapter().notifyDataSetChanged();
+    }
+
+    //游戏介绍
+    public static final int SORT_GAME_INTRO = 1;
+    //详细信息
+    public static final int SORT_GAME_INFO = 2;
+    //用户评价
+    public static final int SORT_USER_COMMENT = 3;
+    //相关游戏
+    public static final int SORT_GAME_RELEVANT = 4;
+    //热门试玩
+    public static final int SORT_GAME_HOT = 5;
 }

+ 107 - 4
app/src/main/java/com/sheep/gamegroup/view/fragment/FgtGcGameAppWelfare.java

@@ -1,18 +1,41 @@
 package com.sheep.gamegroup.view.fragment;
 
 import android.app.Activity;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
 
+import com.sheep.gamegroup.absBase.BaseRefreshLoadMoreFragment;
+import com.sheep.gamegroup.model.entity.Article;
+import com.sheep.gamegroup.model.entity.BaseMessage;
 import com.sheep.gamegroup.model.entity.GameEntity;
+import com.sheep.gamegroup.model.entity.GameInfoList;
+import com.sheep.gamegroup.model.util.SheepSubscriber;
+import com.sheep.gamegroup.util.ListUtil;
+import com.sheep.gamegroup.util.TestUtil;
+import com.sheep.gamegroup.view.adapter.AdpGcGameAppActivityRecommend;
+import com.sheep.gamegroup.view.adapter.AdpGcGameAppArticleRecommend;
+import com.sheep.gamegroup.view.adapter.AdpGcGameAppGiftBag;
+import com.sheep.gamegroup.view.adapter.AdpGcGameAppInfoList;
 import com.sheep.jiuyan.samllsheep.R;
-import com.sheep.jiuyan.samllsheep.base.BaseFragment;
+import com.sheep.jiuyan.samllsheep.SheepApp;
+import com.sheep.jiuyan.samllsheep.utils.G;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import butterknife.BindView;
+import rx.android.schedulers.AndroidSchedulers;
+import rx.schedulers.Schedulers;
 
 /**
  * Created by realicing on 2018/11/1.
  * realicing@sina.com
  * 玩转游戏 福利
  */
-public class FgtGcGameAppWelfare extends BaseFragment {
+public class FgtGcGameAppWelfare extends BaseRefreshLoadMoreFragment {
 
+    @BindView(R.id.recyclerView)
+    RecyclerView recyclerView;
     private Activity activity;
 
     public static FgtGcGameAppWelfare newInstance(int appId) {
@@ -23,19 +46,99 @@ public class FgtGcGameAppWelfare extends BaseFragment {
 
     @Override
     public int getLayoutId() {
-        return R.layout.fgt_gc_game_app_detail;
+        return R.layout.common_rv;
     }
 
 
+    private ArrayList<GameInfoList> gameInfoListArrayList = ListUtil.emptyList();
+
     @Override
     public void onViewCreated() {
         activity = getActivity();
+        recyclerView.setHasFixedSize(true);
+        recyclerView.setNestedScrollingEnabled(false);
+        recyclerView.setLayoutManager(new LinearLayoutManager(SheepApp.getInstance()));
+        AdpGcGameAppInfoList adpGcGameAppInfoList = new AdpGcGameAppInfoList(activity, gameInfoListArrayList);
+        adpGcGameAppInfoList.bindToRecyclerView(recyclerView);
+        adpGcGameAppInfoList.setEmptyView(R.layout.include_empty_view);
+
+        refreshData();
     }
 
 
     private int appId;
 
 
-    public void loadData(GameEntity gameEntity) {
+    public void loadData(final GameEntity gameEntity) {
+        if (gameEntity.isGift()) {
+            gameInfoListArrayList.add(new GameInfoList("礼包推荐", new AdpGcGameAppGiftBag(activity, gameEntity.getHas_gift_bag(), gameEntity)).setSort(SORT_GIFT));
+        }
+        recyclerView.getAdapter().notifyDataSetChanged();
     }
+
+    @Override
+    public void refreshData() {
+        ListUtil.removeItem(gameInfoListArrayList, new ListUtil.CallBack<GameInfoList, Boolean>() {
+            @Override
+            public Boolean call(GameInfoList gameInfoList) {
+                return gameInfoList.getSort() == SORT_ACTIVITY || gameInfoList.getSort() == SORT_ARTICLE;
+            }
+        });
+        recyclerView.getAdapter().notifyDataSetChanged();
+        //文章推荐
+        SheepApp.getInstance().getNetComponent().getApiService().getDetailArticleRecommend(appId)
+                .subscribeOn(Schedulers.io())
+                .observeOn(AndroidSchedulers.mainThread())
+                .subscribe(new SheepSubscriber<BaseMessage>(SheepApp.getInstance()) {
+                    @Override
+                    public void onNext(BaseMessage baseMessage) {
+                        List<Article> newList = baseMessage.getDatas(Article.class);
+                        if (!ListUtil.isEmpty(newList)) {
+                            gameInfoListArrayList.add(new GameInfoList("文章推荐", new AdpGcGameAppArticleRecommend(activity, newList)).setSort(SORT_ARTICLE));
+                            recyclerView.getAdapter().notifyDataSetChanged();
+                        }
+                        refreshOrLoadMoreComplete();
+                    }
+
+                    @Override
+                    public void onError(BaseMessage baseMessage) {
+                        if (TestUtil.isDev()) G.showToast(baseMessage);
+                        refreshOrLoadMoreComplete();
+                    }
+                });
+        //活动推荐
+        SheepApp.getInstance().getNetComponent().getApiService().getDetailActivityRecommend(appId)
+                .subscribeOn(Schedulers.io())
+                .observeOn(AndroidSchedulers.mainThread())
+                .subscribe(new SheepSubscriber<BaseMessage>(SheepApp.getInstance()) {
+                    @Override
+                    public void onNext(BaseMessage baseMessage) {
+                        List<Article> newList = baseMessage.getDatas(Article.class);
+                        if (!ListUtil.isEmpty(newList)) {
+                            gameInfoListArrayList.add(new GameInfoList("活动推荐", new AdpGcGameAppActivityRecommend(activity, newList)).setSort(SORT_ACTIVITY));
+                            recyclerView.getAdapter().notifyDataSetChanged();
+                        }
+                        refreshOrLoadMoreComplete();
+                    }
+
+                    @Override
+                    public void onError(BaseMessage baseMessage) {
+                        if (TestUtil.isDev()) G.showToast(baseMessage);
+                        refreshOrLoadMoreComplete();
+                    }
+                });
+    }
+
+    @Override
+    public void loadMoreData() {
+        setNoMore(true);
+        refreshOrLoadMoreComplete();
+    }
+
+    //礼包推荐
+    public static final int SORT_GIFT = 1;
+    //文章推荐
+    public static final int SORT_ARTICLE = 2;
+    //活动推荐
+    public static final int SORT_ACTIVITY = 3;
 }

+ 3 - 0
app/src/main/java/com/sheep/gamegroup/view/fragment/FgtUserCommentDetail.java

@@ -98,6 +98,7 @@ public class FgtUserCommentDetail extends BaseListFragment3<UserCommentReply> {
 //    ------------------------------start header------------------------------------
     private LinearLayout user_comment_detail_game_ll;
     private TextView user_comment_detail_game_name;
+    private ImageView user_comment_detail_game_icon;
     private ImageView user_comment_detail_user_avatar;
     private TextView user_comment_detail_user_name;
     private TextView user_comment_detail_user_publish_time;
@@ -111,6 +112,7 @@ public class FgtUserCommentDetail extends BaseListFragment3<UserCommentReply> {
 
         user_comment_detail_game_ll = headerView.findViewById(R.id.user_comment_detail_game_ll);
         user_comment_detail_game_name = headerView.findViewById(R.id.user_comment_detail_game_name);
+        user_comment_detail_game_icon = headerView.findViewById(R.id.user_comment_detail_game_icon);
         user_comment_detail_user_avatar = headerView.findViewById(R.id.user_comment_detail_user_avatar);
         user_comment_detail_user_name = headerView.findViewById(R.id.user_comment_detail_user_name);
         user_comment_detail_user_publish_time = headerView.findViewById(R.id.user_comment_detail_user_publish_time);
@@ -139,6 +141,7 @@ public class FgtUserCommentDetail extends BaseListFragment3<UserCommentReply> {
         ViewUtil.setText(user_comment_detail_game_name, user_comment.getApp_name());
         ViewUtil.setText(user_comment_detail_user_name, user_comment.getNickname());
         user_comment_detail_user_publish_time.setText(DateUtil.getTimeText(user_comment.getCreate_time()));
+        ViewUtil.setGameImage(user_comment_detail_game_icon, user_comment.getApp_icon());
         ViewUtil.setAvatar(user_comment_detail_user_avatar, user_comment.getAvatar());
         TextViewUtil.initIntroView(headerView, user_comment.getShowAll(), "全文");
     }

+ 11 - 0
app/src/main/res/color/selector_color_stoke_main_btn.xml

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <item android:state_enabled="false" android:color="@color/white" />
+    <item android:state_activated="true" android:color="@color/main_tab_activated" />
+    <item android:state_focused="true" android:color="@color/main_tab_activated" />
+    <item android:state_checked="true" android:color="@color/main_tab_activated"/>
+    <item android:state_selected="true" android:color="@color/main_tab_activated"/>
+    <item android:state_pressed="true" android:color="@color/main_tab_activated"/>
+    <item android:color="#ff2ebef2"/>
+</selector>

+ 2 - 2
app/src/main/res/layout/act_game_make_money.xml

@@ -27,7 +27,7 @@
             android:text="1"/>
         <TextView
             style="@style/style_ash_tv"
-            android:text="下载游戏"/>
+            android:text="下载应用"/>
         <ImageView
             style="@style/style_ash_img"
             android:src="@mipmap/arrow_right_img"/>
@@ -40,7 +40,7 @@
             android:text="2"/>
         <TextView
             style="@style/style_ash_tv"
-            android:text="试玩游戏"/>
+            android:text="试玩应用"/>
         <ImageView
             style="@style/style_ash_img"
             android:src="@mipmap/arrow_right_img"/>

+ 21 - 4
app/src/main/res/layout/act_gc_game_app_detail.xml

@@ -4,13 +4,14 @@
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
+    android:background="@color/white"
     tools:context="com.sheep.gamegroup.view.activity.ActGcGameAppDetail">
 
     <com.scwang.smartrefresh.layout.SmartRefreshLayout
         android:id="@+id/refresh"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:background="@color/white">
+        android:layout_marginBottom="61dp">
 
         <android.support.v4.widget.NestedScrollView
             android:layout_width="match_parent"
@@ -101,10 +102,11 @@
                         android:layout_height="26dp"
                         android:background="@drawable/selector_button_stroke_main"
                         android:gravity="center"
-                        android:text="关注"
-                        android:textColor="#ff2ebef2"
-                        android:textSize="13sp"
                         android:onClick="onClickFollowTv"
+                        android:enabled="false"
+                        android:text="@string/loading"
+                        android:textColor="@color/selector_color_stoke_main_btn"
+                        android:textSize="13sp"
                         app:layout_constraintBottom_toBottomOf="@id/gc_game_app_detail_icon"
                         app:layout_constraintStart_toStartOf="@id/gc_game_app_detail_name" />
 
@@ -150,6 +152,21 @@
 
     </com.scwang.smartrefresh.layout.SmartRefreshLayout>
 
+    <View
+        android:layout_width="match_parent"
+        android:layout_height="1dp"
+        android:layout_marginBottom="60dp"
+        android:layout_alignParentBottom="true"
+        android:background="#e5e5e5" />
+
+    <TextView
+        android:id="@+id/gc_game_app_download_btn"
+        style="@style/style_button"
+        android:layout_width="match_parent"
+        android:layout_alignParentBottom="true"
+        android:onClick="onClickDownloadReceiveWelfare"
+        android:text="下载领取福利" />
+
     <com.kfzs.duanduan.view.DragRelativeLayout
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"

+ 5 - 1
app/src/main/res/layout/act_main.xml

@@ -4,7 +4,11 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent">
 
-    <include layout="@layout/common_container" />
+    <FrameLayout
+        android:id="@+id/frame_container"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_marginBottom="@dimen/bottom_height" />
 
     <com.kfzs.duanduan.view.NoScrollViewPager
         android:id="@+id/view_pager_container"

+ 5 - 0
app/src/main/res/layout/common_rv.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/recyclerView"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent" />

+ 1 - 1
app/src/main/res/layout/fgt_find.xml

@@ -2,7 +2,7 @@
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    android:background="@color/bg_gray"
+    android:background="@color/white"
     android:orientation="vertical">
 
     <View

+ 1 - 0
app/src/main/res/layout/header_user_comment_detail.xml

@@ -22,6 +22,7 @@
         android:paddingBottom="20dp">
 
         <ImageView
+            android:id="@+id/user_comment_detail_game_icon"
             android:layout_width="33dp"
             android:layout_height="33dp"
             android:src="@drawable/icon_lj" />

+ 30 - 0
app/src/main/res/layout/include_empty_view.xml

@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/empty_view"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:paddingTop="80dp"
+    android:paddingBottom="60dp"
+    android:background="@color/white">
+
+    <ImageView
+        android:id="@+id/empty_view_img"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_centerHorizontal="true"
+        android:background="@color/white"
+        android:gravity="center"
+        android:scaleType="centerInside"
+        android:src="@mipmap/wushuju"
+        android:visibility="visible" />
+
+    <TextView
+        android:id="@+id/empty_view_msg"
+        style="@style/style_empty_text"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_below="@id/empty_view_img"
+        android:layout_centerHorizontal="true"
+        android:layout_marginTop="@dimen/content_padding_big"
+        android:text="@string/wushuju" />
+</RelativeLayout>

+ 27 - 0
app/src/main/res/layout/item_activity_recommend.xml

@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:orientation="vertical"
+    android:paddingStart="8dp"
+    android:paddingTop="20dp"
+    android:paddingEnd="8dp"
+    android:paddingBottom="20dp">
+
+    <ImageView
+        android:id="@+id/item_activity_recommend_iv"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:src="@drawable/icon_lj" />
+
+    <TextView
+        android:id="@+id/item_activity_recommend_content"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="16dp"
+        android:ellipsize="end"
+        android:maxLines="2"
+        android:text="万圣节大转盘活动,大家款来参加,嗨起来..."
+        android:textColor="#ff333333"
+        android:textSize="12sp" />
+</LinearLayout>

+ 50 - 0
app/src/main/res/layout/item_article_recommend.xml

@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8"?>
+<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="240dp"
+    android:layout_height="130dp"
+    android:layout_marginStart="16dp"
+    android:background="@drawable/shape_f5_solid_rectangle_5">
+
+    <TextView
+        android:id="@+id/item_article_recommend_title"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="15dp"
+        android:ellipsize="end"
+        android:maxLines="1"
+        android:paddingStart="11dp"
+        android:paddingEnd="25dp"
+        android:text="世界OL不是什么巅峰之作、史诗巨作"
+        android:textColor="#ff333333"
+        android:textSize="12sp"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <ImageView
+        android:id="@+id/item_article_recommend_icon"
+        android:layout_width="70dp"
+        android:layout_height="70dp"
+        android:src="@drawable/icon_lj"
+        android:layout_marginEnd="11dp"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/item_article_recommend_title"
+        app:layout_constraintBottom_toBottomOf="parent"/>
+
+    <TextView
+        android:id="@+id/item_article_recommend_content"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:ellipsize="end"
+        android:maxLines="5"
+        android:paddingStart="11dp"
+        android:paddingEnd="10dp"
+        android:text="      几年前刚玩这游戏觉得非常好玩很有意思,充了点钱弄了个抉择大剑,碰到一个玩家,每天带他下副本,后来脱坑,借给他号玩,后来我的号被他拿去卖了,有一天回坑,发现角色不见了,问他,他说借给别人玩了,他也不知道,诶,其实有点失望的,但也没去深究,默默又卸载了!现在在看到这游戏也没那个心去玩了,给个五星致青春吧!"
+        android:textColor="#ff333333"
+        android:textSize="12sp"
+        app:layout_constraintEnd_toStartOf="@id/item_article_recommend_icon"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/item_article_recommend_title"
+        app:layout_constraintBottom_toBottomOf="parent"/>
+
+</android.support.constraint.ConstraintLayout>

+ 57 - 0
app/src/main/res/layout/item_gift_bag.xml

@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8"?>
+<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content">
+
+    <View
+        android:id="@+id/item_gift_bag_line_top"
+        android:layout_width="match_parent"
+        android:layout_height="1dp"
+        android:background="#f5f5f5"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <TextView
+        android:id="@+id/item_gift_bag_btn"
+        android:layout_width="68dp"
+        android:layout_height="22dp"
+        android:layout_marginTop="16dp"
+        android:layout_marginEnd="16dp"
+        android:layout_marginBottom="16dp"
+        android:gravity="center"
+        android:text="下载领取"
+        android:textColor="#ff2ebef2"
+        android:textSize="12sp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/item_gift_bag_line_top" />
+
+    <TextView
+        android:id="@+id/item_gift_bag_num"
+        android:layout_width="68dp"
+        android:layout_height="wrap_content"
+        android:layout_marginEnd="35dp"
+        android:text="剩余500份"
+        android:textColor="#ff666666"
+        android:textSize="13sp"
+        app:layout_constraintBottom_toBottomOf="@id/item_gift_bag_btn"
+        app:layout_constraintEnd_toStartOf="@id/item_gift_bag_btn"
+        app:layout_constraintTop_toTopOf="@id/item_gift_bag_btn" />
+
+    <TextView
+        android:id="@+id/item_gift_bag_name"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="16dp"
+        android:layout_marginEnd="20dp"
+        android:ellipsize="end"
+        android:maxLines="2"
+        android:text="那一剑江湖"
+        android:textColor="#ff666666"
+        android:textSize="13sp"
+        app:layout_constraintBottom_toBottomOf="@id/item_gift_bag_btn"
+        app:layout_constraintEnd_toStartOf="@id/item_gift_bag_num"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="@id/item_gift_bag_btn" />
+
+</android.support.constraint.ConstraintLayout>

+ 2 - 2
app/src/main/res/layout/try_makemoney_act_layout.xml

@@ -50,7 +50,7 @@
 
             <TextView
                 style="@style/style_ash_tv"
-                android:text="下载游戏" />
+                android:text="下载应用" />
 
             <ImageView
                 style="@style/style_ash_img"
@@ -65,7 +65,7 @@
 
             <TextView
                 style="@style/style_ash_tv"
-                android:text="试玩游戏" />
+                android:text="试玩应用" />
 
             <ImageView
                 style="@style/style_ash_img"