package com.gh.gamecenter.adapter; import android.content.Context; import android.support.v4.util.ArrayMap; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Toast; import com.android.volley.NoConnectionError; import com.android.volley.Response; import com.android.volley.TimeoutError; import com.android.volley.VolleyError; import com.gh.base.AppController; import com.gh.common.constant.Config; import com.gh.common.constant.ItemViewType; import com.gh.common.util.DataUtils; import com.gh.common.util.DisplayUtils; import com.gh.common.util.DownloadItemUtils; import com.gh.common.util.GameUtils; import com.gh.common.util.GameViewUtils; import com.gh.common.view.CardLinearLayout; import com.gh.download.DownloadManager; import com.gh.gamecenter.R; import com.gh.gamecenter.SubjectActivity; import com.gh.gamecenter.adapter.viewholder.FooterViewHolder; import com.gh.gamecenter.adapter.viewholder.GameNormalViewHolder; import com.gh.gamecenter.adapter.viewholder.GameTestViewHolder; import com.gh.gamecenter.entity.ApkEntity; import com.gh.gamecenter.entity.GameEntity; import com.gh.gamecenter.listener.OnCallBackListener; import com.gh.gamecenter.manager.DataCollectionManager; import com.gh.gamecenter.manager.GameManager; 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.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; /** * * @author 温冠超 * @email 294299195@qq.com * @date 2015-8-8 * @update 2015-8-11 * @des 首页插件fragment适配器 */ public class SubjectAdapter extends RecyclerView.Adapter { private Context context; private OnCallBackListener listener; private List subjectList; private boolean order; private boolean isLoaded; private ArrayMap> locationMap; private String id; private String name; private String entrance; private boolean isRemove; private boolean isNetworkError; public SubjectAdapter(SubjectActivity activity) { this.context = activity; this.listener = activity; this.id = activity.getIntent().getStringExtra("id"); this.name = activity.getIntent().getStringExtra("name"); this.order = activity.getIntent().getBooleanExtra("order", false); this.entrance = activity.getIntent().getStringExtra("entrance"); locationMap = new ArrayMap<>(); subjectList = new ArrayList<>(); isLoaded = false; isNetworkError = false; initList(1); } public void initList(final int page) { isLoaded = false; JsonArrayExtendedRequest request = new JsonArrayExtendedRequest( Config.HOST + "game/column/" + id + "?page=" + page, new Response.Listener() { @Override public void onResponse(JSONArray response) { processingData(response, page); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { // 无网络连接 if (error.getClass().equals(NoConnectionError.class) || error.getClass().equals(TimeoutError.class)) { if (page == 1){ if (listener != null) { listener.loadError(); } }else { Toast.makeText(context, "加载失败,请检查网络状态", Toast.LENGTH_SHORT).show(); isNetworkError = true; notifyDataSetChanged(); } } } }); AppController.addToRequestQueue(request, SubjectActivity.TAG); } private void processingData(JSONArray response, int page) { Type listType = new TypeToken>() {}.getType(); Gson gson = new Gson(); GameManager manager = new GameManager(context); List gameList = gson.fromJson(response.toString(), listType); int listSize = gameList.size(); // 去除重复数据 removeDuplicateData(gameList); if (!gameList.isEmpty()) { for (GameEntity entity : gameList) { // 黄壮华 初始化游戏状态 修改2015/8/15 entity.setEntryMap(DownloadManager.getInstance(context).getEntryMap(entity.getName())); manager.addOrUpdate(entity.getApk(), entity.getId(), entity.getName()); } subjectList.addAll(gameList); notifyItemRangeInserted(subjectList.size() - gameList.size(), gameList.size()); } initLocationMap(); if (listener != null) { listener.loadDone(); } if (listSize == 0 || (page == 1 && listSize < 20)) { isRemove = true; notifyDataSetChanged(); } isLoaded = true; } private void initLocationMap() { ArrayList list; GameEntity gameEntity; for (int i = 0, size = subjectList.size(); i < size; i++) { gameEntity = subjectList.get(i); if (gameEntity.getApk() != null && gameEntity.getApk().size() != 0) { for (ApkEntity apkEntity : gameEntity.getApk()) { list = locationMap.get(apkEntity.getPackageName()); if (list == null) { list = new ArrayList<>(); locationMap.put(apkEntity.getPackageName(), list); } list.add(i); } } } } private void removeDuplicateData(List gameList) { if (subjectList == null || subjectList.isEmpty()) { return; } String id; for (int i = 0; i < gameList.size(); i++) { id = gameList.get(i).getId(); for (GameEntity gameEntity : subjectList) { if (id.equals(gameEntity.getId())) { gameList.remove(i); i--; break; } } } } @Override public int getItemCount() { if (subjectList.size() < 1) { return 0; } return subjectList.size() + 1; } @Override public int getItemViewType(int position) { if (position == subjectList.size()) { return ItemViewType.LOADING; } if (subjectList.get(position).getTest() != null) { return ItemViewType.GAME_TEST; } else { return ItemViewType.GAME_NORMAL; } } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { if (viewType == ItemViewType.LOADING){ View view = LayoutInflater.from(viewGroup.getContext()).inflate( R.layout.refresh_footerview, viewGroup, false); return new FooterViewHolder(view); } else if (viewType == ItemViewType.GAME_TEST) { View view = LayoutInflater.from(viewGroup.getContext()).inflate( R.layout.game_test_item, viewGroup, false); return new GameTestViewHolder(view); } else if (viewType == ItemViewType.GAME_NORMAL) { View view = LayoutInflater.from(viewGroup.getContext()).inflate( R.layout.game_normal_item, viewGroup, false); return new GameNormalViewHolder(view); } return null; } @Override public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) { if (viewHolder instanceof GameNormalViewHolder) { initGameNormalViewHolder((GameNormalViewHolder) viewHolder, position); } else if (viewHolder instanceof GameTestViewHolder) { initGameTestViewHolder((GameTestViewHolder) viewHolder, position); } else if (viewHolder instanceof FooterViewHolder){ initFooterViewHolder((FooterViewHolder) viewHolder); } } private void initFooterViewHolder(FooterViewHolder viewHolder) { if (isNetworkError) { viewHolder.footerview_progressbar.setVisibility(View.GONE); viewHolder.footerview_tv_loading.setText("加载失败,点击重试"); viewHolder.itemView.setClickable(true); viewHolder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { isNetworkError = false; notifyDataSetChanged(); initList(subjectList.size() / 21); } }); } else if (isRemove) { viewHolder.footerview_progressbar.setVisibility(View.GONE); viewHolder.footerview_tv_loading.setText("加载完毕"); viewHolder.itemView.setClickable(false); } else { viewHolder.footerview_progressbar.setVisibility(View.VISIBLE); viewHolder.footerview_tv_loading.setText("加载中..."); viewHolder.itemView.setClickable(false); } } private void initGameTestViewHolder(final GameTestViewHolder holder, int position) { // 第一个 if (position == 0) { ((CardLinearLayout) holder.itemView).setmTop(DisplayUtils.dip2px(context, 8)); } else { ((CardLinearLayout) holder.itemView).setmTop(0); } // 最后一个 if (position == subjectList.size() - 1) { ((CardLinearLayout) holder.itemView).setBottom(true); } else { ((CardLinearLayout) holder.itemView).setBottom(false); } if (order) { holder.home2_game_order.setVisibility(View.VISIBLE); holder.home2_game_order.setText(String.valueOf(position + 1)); } else { holder.home2_game_order.setVisibility(View.GONE); } final GameEntity gameEntity = subjectList.get(position); // ImageUtils.getInstance(context).display(gameEntity.getIcon(), holder.gameThumb); holder.gameThumb.setImageURI(gameEntity.getIcon()); holder.gameNameAndSize.setText(gameEntity.getName()); if (gameEntity.getApk() == null || gameEntity.getApk().isEmpty()) { holder.gameDes.setText(gameEntity.getBrief()); } else { holder.gameDes.setText(String.format("%s %s", gameEntity.getApk().get(0).getSize(), gameEntity.getBrief())); } holder.gameTestType.setText(gameEntity.getTest().getType()); if (gameEntity.getTest().getStart() == 0) { holder.gameTestTime.setVisibility(View.GONE); } else { holder.gameTestTime.setText(GameViewUtils.getGameTestDate(gameEntity.getTest().getStart())); } holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Map kv = new HashMap<>(); kv.put("名字", gameEntity.getName()); kv.put("位置", String.valueOf(holder.getPosition() + 1)); DataUtils.onEvent(context, "点击", name, kv); Map map = new HashMap<>(); map.put("location", "列表"); map.put("page", name); map.put("game", gameEntity.getName()); map.put("game_id", gameEntity.getId()); DataCollectionManager.onEvent(context, "click-item", map); GameUtils.startGameDetailActivity(context, gameEntity, entrance + "(" + name + ")"); } }); if (gameEntity.getApk() == null || gameEntity.getApk().isEmpty()) { holder.downloadBtn.setVisibility(View.GONE); } else { if (gameEntity.getTest().getEnd() == 0) { holder.downloadBtn.setVisibility(View.VISIBLE); DownloadItemUtils.setOnClickListener(context, holder.downloadBtn, gameEntity, position, SubjectAdapter.this, entrance + "(" + name + ")", name + ":" + gameEntity.getName()); } else { long endTime = Long.valueOf(gameEntity.getTest().getEnd() + "000"); long todayTime = new Date().getTime(); if (todayTime > endTime) { // 测试时间已过 holder.downloadBtn.setVisibility(View.GONE); } else { // 测试时间未过 holder.downloadBtn.setVisibility(View.VISIBLE); DownloadItemUtils.setOnClickListener(context, holder.downloadBtn, gameEntity, position, SubjectAdapter.this, entrance + "(" + name + ")", name + ":" + gameEntity.getName()); } } } DownloadItemUtils.updateItem(context, holder.gameDes, holder.game_progressbar, holder.game_ll_info, holder.download_speed, holder.download_percentage, holder.downloadBtn, gameEntity); } private void initGameNormalViewHolder(final GameNormalViewHolder holder, int position) { // 第一个 if (position == 0) { ((CardLinearLayout) holder.itemView).setmTop(DisplayUtils.dip2px(context, 8)); } else { ((CardLinearLayout) holder.itemView).setmTop(0); } // 最后一个 if (position == subjectList.size() - 1) { ((CardLinearLayout) holder.itemView).setBottom(true); } else { ((CardLinearLayout) holder.itemView).setBottom(false); } if (order) { holder.home1_game_order.setVisibility(View.VISIBLE); holder.home1_game_order.setText(String.valueOf(position + 1)); } else { holder.home1_game_order.setVisibility(View.GONE); } final GameEntity gameEntity = subjectList.get(position); // ImageUtils.getInstance(context).display(gameEntity.getIcon(), holder.gameThumb); holder.gameThumb.setImageURI(gameEntity.getIcon()); holder.gameNameAndSize.setText(gameEntity.getName()); if (gameEntity.getApk() == null || gameEntity.getApk().isEmpty()) { holder.gameDes.setText(gameEntity.getBrief()); } else { holder.gameDes.setText(String.format("%s %s", gameEntity.getApk().get(0).getSize(), gameEntity.getBrief())); } GameViewUtils.setLabelList(context, holder.labelList, gameEntity.getTag()); holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Map kv = new HashMap<>(); kv.put("名字", gameEntity.getName()); kv.put("位置", String.valueOf(holder.getPosition() + 1)); DataUtils.onEvent(context, "点击", name, kv); Map map = new HashMap<>(); map.put("location", "列表"); map.put("page", name); map.put("game", gameEntity.getName()); map.put("game_id", gameEntity.getId()); DataCollectionManager.onEvent(context, "click-item", map); GameUtils.startGameDetailActivity(context, gameEntity, entrance + "(" + name + ")"); } }); DownloadItemUtils.setOnClickListener(context, holder.downloadBtn, gameEntity, position, this, entrance + "(" + name + ")", name + ":" + gameEntity.getName()); DownloadItemUtils.updateItem(context, holder.gameDes, holder.game_progressbar, holder.game_ll_info, holder.download_speed, holder.download_percentage, holder.downloadBtn, gameEntity); } public List getSubjectList() { return subjectList; } public ArrayMap> getLocationMap() { return locationMap; } public boolean isLoaded(){ return isLoaded; } }