From dbd82cdf6559521b60599b3ce98b0ddfec5fd422 Mon Sep 17 00:00:00 2001 From: huangzhuanghua <401742778@qq.com> Date: Tue, 7 Jun 2016 18:23:29 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E9=98=85=E8=AF=BB=EF=BC=9A?= =?UTF-8?q?=E6=8E=A8=E8=8D=90=E3=80=81=E5=8E=9F=E5=88=9B=E3=80=81=E8=B5=84?= =?UTF-8?q?=E8=AE=AF=E3=80=81=E6=94=BB=E7=95=A5=E7=95=8C=E9=9D=A2UI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gh/common/util/RandomUtils.java | 44 ++ .../java/com/gh/gamecenter/MainActivity.java | 10 +- .../com/gh/gamecenter/game/Game1Fragment.java | 5 + .../gamecenter/home/HomeFragmentAdapter.java | 34 +- .../com/gh/gamecenter/read/Read1Fragment.java | 60 ++- .../gamecenter/read/Read1FragmentAdapter.java | 340 +++++++++++++- .../com/gh/gamecenter/read/Read2Fragment.java | 43 +- .../gamecenter/read/Read2FragmentAdapter.java | 261 ++++++++++- .../com/gh/gamecenter/read/Read3Fragment.java | 43 +- .../gamecenter/read/Read3FragmentAdapter.java | 338 +++++++++++++- .../com/gh/gamecenter/read/Read4Fragment.java | 43 +- .../gamecenter/read/Read4FragmentAdapter.java | 428 +++++++++++++++++- .../com/gh/gamecenter/read/ReadFragment.java | 12 + .../gh/gamecenter/read/ReadViewHolder.java | 36 ++ .../main/res/drawable-hdpi/fm_read_more.png | Bin 0 -> 3268 bytes .../main/res/drawable-hdpi/home4_selected.png | Bin 0 -> 3504 bytes .../res/drawable-hdpi/home4_unselected.png | Bin 0 -> 3505 bytes app/src/main/res/drawable-hdpi/read_eye.png | Bin 0 -> 1749 bytes .../main/res/drawable-hdpi/read_time_ago.png | Bin 0 -> 3552 bytes app/src/main/res/drawable-xhdpi/hero.png | Bin 0 -> 8910 bytes .../main/res/drawable/oval_type_red_bg.xml | 13 + .../main/res/drawable/oval_white_hint_dn.xml | 7 + .../main/res/drawable/oval_white_hint_up.xml | 10 + app/src/main/res/layout/fm_read1_slide.xml | 33 ++ app/src/main/res/layout/fm_read2_special1.xml | 26 ++ app/src/main/res/layout/fm_read2_special2.xml | 70 +++ app/src/main/res/layout/fm_read4_grid.xml | 13 + .../main/res/layout/fm_read4_grid_item.xml | 38 ++ .../main/res/layout/fm_read4_grid_more.xml | 21 + app/src/main/res/layout/fm_read4_label.xml | 17 + app/src/main/res/layout/fm_read_item.xml | 93 ++++ app/src/main/res/layout/read_fragment.xml | 96 ++-- 32 files changed, 1965 insertions(+), 169 deletions(-) create mode 100644 app/src/main/java/com/gh/common/util/RandomUtils.java create mode 100644 app/src/main/java/com/gh/gamecenter/read/ReadViewHolder.java create mode 100644 app/src/main/res/drawable-hdpi/fm_read_more.png create mode 100644 app/src/main/res/drawable-hdpi/home4_selected.png create mode 100644 app/src/main/res/drawable-hdpi/home4_unselected.png create mode 100644 app/src/main/res/drawable-hdpi/read_eye.png create mode 100644 app/src/main/res/drawable-hdpi/read_time_ago.png create mode 100644 app/src/main/res/drawable-xhdpi/hero.png create mode 100644 app/src/main/res/drawable/oval_type_red_bg.xml create mode 100644 app/src/main/res/drawable/oval_white_hint_dn.xml create mode 100644 app/src/main/res/drawable/oval_white_hint_up.xml create mode 100644 app/src/main/res/layout/fm_read1_slide.xml create mode 100644 app/src/main/res/layout/fm_read2_special1.xml create mode 100644 app/src/main/res/layout/fm_read2_special2.xml create mode 100644 app/src/main/res/layout/fm_read4_grid.xml create mode 100644 app/src/main/res/layout/fm_read4_grid_item.xml create mode 100644 app/src/main/res/layout/fm_read4_grid_more.xml create mode 100644 app/src/main/res/layout/fm_read4_label.xml create mode 100644 app/src/main/res/layout/fm_read_item.xml diff --git a/app/src/main/java/com/gh/common/util/RandomUtils.java b/app/src/main/java/com/gh/common/util/RandomUtils.java new file mode 100644 index 0000000000..96c0216b96 --- /dev/null +++ b/app/src/main/java/com/gh/common/util/RandomUtils.java @@ -0,0 +1,44 @@ +package com.gh.common.util; + +import java.util.Random; + +/** + * Created by LGT on 2016/6/7. + */ +public class RandomUtils { + + /* + * 从 size 范围内随机 count 个不重复的数字 + */ + public static int[] getRandomArray(int count, int size) { + int[] index = new int[count]; + Random random = new Random(System.currentTimeMillis()); + for (int i = 0; i < index.length; i++) { + if (i == 0) { + index[i] = random.nextInt(size); + } else { + random(random, index, i, size); + } + } + return index; + } + + private static int random(Random random, int[] index, int i, int size) { + int seed = random.nextInt(size); + for (int j = 0; j < i; j++) { + if (index[j] == seed) { + return random(random, index, i, size); + } + } + return seed; + } + + /* + * 从 size 范围内随机一个数字 + */ + public static int nextInt(int size) { + Random random = new Random(System.currentTimeMillis()); + return random.nextInt(size); + } + +} diff --git a/app/src/main/java/com/gh/gamecenter/MainActivity.java b/app/src/main/java/com/gh/gamecenter/MainActivity.java index 0287c0810c..3ffacf3cdb 100644 --- a/app/src/main/java/com/gh/gamecenter/MainActivity.java +++ b/app/src/main/java/com/gh/gamecenter/MainActivity.java @@ -37,6 +37,7 @@ import com.gh.common.util.MD5Utils; import com.gh.common.util.NetworkUtils; import com.gh.common.util.PackageUtils; import com.gh.common.util.PlatformUtils; +import com.gh.common.util.RandomUtils; import com.gh.common.util.RunningUtils; import com.gh.common.util.SpeedUtils; import com.gh.common.util.Utils; @@ -87,7 +88,6 @@ import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; -import java.util.Random; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; @@ -658,9 +658,7 @@ public class MainActivity extends BaseFragmentActivity implements if (searchHintList.size() == 1) { searchHint = searchHintList.get(0); } else { - Random random = new Random(System.currentTimeMillis()); - int index = random.nextInt(searchHintList.size()); - searchHint = searchHintList.get(index); + searchHint = searchHintList.get(RandomUtils.nextInt(searchHintList.size())); } EventBus.getDefault().post( new EBTopState("搜索", searchHintList @@ -1007,7 +1005,7 @@ public class MainActivity extends BaseFragmentActivity implements break; case 3: home4Layout.setClickable(false); - home4Image.setImageResource(R.drawable.home3_selected); + home4Image.setImageResource(R.drawable.home4_selected); home4Title.setTextColor(getResources().getColor(R.color.theme_colors)); if (readFragment == null) { readFragment = new ReadFragment(); @@ -1033,7 +1031,7 @@ public class MainActivity extends BaseFragmentActivity implements home1Image.setImageResource(R.drawable.home1_unselected); home2Image.setImageResource(R.drawable.home2_unselected); home3Image.setImageResource(R.drawable.home3_unselected); - home4Image.setImageResource(R.drawable.home3_unselected); + home4Image.setImageResource(R.drawable.home4_unselected); home1Title.setTextColor(0xFF333333); home2Title.setTextColor(0xFF333333); home3Title.setTextColor(0xFF333333); diff --git a/app/src/main/java/com/gh/gamecenter/game/Game1Fragment.java b/app/src/main/java/com/gh/gamecenter/game/Game1Fragment.java index 7a896f0686..5eb00b6295 100644 --- a/app/src/main/java/com/gh/gamecenter/game/Game1Fragment.java +++ b/app/src/main/java/com/gh/gamecenter/game/Game1Fragment.java @@ -15,6 +15,7 @@ import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; +import com.gc.materialdesign.views.ProgressBarCircularIndeterminate; import com.gh.base.AppController; import com.gh.common.constant.Constants; import com.gh.common.util.DownloadItemUtils; @@ -51,6 +52,7 @@ public class Game1Fragment extends Fragment implements OnRefreshListener { private Game1FragmentAdapter adapter; private LinearLayoutManager layoutManager; private LinearLayout reuse_no_connection; + private ProgressBarCircularIndeterminate game_pb_loading; // 黄壮华 添加 记录信息的map 修改2015/8/15 private ArrayMap locationMap; @@ -145,6 +147,9 @@ public class Game1Fragment extends Fragment implements OnRefreshListener { // 黄壮华 添加 初始化游戏状态 修改2015/8/21 DownloadItemUtils.initializeGameMap(getActivity(), gameMap); + game_pb_loading = (ProgressBarCircularIndeterminate) view.findViewById(R.id.game_pb_loading); + game_pb_loading.setVisibility(View.GONE); + reuse_no_connection = (LinearLayout) view .findViewById(R.id.reuse_no_connection); reuse_no_connection.setOnClickListener(new View.OnClickListener() { diff --git a/app/src/main/java/com/gh/gamecenter/home/HomeFragmentAdapter.java b/app/src/main/java/com/gh/gamecenter/home/HomeFragmentAdapter.java index af406cfe33..e5d9e8de19 100644 --- a/app/src/main/java/com/gh/gamecenter/home/HomeFragmentAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/home/HomeFragmentAdapter.java @@ -34,6 +34,7 @@ import com.gh.common.util.DownloadItemUtils; import com.gh.common.util.GameViewUtils; import com.gh.common.util.ImageUtils; import com.gh.common.util.NewsUtils; +import com.gh.common.util.RandomUtils; import com.gh.common.util.TimestampUtils; import com.gh.common.view.AutoScrollViewPager; import com.gh.download.DownloadEntry; @@ -379,15 +380,7 @@ public class HomeFragmentAdapter extends for (int i = 0; i < 3; i++) { concernList.add(list.remove(0)); } - int[] index = new int[2]; - Random random = new Random(System.currentTimeMillis()); - for (int i = 0; i < 2; i++) { - if (i == 0) { - index[i] = random.nextInt(list.size()); - } else { - random(random, index, i, list.size()); - } - } + int[] index = RandomUtils.getRandomArray(2, list.size()); concernList.add(list.get(index[0])); concernList.add(list.get(index[1])); } else { @@ -483,8 +476,7 @@ public class HomeFragmentAdapter extends kapaigonglueMap.put(concernList.get(i) .getGameName(), entities); } - entities.add(list.remove(random.nextInt(list - .size()))); + entities.add(list.remove(random.nextInt(list.size()))); number++; if (number == 5) { break; @@ -1021,15 +1013,7 @@ public class HomeFragmentAdapter extends kapaigonglueList.clear(); if (allKapaigonglueList == null || allKapaigonglueList.isEmpty()) { if (allNewsList.size() > 5) { - Random random = new Random(System.currentTimeMillis()); - int[] index = new int[5]; - for (int i = 0; i < index.length; i++) { - if (i == 0) { - index[i] = random.nextInt(allNewsList.size()); - } else { - index[i] = random(random, index, i, allNewsList.size()); - } - } + int[] index = RandomUtils.getRandomArray(5, allNewsList.size()); for (int i = 0; i < index.length; i++) { kapaigonglueList.add(allNewsList.get(index[i])); } @@ -1038,15 +1022,7 @@ public class HomeFragmentAdapter extends } else if (allKapaigonglueList.size() < 5) { if (allNewsList.size() > 5 - allKapaigonglueList.size()) { kapaigonglueList.addAll(allKapaigonglueList); - Random random = new Random(System.currentTimeMillis()); - int[] index = new int[5 - allKapaigonglueList.size()]; - for (int i = 0; i < index.length; i++) { - if (i == 0) { - index[i] = random.nextInt(allNewsList.size()); - } else { - index[i] = random(random, index, i, allNewsList.size()); - } - } + int[] index = RandomUtils.getRandomArray(5 - allKapaigonglueList.size(), allNewsList.size()); for (int i = 0; i < index.length; i++) { kapaigonglueList.add(allNewsList.get(index[i])); } diff --git a/app/src/main/java/com/gh/gamecenter/read/Read1Fragment.java b/app/src/main/java/com/gh/gamecenter/read/Read1Fragment.java index bea9274959..115bc0b22a 100644 --- a/app/src/main/java/com/gh/gamecenter/read/Read1Fragment.java +++ b/app/src/main/java/com/gh/gamecenter/read/Read1Fragment.java @@ -1,6 +1,7 @@ package com.gh.gamecenter.read; import android.os.Bundle; +import android.os.Handler; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v4.widget.SwipeRefreshLayout; @@ -34,32 +35,10 @@ public class Read1Fragment extends Fragment implements SwipeRefreshLayout.OnRefr view = View.inflate(getActivity(), R.layout.plugin1_fragment, null); - game_swipe_refresh = (SwipeRefreshLayout) view - .findViewById(R.id.game_swipe_refresh); + game_swipe_refresh = (SwipeRefreshLayout) view.findViewById(R.id.game_swipe_refresh); game_swipe_refresh.setColorSchemeResources(R.color.theme_colors); game_swipe_refresh.setOnRefreshListener(this); - recyclerview = (RecyclerView) view.findViewById(R.id.game_list); - recyclerview.setHasFixedSize(true); - layoutManager = new LinearLayoutManager(getActivity()); - recyclerview.setLayoutManager(layoutManager); - adapter = new Read1FragmentAdapter(); - 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.getList().size()) { -// -// } - } - - }); - recyclerview.addItemDecoration(new VerticalItemDecoration(getActivity(), 1)); - game_pb_loading = (ProgressBarCircularIndeterminate) view.findViewById(R.id.game_pb_loading); reuse_no_connection = (LinearLayout) view.findViewById(R.id.reuse_no_connection); @@ -72,6 +51,28 @@ public class Read1Fragment extends Fragment implements SwipeRefreshLayout.OnRefr reuse_no_connection.setVisibility(View.GONE); } }); + + recyclerview = (RecyclerView) view.findViewById(R.id.game_list); + recyclerview.setHasFixedSize(true); + layoutManager = new LinearLayoutManager(getActivity()); + recyclerview.setLayoutManager(layoutManager); + adapter = new Read1FragmentAdapter(getActivity(), game_swipe_refresh, game_pb_loading, + reuse_no_connection, true); + 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.getNewsList().size()) { +// +// } + } + + }); + recyclerview.addItemDecoration(new VerticalItemDecoration(getActivity(), 1)); } @Nullable @@ -83,8 +84,19 @@ public class Read1Fragment extends Fragment implements SwipeRefreshLayout.OnRefr return view; } + private Handler handler = new Handler(); + + Runnable runnable = new Runnable() { + @Override + public void run() { + adapter = new Read1FragmentAdapter(getActivity(), game_swipe_refresh, game_pb_loading, + reuse_no_connection, true); + recyclerview.setAdapter(adapter); + } + }; + @Override public void onRefresh() { - + handler.postDelayed(runnable, 1000); } } diff --git a/app/src/main/java/com/gh/gamecenter/read/Read1FragmentAdapter.java b/app/src/main/java/com/gh/gamecenter/read/Read1FragmentAdapter.java index 0bfab1a7ad..aba52c2e94 100644 --- a/app/src/main/java/com/gh/gamecenter/read/Read1FragmentAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/read/Read1FragmentAdapter.java @@ -1,40 +1,370 @@ package com.gh.gamecenter.read; +import android.app.Activity; +import android.content.Context; +import android.support.v4.view.ViewPager; +import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.widget.RecyclerView; +import android.text.TextUtils; +import android.util.DisplayMetrics; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; +import android.widget.TextView; +import com.android.volley.Response; +import com.android.volley.VolleyError; +import com.gc.materialdesign.views.ProgressBarCircularIndeterminate; +import com.gh.base.AppController; +import com.gh.common.util.DisplayUtils; +import com.gh.common.util.ImageUtils; +import com.gh.common.view.AutoScrollViewPager; import com.gh.gamecenter.R; +import com.gh.gamecenter.adapter.RecyclingPagerAdapter; +import com.gh.gamecenter.adapter.viewholder.FooterViewHolder; +import com.gh.gamecenter.entity.NewsEntity; +import com.gh.gamecenter.volley.extended.JsonArrayExtendedRequest; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; + +import org.json.JSONArray; + +import java.lang.reflect.Type; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; /** * Created by LGT on 2016/6/3. */ public class Read1FragmentAdapter extends RecyclerView.Adapter { - public Read1FragmentAdapter() { + private Activity activity; + private Context context; + private SwipeRefreshLayout game_swipe_refresh; + private ProgressBarCircularIndeterminate game_pb_loading; + private LinearLayout reuse_no_connection; + + private List slideList; + private List newsList; + + private boolean isLoading; + private boolean isSlideError; + + public Read1FragmentAdapter(Activity act, + SwipeRefreshLayout swipeRefreshLayout, + ProgressBarCircularIndeterminate pbLoading, + LinearLayout noConnection, + boolean isLoad) { + activity = act; + context = activity; + game_swipe_refresh = swipeRefreshLayout; + game_pb_loading = pbLoading; + reuse_no_connection = noConnection; + + slideList = new ArrayList(); + newsList = new ArrayList(); + + isLoading = false; + isSlideError = false; + + if (isLoad) { + load(); + } + } + + public void load() { + new Thread(runnable){}.start(); + } + + Runnable runnable = new Runnable() { + @Override + public void run() { + initSlide(); + addList(0); + } + }; + + public void addList(final int offset) { + if (isLoading) { + return; + } + isLoading = true; + String url = "http://api.ghzhushou.com/gapi/v1d0/game/55097638fc1a6fa45f8b4568/news?limit=20&offset=" + offset; + JsonArrayExtendedRequest request = new JsonArrayExtendedRequest(url, + new Response.Listener() { + @Override + public void onResponse(JSONArray response) { + Type listType = new TypeToken>() {}.getType(); + Gson gson = new Gson(); + List list = gson.fromJson(response.toString(), listType); + for (int i = 0; i < list.size(); i++) { + newsList.add(list.get(i)); + notifyItemInserted(newsList.size()); + } + + if (offset == 0 && game_swipe_refresh.isRefreshing()) { + game_swipe_refresh.setRefreshing(false); + } + if (game_pb_loading.getVisibility() == View.VISIBLE) { + game_pb_loading.setVisibility(View.GONE); + } + isLoading = false; + } + }, new Response.ErrorListener() { + @Override + public void onErrorResponse(VolleyError error) { + isLoading = false; + } + }); + AppController.addToRequestQueue(request, Read1Fragment.class.getSimpleName()); + } + + private void initSlide() { + String url = "http://api.ghzhushou.com/gapi/v1d0/index/slide?game_id=55097638fc1a6fa45f8b4568"; + JsonArrayExtendedRequest request = new JsonArrayExtendedRequest(url, + new Response.Listener() { + @Override + public void onResponse(JSONArray response) { + Type listType = new TypeToken>() {}.getType(); + Gson gson = new Gson(); + slideList = gson.fromJson(response.toString(), listType); + if (slideList != null) { + notifyItemChanged(0); + } + } + }, new Response.ErrorListener() { + @Override + public void onErrorResponse(VolleyError error) { + + } + }); + AppController.addToRequestQueue(request, Read1Fragment.class.getSimpleName()); + } + + public List getNewsList() { + return newsList; + } + + public boolean isLoading() { + return isLoading; + } + + class ReadSlideViewHolder extends RecyclerView.ViewHolder { + private AutoScrollViewPager viewPager; + private LinearLayout viewpager_ll_hint; + private TextView viewpager_tv_failure; + + public ReadSlideViewHolder(View v) { + super(v); + viewpager_tv_failure = (TextView) v.findViewById(R.id.viewpager_tv_failure); + viewpager_tv_failure.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + isSlideError = false; + notifyItemChanged(0); + initSlide(); + } + }); + viewpager_ll_hint = (LinearLayout) v.findViewById(R.id.viewpager_ll_hint); + viewPager = (AutoScrollViewPager) v.findViewById(R.id.view_pager); + viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + + @Override + public void onPageSelected(int position) { + for (int i = 0, size = viewpager_ll_hint.getChildCount(); i < size; i++) { + if (i == position % size) { + ((ImageView) viewpager_ll_hint.getChildAt(i)) + .setImageResource(R.drawable.oval_white_hint_dn); + } else { + ((ImageView) viewpager_ll_hint.getChildAt(i)) + .setImageResource(R.drawable.oval_white_hint_up); + } + } + } + + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { + + } + + @Override + public void onPageScrollStateChanged(int state) { + // 解决viewpager和SwipeRefreshLayout滑动冲突 + if (state == ViewPager.SCROLL_STATE_DRAGGING) { + game_swipe_refresh.setEnabled(false); + } else { + game_swipe_refresh.setEnabled(true); + } + } + }); + } + + } + + class ReadSlideAdapter extends RecyclingPagerAdapter { + + private Context mContext; + + private List mSlideList; + + public ReadSlideAdapter(Context context, List list) { + mContext = context; + mSlideList = list; + } + + @Override + public int getCount() { + return Integer.MAX_VALUE; + } + + @Override + public View getView(int position, View convertView, ViewGroup container) { + ImageView imageView = new ImageView(mContext); + ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT); + imageView.setLayoutParams(params); + ImageUtils.getInstance(mContext).display(mSlideList.get(position % mSlideList.size()), + imageView, R.drawable.preload); + return imageView; + } } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - View view = LayoutInflater.from(parent.getContext()).inflate( - R.layout.plugin1_autoscrollviewpager_viewholder, parent, false); - return null; + if (viewType == 0) { + View view = LayoutInflater.from(parent.getContext()).inflate( + R.layout.fm_read1_slide, parent, false); + DisplayMetrics outMetrics = new DisplayMetrics(); + activity.getWindowManager().getDefaultDisplay().getMetrics(outMetrics); + int height = (int) (outMetrics.widthPixels / 2f); + ViewGroup.LayoutParams params = new ViewGroup.LayoutParams( + LinearLayout.LayoutParams.MATCH_PARENT, height); + view.setLayoutParams(params); + return new ReadSlideViewHolder(view); + } else if (viewType > 0 && viewType <= newsList.size()) { + View view = LayoutInflater.from(parent.getContext()).inflate( + R.layout.fm_read_item, parent, false); + return new ReadViewHolder(view); + } else { + View view = LayoutInflater.from(parent.getContext()).inflate( + R.layout.refresh_footerview, parent, false); + return new FooterViewHolder(view); + } } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { + if (holder instanceof ReadSlideViewHolder) { + ReadSlideViewHolder viewHolder = (ReadSlideViewHolder) holder; + if (isSlideError) { + viewHolder.viewpager_tv_failure.setVisibility(View.VISIBLE); + viewHolder.viewPager.setVisibility(View.GONE); + viewHolder.viewpager_ll_hint.setVisibility(View.GONE); + } else { + viewHolder.viewpager_tv_failure.setVisibility(View.GONE); + viewHolder.viewPager.setVisibility(View.VISIBLE); + viewHolder.viewpager_ll_hint.setVisibility(View.VISIBLE); + } + if (slideList.size() > 0) { + int currentItem = 0; + if (viewHolder.viewPager.getAdapter() != null) { + currentItem = viewHolder.viewPager.getCurrentItem(); + } + RelativeLayout.LayoutParams rparams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, + RelativeLayout.LayoutParams.WRAP_CONTENT); + rparams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); + rparams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); + rparams.addRule(RelativeLayout.CENTER_HORIZONTAL); + viewHolder.viewpager_ll_hint.setLayoutParams(rparams); + viewHolder.viewpager_ll_hint.removeAllViews(); + for (int i = 0, size = slideList.size(); i < size; i++) { + ImageView imageView = new ImageView(context); + LinearLayout.LayoutParams lparams = new LinearLayout.LayoutParams( + DisplayUtils.dip2px(context, 5), + DisplayUtils.dip2px(context, 5)); + lparams.bottomMargin = DisplayUtils.dip2px(context, 8); + lparams.rightMargin = DisplayUtils.dip2px(context, 8); + if (i == currentItem) { + imageView.setImageResource(R.drawable.oval_white_hint_dn); + } else { + imageView.setImageResource(R.drawable.oval_white_hint_up); + } + imageView.setLayoutParams(lparams); + viewHolder.viewpager_ll_hint.addView(imageView); + } + viewHolder.viewPager.setAdapter(new ReadSlideAdapter(context, slideList)); + viewHolder.viewPager.setCurrentItem(currentItem); + viewHolder.viewPager.setInterval(3000); + viewHolder.viewPager.startAutoScroll(); + } + } else if (holder instanceof ReadViewHolder) { + ReadViewHolder viewHolder = (ReadViewHolder) holder; + NewsEntity newsEntity = newsList.get(position - 1); + viewHolder.view.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + } + }); + if (TextUtils.isEmpty(newsEntity.getThumb())) { + String[] urls = {"http://image.ghzhushou.com/pic/56a05b058ab49ecd048b457a.jpg", + "http://image.ghzhushou.com/pic/56a9dc3b8ab49e58138b457f.jpg", + "http://image.ghzhushou.com/pic/56ac27e58ab49e47448b456d.jpg", + "http://image.ghzhushou.com/pic/56b177f68ab49ea9438b4569.jpg", + "http://image.ghzhushou.com/pic/56b3695a8ab49e1f2d8b4567.jpg"}; + ImageUtils.getInstance(context).display(urls[position % 5], viewHolder.fm_read_iv_thumb); + } else { + ImageUtils.getInstance(context).display(newsEntity.getThumb(), viewHolder.fm_read_iv_thumb); + } + viewHolder.fm_read_tv_title.setText(newsEntity.getTitle()); + viewHolder.fm_read_tv_time.setText(getTimeAgo(Long.valueOf(newsEntity.getPublishOn()))); + viewHolder.fm_read_tv_read.setText("211次浏览"); + } else if (holder instanceof FooterViewHolder) { + FooterViewHolder viewHolder = (FooterViewHolder) holder; + viewHolder.footerview_progressbar.setVisibility(View.GONE); + viewHolder.footerview_tv_loading.setText("点击加载更多"); + viewHolder.rootView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + addList(newsList.size()); + } + }); + } } @Override public int getItemCount() { - return 0; + if (newsList.isEmpty()){ + return 0; + } + return 1 + newsList.size() + 1; } @Override public int getItemViewType(int position) { return position; } + + //根据提供的时间,返回该时间与当前时间的差距 + private String getTimeAgo(long time) { + long now = System.currentTimeMillis() / 1000; + long gap = now - time; + if (gap <= 60) { + return "1分钟前"; + } else if (gap > 60 && gap < 3600) { + return Math.floor(gap / 60) + "分钟前"; + } else if (gap >= 3600 && gap < 86400) { + return Math.floor(gap / 3600) + "小时前"; + } else { + SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日", Locale.getDefault()); + return format.format(time * 1000); + } + } + } diff --git a/app/src/main/java/com/gh/gamecenter/read/Read2Fragment.java b/app/src/main/java/com/gh/gamecenter/read/Read2Fragment.java index 8410b16bf7..7eeba9ea41 100644 --- a/app/src/main/java/com/gh/gamecenter/read/Read2Fragment.java +++ b/app/src/main/java/com/gh/gamecenter/read/Read2Fragment.java @@ -1,6 +1,7 @@ package com.gh.gamecenter.read; import android.os.Bundle; +import android.os.Handler; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v4.widget.SwipeRefreshLayout; @@ -39,11 +40,25 @@ public class Read2Fragment extends Fragment implements SwipeRefreshLayout.OnRefr game_swipe_refresh.setColorSchemeResources(R.color.theme_colors); game_swipe_refresh.setOnRefreshListener(this); + game_pb_loading = (ProgressBarCircularIndeterminate) view.findViewById(R.id.game_pb_loading); + + reuse_no_connection = (LinearLayout) view.findViewById(R.id.reuse_no_connection); + reuse_no_connection.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + game_swipe_refresh.setRefreshing(true); + recyclerview.setVisibility(View.VISIBLE); + game_pb_loading.setVisibility(View.VISIBLE); + reuse_no_connection.setVisibility(View.GONE); + } + }); + recyclerview = (RecyclerView) view.findViewById(R.id.game_list); recyclerview.setHasFixedSize(true); layoutManager = new LinearLayoutManager(getActivity()); recyclerview.setLayoutManager(layoutManager); - adapter = new Read2FragmentAdapter(); + adapter = new Read2FragmentAdapter(getActivity(), game_swipe_refresh, + game_pb_loading, reuse_no_connection, true); recyclerview.setAdapter(adapter); recyclerview.setOnScrollListener(new RecyclerView.OnScrollListener() { @@ -59,19 +74,6 @@ public class Read2Fragment extends Fragment implements SwipeRefreshLayout.OnRefr }); recyclerview.addItemDecoration(new VerticalItemDecoration(getActivity(), 1)); - - game_pb_loading = (ProgressBarCircularIndeterminate) view.findViewById(R.id.game_pb_loading); - - reuse_no_connection = (LinearLayout) view.findViewById(R.id.reuse_no_connection); - reuse_no_connection.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - game_swipe_refresh.setRefreshing(true); - recyclerview.setVisibility(View.VISIBLE); - game_pb_loading.setVisibility(View.VISIBLE); - reuse_no_connection.setVisibility(View.GONE); - } - }); } @Nullable @@ -83,8 +85,19 @@ public class Read2Fragment extends Fragment implements SwipeRefreshLayout.OnRefr return view; } + private Handler handler = new Handler(); + + Runnable runnable = new Runnable() { + @Override + public void run() { + adapter = new Read2FragmentAdapter(getActivity(), game_swipe_refresh, + game_pb_loading, reuse_no_connection, true); + recyclerview.setAdapter(adapter); + } + }; + @Override public void onRefresh() { - + handler.postDelayed(runnable, 1000); } } diff --git a/app/src/main/java/com/gh/gamecenter/read/Read2FragmentAdapter.java b/app/src/main/java/com/gh/gamecenter/read/Read2FragmentAdapter.java index ee69dc777e..08e48d5bd4 100644 --- a/app/src/main/java/com/gh/gamecenter/read/Read2FragmentAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/read/Read2FragmentAdapter.java @@ -1,40 +1,289 @@ package com.gh.gamecenter.read; +import android.app.Activity; +import android.content.Context; +import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.widget.RecyclerView; +import android.text.TextUtils; +import android.util.DisplayMetrics; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; +import com.android.volley.Response; +import com.android.volley.VolleyError; +import com.gc.materialdesign.views.ProgressBarCircularIndeterminate; +import com.gh.base.AppController; +import com.gh.common.util.DisplayUtils; +import com.gh.common.util.ImageUtils; import com.gh.gamecenter.R; +import com.gh.gamecenter.adapter.viewholder.FooterViewHolder; +import com.gh.gamecenter.entity.NewsEntity; +import com.gh.gamecenter.volley.extended.JsonArrayExtendedRequest; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; + +import org.json.JSONArray; + +import java.lang.reflect.Type; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; /** * Created by LGT on 2016/6/3. */ public class Read2FragmentAdapter extends RecyclerView.Adapter { - public Read2FragmentAdapter() { + private Activity activity; + private Context context; + private SwipeRefreshLayout game_swipe_refresh; + private ProgressBarCircularIndeterminate game_pb_loading; + private LinearLayout reuse_no_connection; + private List slideList; + private List newsList; + + private boolean isLoading; + private boolean isSlideError; + + public Read2FragmentAdapter(Activity act, + SwipeRefreshLayout swipeRefreshLayout, + ProgressBarCircularIndeterminate pbLoading, + LinearLayout noConnection, + boolean isLoad) { + activity = act; + context = activity; + game_swipe_refresh = swipeRefreshLayout; + game_pb_loading = pbLoading; + reuse_no_connection = noConnection; + + slideList = new ArrayList(); + newsList = new ArrayList(); + + isLoading = false; + isSlideError = false; + + if (isLoad) { + load(); + } + } + + public void load() { + new Thread(runnable){}.start(); + } + + Runnable runnable = new Runnable() { + @Override + public void run() { + addList(0); + } + }; + + public void addList(final int offset) { + if (isLoading) { + return; + } + isLoading = true; + String url = "http://api.ghzhushou.com/gapi/v1d0/game/55097638fc1a6fa45f8b4568/news?limit=20&offset=" + offset; + JsonArrayExtendedRequest request = new JsonArrayExtendedRequest(url, + new Response.Listener() { + @Override + public void onResponse(JSONArray response) { + Type listType = new TypeToken>() {}.getType(); + Gson gson = new Gson(); + List list = gson.fromJson(response.toString(), listType); + for (int i = 0; i < list.size(); i++) { + newsList.add(list.get(i)); + notifyItemInserted(newsList.size()); + } + + if (offset == 0 && game_swipe_refresh.isRefreshing()) { + game_swipe_refresh.setRefreshing(false); + } + if (game_pb_loading.getVisibility() == View.VISIBLE) { + game_pb_loading.setVisibility(View.GONE); + } + isLoading = false; + } + }, new Response.ErrorListener() { + @Override + public void onErrorResponse(VolleyError error) { + isLoading = false; + } + }); + AppController.addToRequestQueue(request, Read2Fragment.class.getSimpleName()); + } + + public List getNewsList() { + return newsList; + } + + public boolean isLoading() { + return isLoading; + } + + private class ReadSpecial1ViewHolder extends RecyclerView.ViewHolder{ + + private View view; + private TextView fm_read2_special1_title; + private ImageView fm_read2_special1_thumb; + + public ReadSpecial1ViewHolder(View itemView) { + super(itemView); + + view = itemView; + fm_read2_special1_title = (TextView) itemView.findViewById(R.id.fm_read2_special1_title); + fm_read2_special1_thumb = (ImageView) itemView.findViewById(R.id.fm_read2_special1_thumb); + + } + } + + private class ReadSpecial2ViewHolder extends RecyclerView.ViewHolder{ + + private View view; + private TextView fm_read2_special2_title; + private ImageView fm_read2_special1_thumb1, fm_read2_special1_thumb2, + fm_read2_special1_thumb3; + + public ReadSpecial2ViewHolder(View itemView) { + super(itemView); + + view = itemView; + fm_read2_special2_title = (TextView) itemView.findViewById(R.id.fm_read2_special2_title); + fm_read2_special1_thumb1 = (ImageView) itemView.findViewById(R.id.fm_read2_special1_thumb1); + fm_read2_special1_thumb2 = (ImageView) itemView.findViewById(R.id.fm_read2_special1_thumb2); + fm_read2_special1_thumb3 = (ImageView) itemView.findViewById(R.id.fm_read2_special1_thumb3); + + } } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - View view = LayoutInflater.from(parent.getContext()).inflate( - R.layout.plugin1_autoscrollviewpager_viewholder, parent, false); - return null; + if (viewType == ITEM_TYPE.normal) { + View view = LayoutInflater.from(parent.getContext()).inflate( + R.layout.fm_read_item, parent, false); + return new ReadViewHolder(view); + } else if (viewType == ITEM_TYPE.special1) { + View view = LayoutInflater.from(parent.getContext()).inflate( + R.layout.fm_read2_special1, parent, false); + return new ReadSpecial1ViewHolder(view); + } else if (viewType == ITEM_TYPE.special2) { + View view = LayoutInflater.from(parent.getContext()).inflate( + R.layout.fm_read2_special2, parent, false); + return new ReadSpecial2ViewHolder(view); + } else { + View view = LayoutInflater.from(parent.getContext()).inflate( + R.layout.refresh_footerview, parent, false); + return new FooterViewHolder(view); + } } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { + if (holder instanceof ReadViewHolder) { + ReadViewHolder viewHolder = (ReadViewHolder) holder; + NewsEntity newsEntity = newsList.get(position); + viewHolder.view.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + } + }); + if (TextUtils.isEmpty(newsEntity.getThumb())) { + String[] urls = {"http://image.ghzhushou.com/pic/56a05b058ab49ecd048b457a.jpg", + "http://image.ghzhushou.com/pic/56a9dc3b8ab49e58138b457f.jpg", + "http://image.ghzhushou.com/pic/56ac27e58ab49e47448b456d.jpg", + "http://image.ghzhushou.com/pic/56b177f68ab49ea9438b4569.jpg", + "http://image.ghzhushou.com/pic/56b3695a8ab49e1f2d8b4567.jpg"}; + ImageUtils.getInstance(context).display(urls[position % 5], viewHolder.fm_read_iv_thumb); + } else { + ImageUtils.getInstance(context).display(newsEntity.getThumb(), viewHolder.fm_read_iv_thumb); + } + viewHolder.fm_read_tv_title.setText(newsEntity.getTitle()); + viewHolder.fm_read_tv_time.setText(getTimeAgo(Long.valueOf(newsEntity.getPublishOn()))); + viewHolder.fm_read_tv_read.setText("211次浏览"); + } else if (holder instanceof ReadSpecial1ViewHolder) { + ReadSpecial1ViewHolder viewHolder = (ReadSpecial1ViewHolder) holder; + DisplayMetrics outMetrics = new DisplayMetrics(); + activity.getWindowManager().getDefaultDisplay().getMetrics(outMetrics); + int height = (int) (outMetrics.widthPixels / 3f) - DisplayUtils.dip2px(context, 8); + LinearLayout.LayoutParams lparams = new LinearLayout.LayoutParams( + LinearLayout.LayoutParams.MATCH_PARENT, height); + lparams.topMargin = DisplayUtils.dip2px(context, 8); + viewHolder.fm_read2_special1_thumb.setLayoutParams(lparams); + ImageUtils.getInstance(context).display("http://image.ghzhushou.com/pic/572ff6b08ab49e5c048b4615.jpg", + viewHolder.fm_read2_special1_thumb); + } else if (holder instanceof ReadSpecial2ViewHolder) { + ReadSpecial2ViewHolder viewHolder = (ReadSpecial2ViewHolder) holder; + ImageUtils.getInstance(context).display("http://image.ghzhushou.com/pic/5743c8fb8ab49e96118b4571.jpg", + viewHolder.fm_read2_special1_thumb1); + ImageUtils.getInstance(context).display("http://image.ghzhushou.com/pic/573d89ec8ab49ec97a8b456c.jpg", + viewHolder.fm_read2_special1_thumb2); + ImageUtils.getInstance(context).display("http://image.ghzhushou.com/pic/572064e68ab49eaf138b456a.jpg", + viewHolder.fm_read2_special1_thumb3); + } else if (holder instanceof FooterViewHolder) { + FooterViewHolder viewHolder = (FooterViewHolder) holder; + viewHolder.footerview_progressbar.setVisibility(View.GONE); + viewHolder.footerview_tv_loading.setText("点击加载更多"); + viewHolder.rootView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + addList(newsList.size()); + } + }); + } } @Override public int getItemCount() { - return 0; + if (newsList.isEmpty()){ + return 0; + } + return newsList.size() + 1; + } + + class ITEM_TYPE { + + public static final int normal = 0;//正常布局 + public static final int special1 = 1;//一张1:3图 + public static final int special2 = 2;//三张4:3图 + public static final int footer = 3;//页脚 + } @Override public int getItemViewType(int position) { - return position; + if (position == 1) { + return ITEM_TYPE.special1; + } + if (position == 2) { + return ITEM_TYPE.special2; + } + if (position == newsList.size()) { + return ITEM_TYPE.footer; + } + return ITEM_TYPE.normal; } + + //根据提供的时间,返回该时间与当前时间的差距 + private String getTimeAgo(long time) { + long now = System.currentTimeMillis() / 1000; + long gap = now - time; + if (gap <= 60) { + return "1分钟前"; + } else if (gap > 60 && gap < 3600) { + return Math.floor(gap / 60) + "分钟前"; + } else if (gap >= 3600 && gap < 86400) { + return Math.floor(gap / 3600) + "小时前"; + } else { + SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日", Locale.getDefault()); + return format.format(time * 1000); + } + } + } diff --git a/app/src/main/java/com/gh/gamecenter/read/Read3Fragment.java b/app/src/main/java/com/gh/gamecenter/read/Read3Fragment.java index ff76fe203c..0a246ea846 100644 --- a/app/src/main/java/com/gh/gamecenter/read/Read3Fragment.java +++ b/app/src/main/java/com/gh/gamecenter/read/Read3Fragment.java @@ -1,6 +1,7 @@ package com.gh.gamecenter.read; import android.os.Bundle; +import android.os.Handler; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v4.widget.SwipeRefreshLayout; @@ -39,11 +40,25 @@ public class Read3Fragment extends Fragment implements SwipeRefreshLayout.OnRefr game_swipe_refresh.setColorSchemeResources(R.color.theme_colors); game_swipe_refresh.setOnRefreshListener(this); + game_pb_loading = (ProgressBarCircularIndeterminate) view.findViewById(R.id.game_pb_loading); + + reuse_no_connection = (LinearLayout) view.findViewById(R.id.reuse_no_connection); + reuse_no_connection.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + game_swipe_refresh.setRefreshing(true); + recyclerview.setVisibility(View.VISIBLE); + game_pb_loading.setVisibility(View.VISIBLE); + reuse_no_connection.setVisibility(View.GONE); + } + }); + recyclerview = (RecyclerView) view.findViewById(R.id.game_list); recyclerview.setHasFixedSize(true); layoutManager = new LinearLayoutManager(getActivity()); recyclerview.setLayoutManager(layoutManager); - adapter = new Read3FragmentAdapter(); + adapter = new Read3FragmentAdapter(getActivity(), game_swipe_refresh, + game_pb_loading, reuse_no_connection, true); recyclerview.setAdapter(adapter); recyclerview.setOnScrollListener(new RecyclerView.OnScrollListener() { @@ -59,19 +74,6 @@ public class Read3Fragment extends Fragment implements SwipeRefreshLayout.OnRefr }); recyclerview.addItemDecoration(new VerticalItemDecoration(getActivity(), 1)); - - game_pb_loading = (ProgressBarCircularIndeterminate) view.findViewById(R.id.game_pb_loading); - - reuse_no_connection = (LinearLayout) view.findViewById(R.id.reuse_no_connection); - reuse_no_connection.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - game_swipe_refresh.setRefreshing(true); - recyclerview.setVisibility(View.VISIBLE); - game_pb_loading.setVisibility(View.VISIBLE); - reuse_no_connection.setVisibility(View.GONE); - } - }); } @Nullable @@ -83,8 +85,19 @@ public class Read3Fragment extends Fragment implements SwipeRefreshLayout.OnRefr return view; } + private Handler handler = new Handler(); + + Runnable runnable = new Runnable() { + @Override + public void run() { + adapter = new Read3FragmentAdapter(getActivity(), game_swipe_refresh, + game_pb_loading, reuse_no_connection, true); + recyclerview.setAdapter(adapter); + } + }; + @Override public void onRefresh() { - + handler.postDelayed(runnable, 1000); } } diff --git a/app/src/main/java/com/gh/gamecenter/read/Read3FragmentAdapter.java b/app/src/main/java/com/gh/gamecenter/read/Read3FragmentAdapter.java index ac1f47b888..0684c6a6b2 100644 --- a/app/src/main/java/com/gh/gamecenter/read/Read3FragmentAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/read/Read3FragmentAdapter.java @@ -1,40 +1,368 @@ package com.gh.gamecenter.read; +import android.app.Activity; +import android.content.Context; +import android.support.v4.view.ViewPager; +import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.widget.RecyclerView; +import android.text.TextUtils; +import android.util.DisplayMetrics; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; +import android.widget.TextView; +import com.android.volley.Response; +import com.android.volley.VolleyError; +import com.gc.materialdesign.views.ProgressBarCircularIndeterminate; +import com.gh.base.AppController; +import com.gh.common.util.DisplayUtils; +import com.gh.common.util.ImageUtils; +import com.gh.common.view.AutoScrollViewPager; import com.gh.gamecenter.R; +import com.gh.gamecenter.adapter.RecyclingPagerAdapter; +import com.gh.gamecenter.adapter.viewholder.FooterViewHolder; +import com.gh.gamecenter.entity.NewsEntity; +import com.gh.gamecenter.volley.extended.JsonArrayExtendedRequest; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; + +import org.json.JSONArray; + +import java.lang.reflect.Type; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; /** * Created by LGT on 2016/6/3. */ public class Read3FragmentAdapter extends RecyclerView.Adapter { - public Read3FragmentAdapter() { + private Activity activity; + private Context context; + private SwipeRefreshLayout game_swipe_refresh; + private ProgressBarCircularIndeterminate game_pb_loading; + private LinearLayout reuse_no_connection; + + private List slideList; + private List newsList; + + private boolean isLoading; + private boolean isSlideError; + + public Read3FragmentAdapter(Activity act, + SwipeRefreshLayout swipeRefreshLayout, + ProgressBarCircularIndeterminate pbLoading, + LinearLayout noConnection, + boolean isLoad) { + activity = act; + context = activity; + game_swipe_refresh = swipeRefreshLayout; + game_pb_loading = pbLoading; + reuse_no_connection = noConnection; + + slideList = new ArrayList(); + newsList = new ArrayList(); + + isLoading = false; + isSlideError = false; + + if (isLoad) { + load(); + } + } + + public void load() { + new Thread(runnable){}.start(); + } + + Runnable runnable = new Runnable() { + @Override + public void run() { + initSlide(); + addList(0); + } + }; + + public void addList(final int offset) { + if (isLoading) { + return; + } + isLoading = true; + String url = "http://api.ghzhushou.com/gapi/v1d0/game/55097638fc1a6fa45f8b4568/news?limit=20&offset=" + offset; + JsonArrayExtendedRequest request = new JsonArrayExtendedRequest(url, + new Response.Listener() { + @Override + public void onResponse(JSONArray response) { + Type listType = new TypeToken>() {}.getType(); + Gson gson = new Gson(); + List list = gson.fromJson(response.toString(), listType); + for (int i = 0; i < list.size(); i++) { + newsList.add(list.get(i)); + notifyItemInserted(newsList.size()); + } + + if (offset == 0 && game_swipe_refresh.isRefreshing()) { + game_swipe_refresh.setRefreshing(false); + } + if (game_pb_loading.getVisibility() == View.VISIBLE) { + game_pb_loading.setVisibility(View.GONE); + } + isLoading = false; + } + }, new Response.ErrorListener() { + @Override + public void onErrorResponse(VolleyError error) { + isLoading = false; + } + }); + AppController.addToRequestQueue(request, Read3Fragment.class.getSimpleName()); + } + + private void initSlide() { + String url = "http://api.ghzhushou.com/gapi/v1d0/index/slide?game_id=55097638fc1a6fa45f8b4568"; + JsonArrayExtendedRequest request = new JsonArrayExtendedRequest(url, + new Response.Listener() { + @Override + public void onResponse(JSONArray response) { + Type listType = new TypeToken>() {}.getType(); + Gson gson = new Gson(); + slideList = gson.fromJson(response.toString(), listType); + if (slideList != null) { + notifyItemChanged(0); + } + } + }, new Response.ErrorListener() { + @Override + public void onErrorResponse(VolleyError error) { + + } + }); + AppController.addToRequestQueue(request, Read3Fragment.class.getSimpleName()); + } + + public List getNewsList() { + return newsList; + } + + public boolean isLoading() { + return isLoading; + } + + class ReadSlideViewHolder extends RecyclerView.ViewHolder { + private AutoScrollViewPager viewPager; + private LinearLayout viewpager_ll_hint; + private TextView viewpager_tv_failure; + + public ReadSlideViewHolder(View v) { + super(v); + viewpager_tv_failure = (TextView) v.findViewById(R.id.viewpager_tv_failure); + viewpager_tv_failure.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + isSlideError = false; + notifyItemChanged(0); + initSlide(); + } + }); + viewpager_ll_hint = (LinearLayout) v.findViewById(R.id.viewpager_ll_hint); + viewPager = (AutoScrollViewPager) v.findViewById(R.id.view_pager); + viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + + @Override + public void onPageSelected(int position) { + for (int i = 0, size = viewpager_ll_hint.getChildCount(); i < size; i++) { + if (i == position % size) { + ((ImageView) viewpager_ll_hint.getChildAt(i)) + .setImageResource(R.drawable.oval_white_hint_dn); + } else { + ((ImageView) viewpager_ll_hint.getChildAt(i)) + .setImageResource(R.drawable.oval_white_hint_up); + } + } + } + + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { + + } + + @Override + public void onPageScrollStateChanged(int state) { + // 解决viewpager和SwipeRefreshLayout滑动冲突 + if (state == ViewPager.SCROLL_STATE_DRAGGING) { + game_swipe_refresh.setEnabled(false); + } else { + game_swipe_refresh.setEnabled(true); + } + } + }); + } + + } + + class ReadSlideAdapter extends RecyclingPagerAdapter { + + private Context mContext; + + private List mSlideList; + + public ReadSlideAdapter(Context context, List list) { + mContext = context; + mSlideList = list; + } + + @Override + public int getCount() { + return Integer.MAX_VALUE; + } + + @Override + public View getView(int position, View convertView, ViewGroup container) { + ImageView imageView = new ImageView(mContext); + ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT); + imageView.setLayoutParams(params); + ImageUtils.getInstance(mContext).display(mSlideList.get(position % mSlideList.size()), + imageView, R.drawable.preload); + return imageView; + } } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - View view = LayoutInflater.from(parent.getContext()).inflate( - R.layout.plugin1_autoscrollviewpager_viewholder, parent, false); - return null; + if (viewType == 0) { + View view = LayoutInflater.from(parent.getContext()).inflate( + R.layout.fm_read1_slide, parent, false); + DisplayMetrics outMetrics = new DisplayMetrics(); + activity.getWindowManager().getDefaultDisplay().getMetrics(outMetrics); + int height = (int) (outMetrics.widthPixels / 2f); + ViewGroup.LayoutParams params = new ViewGroup.LayoutParams( + LinearLayout.LayoutParams.MATCH_PARENT, height); + view.setLayoutParams(params); + return new ReadSlideViewHolder(view); + } else if (viewType > 0 && viewType <= newsList.size()) { + View view = LayoutInflater.from(parent.getContext()).inflate( + R.layout.fm_read_item, parent, false); + return new ReadViewHolder(view); + } else { + View view = LayoutInflater.from(parent.getContext()).inflate( + R.layout.refresh_footerview, parent, false); + return new FooterViewHolder(view); + } } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { + if (holder instanceof ReadSlideViewHolder) { + ReadSlideViewHolder viewHolder = (ReadSlideViewHolder) holder; + if (isSlideError) { + viewHolder.viewpager_tv_failure.setVisibility(View.VISIBLE); + viewHolder.viewPager.setVisibility(View.GONE); + viewHolder.viewpager_ll_hint.setVisibility(View.GONE); + } else { + viewHolder.viewpager_tv_failure.setVisibility(View.GONE); + viewHolder.viewPager.setVisibility(View.VISIBLE); + viewHolder.viewpager_ll_hint.setVisibility(View.VISIBLE); + } + if (slideList.size() > 0) { + int currentItem = 0; + if (viewHolder.viewPager.getAdapter() != null) { + currentItem = viewHolder.viewPager.getCurrentItem(); + } + RelativeLayout.LayoutParams rparams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, + RelativeLayout.LayoutParams.WRAP_CONTENT); + rparams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); + rparams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); + rparams.addRule(RelativeLayout.CENTER_HORIZONTAL); + viewHolder.viewpager_ll_hint.setLayoutParams(rparams); + viewHolder.viewpager_ll_hint.removeAllViews(); + for (int i = 0, size = slideList.size(); i < size; i++) { + ImageView imageView = new ImageView(context); + LinearLayout.LayoutParams lparams = new LinearLayout.LayoutParams( + DisplayUtils.dip2px(context, 5), + DisplayUtils.dip2px(context, 5)); + lparams.bottomMargin = DisplayUtils.dip2px(context, 8); + lparams.rightMargin = DisplayUtils.dip2px(context, 8); + if (i == currentItem) { + imageView.setImageResource(R.drawable.oval_white_hint_dn); + } else { + imageView.setImageResource(R.drawable.oval_white_hint_up); + } + imageView.setLayoutParams(lparams); + viewHolder.viewpager_ll_hint.addView(imageView); + } + viewHolder.viewPager.setAdapter(new ReadSlideAdapter(context, slideList)); + viewHolder.viewPager.setCurrentItem(currentItem); + viewHolder.viewPager.setInterval(3000); + viewHolder.viewPager.startAutoScroll(); + } + } else if (holder instanceof ReadViewHolder) { + ReadViewHolder viewHolder = (ReadViewHolder) holder; + NewsEntity newsEntity = newsList.get(position - 1); + viewHolder.view.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + } + }); + if (TextUtils.isEmpty(newsEntity.getThumb())) { + viewHolder.fm_read_iv_thumb.setVisibility(View.GONE); + } else { + viewHolder.fm_read_iv_thumb.setVisibility(View.VISIBLE); + ImageUtils.getInstance(context).display(newsEntity.getThumb(), viewHolder.fm_read_iv_thumb); + } + viewHolder.fm_read_ll_read.setVisibility(View.GONE); + viewHolder.fm_read_tv_type.setVisibility(View.VISIBLE); + viewHolder.fm_read_tv_title.setText(newsEntity.getTitle()); + viewHolder.fm_read_tv_time.setText(getTimeAgo(Long.valueOf(newsEntity.getPublishOn()))); + viewHolder.fm_read_tv_read.setText("211次浏览"); + } else if (holder instanceof FooterViewHolder) { + FooterViewHolder viewHolder = (FooterViewHolder) holder; + viewHolder.footerview_progressbar.setVisibility(View.GONE); + viewHolder.footerview_tv_loading.setText("点击加载更多"); + viewHolder.rootView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + addList(newsList.size()); + } + }); + } } @Override public int getItemCount() { - return 0; + if (newsList.isEmpty()){ + return 0; + } + return 1 + newsList.size() + 1; } @Override public int getItemViewType(int position) { return position; } + + //根据提供的时间,返回该时间与当前时间的差距 + private String getTimeAgo(long time) { + long now = System.currentTimeMillis() / 1000; + long gap = now - time; + if (gap <= 60) { + return "1分钟前"; + } else if (gap > 60 && gap < 3600) { + return Math.floor(gap / 60) + "分钟前"; + } else if (gap >= 3600 && gap < 86400) { + return Math.floor(gap / 3600) + "小时前"; + } else { + SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日", Locale.getDefault()); + return format.format(time * 1000); + } + } + } diff --git a/app/src/main/java/com/gh/gamecenter/read/Read4Fragment.java b/app/src/main/java/com/gh/gamecenter/read/Read4Fragment.java index 42edbec9f9..972fde16fa 100644 --- a/app/src/main/java/com/gh/gamecenter/read/Read4Fragment.java +++ b/app/src/main/java/com/gh/gamecenter/read/Read4Fragment.java @@ -1,6 +1,7 @@ package com.gh.gamecenter.read; import android.os.Bundle; +import android.os.Handler; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v4.widget.SwipeRefreshLayout; @@ -39,11 +40,25 @@ public class Read4Fragment extends Fragment implements SwipeRefreshLayout.OnRefr game_swipe_refresh.setColorSchemeResources(R.color.theme_colors); game_swipe_refresh.setOnRefreshListener(this); + game_pb_loading = (ProgressBarCircularIndeterminate) view.findViewById(R.id.game_pb_loading); + + reuse_no_connection = (LinearLayout) view.findViewById(R.id.reuse_no_connection); + reuse_no_connection.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + game_swipe_refresh.setRefreshing(true); + recyclerview.setVisibility(View.VISIBLE); + game_pb_loading.setVisibility(View.VISIBLE); + reuse_no_connection.setVisibility(View.GONE); + } + }); + recyclerview = (RecyclerView) view.findViewById(R.id.game_list); recyclerview.setHasFixedSize(true); layoutManager = new LinearLayoutManager(getActivity()); recyclerview.setLayoutManager(layoutManager); - adapter = new Read4FragmentAdapter(); + adapter = new Read4FragmentAdapter(getActivity(), game_swipe_refresh, + game_pb_loading, reuse_no_connection, true); recyclerview.setAdapter(adapter); recyclerview.setOnScrollListener(new RecyclerView.OnScrollListener() { @@ -59,19 +74,6 @@ public class Read4Fragment extends Fragment implements SwipeRefreshLayout.OnRefr }); recyclerview.addItemDecoration(new VerticalItemDecoration(getActivity(), 1)); - - game_pb_loading = (ProgressBarCircularIndeterminate) view.findViewById(R.id.game_pb_loading); - - reuse_no_connection = (LinearLayout) view.findViewById(R.id.reuse_no_connection); - reuse_no_connection.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - game_swipe_refresh.setRefreshing(true); - recyclerview.setVisibility(View.VISIBLE); - game_pb_loading.setVisibility(View.VISIBLE); - reuse_no_connection.setVisibility(View.GONE); - } - }); } @Nullable @@ -83,8 +85,19 @@ public class Read4Fragment extends Fragment implements SwipeRefreshLayout.OnRefr return view; } + private Handler handler = new Handler(); + + Runnable runnable = new Runnable() { + @Override + public void run() { + adapter = new Read4FragmentAdapter(getActivity(), game_swipe_refresh, + game_pb_loading, reuse_no_connection, true); + recyclerview.setAdapter(adapter); + } + }; + @Override public void onRefresh() { - + handler.postDelayed(runnable, 1000); } } diff --git a/app/src/main/java/com/gh/gamecenter/read/Read4FragmentAdapter.java b/app/src/main/java/com/gh/gamecenter/read/Read4FragmentAdapter.java index 9d27e0ba04..85d58ba665 100644 --- a/app/src/main/java/com/gh/gamecenter/read/Read4FragmentAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/read/Read4FragmentAdapter.java @@ -1,40 +1,458 @@ package com.gh.gamecenter.read; +import android.app.Activity; +import android.content.Context; +import android.net.Uri; +import android.support.v4.widget.SwipeRefreshLayout; +import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; +import android.util.DisplayMetrics; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; +import android.widget.Toast; +import com.android.volley.NoConnectionError; +import com.android.volley.Response; +import com.android.volley.TimeoutError; +import com.android.volley.VolleyError; +import com.gc.materialdesign.views.ProgressBarCircularIndeterminate; +import com.gh.base.AppController; +import com.gh.common.constant.Config; +import com.gh.common.constant.Constants; +import com.gh.common.util.DisplayUtils; +import com.gh.common.util.ImageUtils; +import com.gh.common.util.NewsUtils; +import com.gh.common.util.RandomUtils; +import com.gh.common.util.TimestampUtils; +import com.gh.common.util.Utils; import com.gh.gamecenter.R; +import com.gh.gamecenter.adapter.viewholder.FooterViewHolder; +import com.gh.gamecenter.db.info.ConcernInfo; +import com.gh.gamecenter.db.info.GameInfo; +import com.gh.gamecenter.entity.ApkEntity; +import com.gh.gamecenter.entity.GameEntity; +import com.gh.gamecenter.entity.NewsEntity; +import com.gh.gamecenter.manager.ConcernManager; +import com.gh.gamecenter.manager.GameManager; +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.JSONObject; + +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; /** * Created by LGT on 2016/6/3. */ public class Read4FragmentAdapter extends RecyclerView.Adapter { - public Read4FragmentAdapter() { + private Activity activity; + private Context context; + private SwipeRefreshLayout game_swipe_refresh; + private ProgressBarCircularIndeterminate game_pb_loading; + private LinearLayout reuse_no_connection; + private List newsList; + private List myGameList; + private List allGameList; + private List likeGameList; + + private boolean isLoading; + + public Read4FragmentAdapter(Activity act, + SwipeRefreshLayout swipeRefreshLayout, + ProgressBarCircularIndeterminate pbLoading, + LinearLayout noConnection, + boolean isLoad) { + activity = act; + context = act; + game_swipe_refresh = swipeRefreshLayout; + game_pb_loading = pbLoading; + reuse_no_connection = noConnection; + + newsList = new ArrayList(); + myGameList = new ArrayList(); + allGameList = new ArrayList(); + likeGameList = new ArrayList(); + + isLoading = false; + + if (isLoad) { + load(); + } + + } + + public void load() { + new Thread(runnable){}.start(); + } + + Runnable runnable = new Runnable() { + @Override + public void run() { + initMyGameList(); + initLikeGameList(); + addList(0); + } + }; + + private int result; + + private void initMyGameList() { + ConcernManager concernManager = new ConcernManager(context); + List installedGame = concernManager.getInstalledGame(); + int size = installedGame.size() > 3 ? 3 : installedGame.size(); + final int count = size; + result = 0; + for (int i = 0; i < size; i++) { + ConcernInfo info = installedGame.get(i); + JsonObjectExtendedRequest request = new JsonObjectExtendedRequest( + TimestampUtils.addTimestamp(Config.HOST + "v1d45/game/" + info.getId() + "/digest", Constants.GAME_CD), + new Response.Listener() { + @Override + public void onResponse(JSONObject response) { + Gson gson = new Gson(); + GameEntity gameEntity = gson.fromJson(response.toString(), GameEntity.class); + myGameList.add(gameEntity); + result++; + if (result == count) { + if (myGameList.size() == 3) { + myGameList.add(new GameEntity()); + } + notifyItemChanged(2); + } + } + }, + new Response.ErrorListener() { + @Override + public void onErrorResponse(VolleyError error) { + result++; + if (result == count) { + if (myGameList.size() == 3) { + myGameList.add(new GameEntity()); + } + notifyItemChanged(2); + } + } + }); + AppController.addToRequestQueue(request, Read4Fragment.class); + } + } + + private void initLikeGameList() { + JsonArrayExtendedRequest request = new JsonArrayExtendedRequest( + TimestampUtils.addTimestamp(Config.HOST + "v1d45/game/remenkapai", Constants.GAME_CD), + new Response.Listener() { + @Override + public void onResponse(JSONArray response) { + Type listType = new TypeToken>() {}.getType(); + Gson gson = new Gson(); + GameManager manager = new GameManager(context.getApplicationContext()); + List gameList = gson.fromJson(response.toString(), listType); + if (gameList != null && !gameList.isEmpty()) { + for (GameEntity entity : gameList) { + for (ApkEntity apkEntity : entity.getApk()) { + manager.addOrUpdate(new GameInfo(apkEntity.getPackageName(), + entity.getId(), entity.getName())); + } + } + //去掉已安装的游戏 + ConcernManager concernManager = new ConcernManager(context); + List installedGame = concernManager.getInstalledGame(); + for (ConcernInfo info : installedGame) { + for (int i = 0, size = gameList.size(); i < size; i++) { + if (gameList.get(i).getId().equals(info.getId())) { + gameList.remove(i); + break; + } + } + } + allGameList = gameList; + } + if (allGameList.size() > 0) { + if (allGameList.size() <= 2) { + likeGameList.addAll(allGameList); + } else { + int[] index = RandomUtils.getRandomArray(2, allGameList.size()); + likeGameList.add(allGameList.get(index[0])); + likeGameList.add(allGameList.get(index[1])); + } + notifyItemChanged(4); + } + } + }, + new Response.ErrorListener() { + @Override + public void onErrorResponse(VolleyError error) { + + } + }); + AppController.addToRequestQueue(request, Read4Fragment.class.getSimpleName()); + } + + public void addList(final int offset) { + if (isLoading) { + return; + } + isLoading = true; + JsonArrayExtendedRequest request = new JsonArrayExtendedRequest(TimestampUtils.addTimestamp(Config.HOST + + "v1d45/news?type_group=" + Uri.encode("攻略") + + "&offset=0&limit=20", Constants.NEWS_CD), + new Response.Listener() { + @Override + public void onResponse(JSONArray response) { + Type listType = new TypeToken>() {}.getType(); + Gson gson = new Gson(); + List list = gson.fromJson(response.toString(), listType); + for (int i = 0; i < list.size(); i++) { + newsList.add(list.get(i)); + notifyItemInserted(getItemCount() - 1); + } + + if (offset == 0 && game_swipe_refresh.isRefreshing()) { + game_swipe_refresh.setRefreshing(false); + } + if (game_pb_loading.getVisibility() == View.VISIBLE) { + game_pb_loading.setVisibility(View.GONE); + } + isLoading = false; + } + }, new Response.ErrorListener() { + @Override + public void onErrorResponse(VolleyError error) { + isLoading = false; + } + }); + AppController.addToRequestQueue(request, Read4Fragment.class.getSimpleName()); + } + + public List getNewsList() { + return newsList; + } + + private class Read4ViewHolder extends RecyclerView.ViewHolder { + + private View view; + + private TextView fm_read4_tv_label; + + private RecyclerView fm_read4_rv_grid; + + private TextView news_type, news_title; + + public Read4ViewHolder(View itemView) { + super(itemView); + + view = itemView; + + int tag = (Integer) itemView.getTag(); + if (tag == 0) { + + } else if (tag == 1 || tag == 3 || tag == 5) { + fm_read4_tv_label = (TextView) itemView.findViewById(R.id.fm_read4_tv_label); + } else if (tag == 2 || tag == 4) { + fm_read4_rv_grid = (RecyclerView) itemView.findViewById(R.id.fm_read4_rv_grid); + fm_read4_rv_grid.setHasFixedSize(true); + fm_read4_rv_grid.setLayoutManager(new GridLayoutManager(context, 2)); + } else { + news_type = (TextView) itemView.findViewById(R.id.news_type); + news_title = (TextView) itemView.findViewById(R.id.news_title); + } + + } } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - View view = LayoutInflater.from(parent.getContext()).inflate( - R.layout.plugin1_autoscrollviewpager_viewholder, parent, false); - return null; + RecyclerView.ViewHolder viewHolder; + if (viewType == 0) { + ImageView imageView = new ImageView(parent.getContext()); + DisplayMetrics outMetrics = new DisplayMetrics(); + activity.getWindowManager().getDefaultDisplay().getMetrics(outMetrics); + int height = (int) (outMetrics.widthPixels / 5f); + ViewGroup.LayoutParams params = new ViewGroup.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, height); + imageView.setLayoutParams(params); + imageView.setImageResource(R.drawable.hero); + imageView.setTag(viewType); + viewHolder = new Read4ViewHolder(imageView); + } else if (viewType == 1 || viewType == 3 || viewType == 5) { + View view = LayoutInflater.from(parent.getContext()).inflate( + R.layout.fm_read4_label, parent, false); + view.setTag(viewType); + viewHolder = new Read4ViewHolder(view); + } else if (viewType == 2 || viewType == 4) { + View view = LayoutInflater.from(parent.getContext()).inflate( + R.layout.fm_read4_grid, parent, false); + RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.fm_read4_rv_grid); + int height; + if (viewType == 2) { + height = 2 * DisplayUtils.dip2px(context, 66); + } else { + height = DisplayUtils.dip2px(context, 66); + } + LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( + LinearLayout.LayoutParams.MATCH_PARENT, height); + recyclerView.setLayoutParams(params); + view.setTag(viewType); + viewHolder = new Read4ViewHolder(view); + } else if (viewType > 5 && viewType<= newsList.size() + 5) { + View view = LayoutInflater.from(parent.getContext()).inflate( + R.layout.home_list_item_newsnormal_type, parent, false); + view.setTag(viewType); + viewHolder = new Read4ViewHolder(view); + } else { + viewHolder = new FooterViewHolder(LayoutInflater.from(parent.getContext()).inflate( + R.layout.refresh_footerview, parent, false)); + } + return viewHolder; } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { + if (holder instanceof Read4ViewHolder) { + Read4ViewHolder viewHolder = (Read4ViewHolder) holder; + if (position == 0) { + } else if (position == 1 || position == 3 || position == 5) { + String[] label = {"", "我的游戏", "", "猜你喜欢", "", "最新发布"}; + viewHolder.fm_read4_tv_label.setText(label[position]); + } else if (position == 2 || position == 4) { + if (position == 2) { + viewHolder.fm_read4_rv_grid.setAdapter(new Read4GridAdapter(context, myGameList)); + } else { + viewHolder.fm_read4_rv_grid.setAdapter(new Read4GridAdapter(context, likeGameList)); + } + } else { + NewsEntity newsEntity = newsList.get(position - 6); + viewHolder.news_type.setBackgroundResource(NewsUtils + .getDrawableIdByType(newsEntity.getType())); + viewHolder.news_type.setText(newsEntity.getType()); + viewHolder.news_title.setText(newsEntity.getTitle()); + viewHolder.view.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + + } + }); + } + } else if (holder instanceof FooterViewHolder) { + FooterViewHolder viewHolder = (FooterViewHolder) holder; + viewHolder.footerview_progressbar.setVisibility(View.GONE); + viewHolder.footerview_tv_loading.setText("点击加载更多"); + viewHolder.rootView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + addList(newsList.size()); + } + }); + } } @Override public int getItemCount() { - return 0; + int count = 1; + if (myGameList.size() != 0) { + count += 2; + } + if (likeGameList.size() != 0) { + count += 2; + } + if (newsList.size() != 0) { + count += 1 + newsList.size(); + } + return count + 1; } @Override public int getItemViewType(int position) { return position; } + + private class Read4GridViewHolder extends RecyclerView.ViewHolder { + + private View view; + private ImageView fm_read4_iv_icon; + private TextView fm_read4_tv_name; + private TextView fm_read4_tv_des; + + public Read4GridViewHolder(View itemView) { + super(itemView); + + view = itemView; + fm_read4_iv_icon = (ImageView) itemView.findViewById(R.id.fm_read4_iv_icon); + fm_read4_tv_name = (TextView) itemView.findViewById(R.id.fm_read4_tv_name); + fm_read4_tv_des = (TextView) itemView.findViewById(R.id.fm_read4_tv_des); + + } + } + + private class Read4GridAdapter extends RecyclerView.Adapter { + + private Context mContext; + private List mGameList; + + public Read4GridAdapter(Context context, List list) { + mContext = context; + mGameList = list; + } + + @Override + public Read4GridViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view; + if (viewType == 3) { + view = LayoutInflater.from(parent.getContext()).inflate( + R.layout.fm_read4_grid_more, parent, false); + } else { + view = LayoutInflater.from(parent.getContext()).inflate( + R.layout.fm_read4_grid_item, parent, false); + } + return new Read4GridViewHolder(view); + } + + @Override + public void onBindViewHolder(Read4GridViewHolder holder, int position) { + if (position != 3) { + GameEntity gameEntity = mGameList.get(position); + ImageUtils.getInstance(mContext).display(gameEntity.getIcon(), holder.fm_read4_iv_icon); + holder.fm_read4_tv_name.setText(gameEntity.getName()); + String des = gameEntity.getBrief(); + holder.fm_read4_tv_des.setText(des.substring(0, des.length() > 8 ? 8 : des.length())); + holder.view.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + + } + }); + } else { + holder.view.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + + } + }); + } + } + + @Override + public int getItemCount() { + return mGameList.size(); + } + + @Override + public int getItemViewType(int position) { + return position; + } + } + } diff --git a/app/src/main/java/com/gh/gamecenter/read/ReadFragment.java b/app/src/main/java/com/gh/gamecenter/read/ReadFragment.java index 057c08e053..2dde5022de 100644 --- a/app/src/main/java/com/gh/gamecenter/read/ReadFragment.java +++ b/app/src/main/java/com/gh/gamecenter/read/ReadFragment.java @@ -91,6 +91,10 @@ public class ReadFragment extends Fragment implements View.OnClickListener, View fm_read_yuanchuang = (TextView) view.findViewById(R.id.fm_read_yuanchuang); fm_read_zixun = (TextView) view.findViewById(R.id.fm_read_zixun); fm_read_gonglue = (TextView) view.findViewById(R.id.fm_read_gonglue); + fm_read_tuijian.setOnClickListener(this); + fm_read_yuanchuang.setOnClickListener(this); + fm_read_zixun.setOnClickListener(this); + fm_read_gonglue.setOnClickListener(this); fm_vp_content = (ViewPager) view.findViewById(R.id.fm_vp_content); fm_vp_content.setAdapter(new FragmentAdapter(getChildFragmentManager())); @@ -218,6 +222,14 @@ public class ReadFragment extends Fragment implements View.OnClickListener, View } else if (id == R.id.menu_rl_set) { popWindow.dismiss(); startActivity(new Intent(getActivity(), SettingActivity.class)); + } else if (id == R.id.fm_read_tuijian) { + fm_vp_content.setCurrentItem(0); + } else if (id == R.id.fm_read_yuanchuang) { + fm_vp_content.setCurrentItem(1); + } else if (id == R.id.fm_read_zixun) { + fm_vp_content.setCurrentItem(2); + } else if (id == R.id.fm_read_gonglue) { + fm_vp_content.setCurrentItem(3); } } diff --git a/app/src/main/java/com/gh/gamecenter/read/ReadViewHolder.java b/app/src/main/java/com/gh/gamecenter/read/ReadViewHolder.java new file mode 100644 index 0000000000..8e052bba77 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/read/ReadViewHolder.java @@ -0,0 +1,36 @@ +package com.gh.gamecenter.read; + +import android.support.v7.widget.RecyclerView; +import android.view.View; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.gh.gamecenter.R; + +/** + * Created by LGT on 2016/6/6. + */ +public class ReadViewHolder extends RecyclerView.ViewHolder { + + public View view; + + public ImageView fm_read_iv_thumb; + public TextView fm_read_tv_title; + public TextView fm_read_tv_time; + public LinearLayout fm_read_ll_read; + public TextView fm_read_tv_read; + public TextView fm_read_tv_type; + + public ReadViewHolder(View itemView) { + super(itemView); + view = itemView; + fm_read_iv_thumb = (ImageView) itemView.findViewById(R.id.fm_read_iv_thumb); + fm_read_tv_title = (TextView) itemView.findViewById(R.id.fm_read_tv_title); + fm_read_tv_time = (TextView) itemView.findViewById(R.id.fm_read_tv_time); + fm_read_ll_read = (LinearLayout) itemView.findViewById(R.id.fm_read_ll_read); + fm_read_tv_read = (TextView) itemView.findViewById(R.id.fm_read_tv_read); + fm_read_tv_type = (TextView) itemView.findViewById(R.id.fm_read_tv_type); + } + +} diff --git a/app/src/main/res/drawable-hdpi/fm_read_more.png b/app/src/main/res/drawable-hdpi/fm_read_more.png new file mode 100644 index 0000000000000000000000000000000000000000..86fbca9a2eae9139048306ea9681a1581188b9ec GIT binary patch literal 3268 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 vTX(VdXMXwd$%kIg_w$J_t$FwBt literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/home4_selected.png b/app/src/main/res/drawable-hdpi/home4_selected.png new file mode 100644 index 0000000000000000000000000000000000000000..55720779f2f61f9158e7ab05e2544dec3418d8bb GIT binary patch literal 3504 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/read_eye.png b/app/src/main/res/drawable-hdpi/read_eye.png new file mode 100644 index 0000000000000000000000000000000000000000..7f7439d604bd30d78b71e88a3be2eecc8d613358 GIT binary patch literal 1749 zcmV;`1}gc9P)KLZ*U+lnSp_Ufq@}0xwybFAi#%#fq@|}KQEO51AM#2z{tSB zz;IdD(Z$J?fi%FHTu@ZPz`$^Tfq}s&CAB!2fq~%*0|P^Pc}YPD0|R3W0|SFdQg%TJ z0|R3L0|SFdc1Vyj0|R3V0|OIJNoqw20|NttbACZ(QD%BZiGrb}rKN&nN`6wRLU3hq zNosDff@fZGeo;YwQDRAI3IhWJ)D8v)1_oZ2{1OHC#LPSeLsL}-Dual~C?)grM$+xhxmf|p7B=;2nnnfbQ63e)F`Yd zd{`u1lvi}CSe!Vg_*RJ&Nny#OQWes=(obaO$cD-Z%AJ+(QSedZRlJ}yML9}EN#(Wb zR<%ZTKMh%px0?I3CTgeZSnCSuzS29QKi{CnFv`f%Skm~n$vxA{#r++CO)=?RdfInDbtjt*-0cR=O|sSme3TYk~JdpT)k*{8ss|57-*GH|SXK z`H)+o&%(Y$FhvSRDMcH{xWz`r<;Axo%ud{#bT;{UDpQ(Vx=lt@W>wa#>^(X6@|g0~ z3w#QTi)I%eE_qufQSMSvSUIoiZ1vw-y}J1NNe#yue>WSnq_@s%yWSz#>D|@deYlsQ z&%VEI!oG?BCp%7QoqA$A?~LG?vt~V-qcyi=-o6D~3&R#IUi@*X!?Fp>AFecB)w=rT zTHSR`>u+u}*wnH4!B(qnQ@4NE>AP#y9*(`~`;H$_KiGNb^%1|Ln~#g1s6F}QwD*}U z=VZ^fU-)z>?((Ut7T1>D5WU%Y>+7BLyEpIqJUH;k^zrJaiqB@g5PaG7n)yxL+n?`C zKYaRB@cG@>yl?M*RI+y?e7jKeZ#YO-C12#!SK~#9!?3qhQlu;DNf1_jh0DIUA zqD4p}5MgSmQyRp_>o9rjtH>;>H2)jW1i6I-xG)+hjT>h06WB8 zni%s3fQ=MW%(`VJRd@lAVC;6W|!TCUMd3c<^=uV9XmPY7MiEf0W&holm^A|nsw zI2nvFsMig5;-HyGzj#_C%{Y8nkh%?IP|JFO*h!x8g0H|9j&gz!!TNb}X_5gDKs5yd zVQ(m>mCqiOZKQC8-GY5BoMlEEz#f`8AP`eaF|(>MrHVqq-aaf0`?i53`i1H%C{k4q zvlLMwjHCUe`0|1x9Ky)x;JhZkjaWgzGGk$s-lbP?kvgG0PZ7a{(DB|8A(T`=z4sNA zN~njM9_piLrwo8H+KE!=6WoxHR7a)f3E0V!*fh-sCKcZvBm}4gN`OgX8FBH#`AC?A zy!&MTJ^`zgdgxNrgWcu#C6oXVf?eVLpiN3%7FIBmi%l}3y;No~B&j6p7@V&8h@?at zqX9HXhtzImc1V@)ruIn7Z1@Xm!aV7I6MM$f`{d2NvXd__R2$X9Gieq z2E0P?C&Go23Kz7wlTST?R12#-JLw+Z2UOPBCDdPX|5(p#*h>%Tf_xZFm}Z=_kuMDB zr+DD29%vKmEQ94W_EyDYAl1q>mEr?v4!g{EMMDKdYS5cZn zBPM~c_jK^eRg~@{nH~NrN*C_>I;nn)xQ{4hNKaodL>igWSxtM4kxiPqdhO0=klV}> zyQ1D`3>y}$?5N!v&heZ(OcTGX?rn_U+B>P rL}N1kF);ub01N;I00Y2(58&4TNzTc0gJ;y*00000NkvXXu0mjfIzKf) literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/read_time_ago.png b/app/src/main/res/drawable-hdpi/read_time_ago.png new file mode 100644 index 0000000000000000000000000000000000000000..ef45c7164f77387b0671216accb83e8c59de000a GIT binary patch literal 3552 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/oval_type_red_bg.xml b/app/src/main/res/drawable/oval_type_red_bg.xml new file mode 100644 index 0000000000..bfd2bc3daa --- /dev/null +++ b/app/src/main/res/drawable/oval_type_red_bg.xml @@ -0,0 +1,13 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/oval_white_hint_dn.xml b/app/src/main/res/drawable/oval_white_hint_dn.xml new file mode 100644 index 0000000000..46ddfbe9ef --- /dev/null +++ b/app/src/main/res/drawable/oval_white_hint_dn.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/oval_white_hint_up.xml b/app/src/main/res/drawable/oval_white_hint_up.xml new file mode 100644 index 0000000000..a2387b4266 --- /dev/null +++ b/app/src/main/res/drawable/oval_white_hint_up.xml @@ -0,0 +1,10 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fm_read1_slide.xml b/app/src/main/res/layout/fm_read1_slide.xml new file mode 100644 index 0000000000..28f9f52f7f --- /dev/null +++ b/app/src/main/res/layout/fm_read1_slide.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fm_read2_special1.xml b/app/src/main/res/layout/fm_read2_special1.xml new file mode 100644 index 0000000000..999df8b96e --- /dev/null +++ b/app/src/main/res/layout/fm_read2_special1.xml @@ -0,0 +1,26 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fm_read2_special2.xml b/app/src/main/res/layout/fm_read2_special2.xml new file mode 100644 index 0000000000..b80781d740 --- /dev/null +++ b/app/src/main/res/layout/fm_read2_special2.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fm_read4_grid.xml b/app/src/main/res/layout/fm_read4_grid.xml new file mode 100644 index 0000000000..291ba3e760 --- /dev/null +++ b/app/src/main/res/layout/fm_read4_grid.xml @@ -0,0 +1,13 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fm_read4_grid_item.xml b/app/src/main/res/layout/fm_read4_grid_item.xml new file mode 100644 index 0000000000..6df907570a --- /dev/null +++ b/app/src/main/res/layout/fm_read4_grid_item.xml @@ -0,0 +1,38 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fm_read4_grid_more.xml b/app/src/main/res/layout/fm_read4_grid_more.xml new file mode 100644 index 0000000000..470dc83b70 --- /dev/null +++ b/app/src/main/res/layout/fm_read4_grid_more.xml @@ -0,0 +1,21 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fm_read4_label.xml b/app/src/main/res/layout/fm_read4_label.xml new file mode 100644 index 0000000000..38a1648f41 --- /dev/null +++ b/app/src/main/res/layout/fm_read4_label.xml @@ -0,0 +1,17 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fm_read_item.xml b/app/src/main/res/layout/fm_read_item.xml new file mode 100644 index 0000000000..7b0dc9dfb9 --- /dev/null +++ b/app/src/main/res/layout/fm_read_item.xml @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/read_fragment.xml b/app/src/main/res/layout/read_fragment.xml index df05aa628e..3b43449f21 100644 --- a/app/src/main/res/layout/read_fragment.xml +++ b/app/src/main/res/layout/read_fragment.xml @@ -6,56 +6,64 @@ - - + android:layout_height="wrap_content" + android:orientation="vertical" + android:background="#FFFFFF"> - + - + - + - + + + + + + +