Files
assistant-android/app/src/main/java/com/gh/gamecenter/game/Game2FragmentAdapter.java

596 lines
27 KiB
Java

package com.gh.gamecenter.game;
import android.content.Context;
import android.content.Intent;
import android.support.v4.util.ArrayMap;
import android.support.v7.widget.RecyclerView;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
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.util.ImageUtils;
import com.gh.common.util.NewsUtils;
import com.gh.common.view.CardLinearLayout;
import com.gh.download.DownloadManager;
import com.gh.gamecenter.NewsDetailActivity;
import com.gh.gamecenter.R;
import com.gh.gamecenter.SubjectActivity;
import com.gh.gamecenter.adapter.viewholder.FooterViewHolder;
import com.gh.gamecenter.adapter.viewholder.GameHeadViewHolder;
import com.gh.gamecenter.adapter.viewholder.GameImageViewHolder;
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.entity.SubjectEntity;
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;
/**
* Created by khy on 2016/6/28.
*/
public class Game2FragmentAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private Game2Fragment fragment;
private Context context;
private OnCallBackListener listener;
private List<SubjectEntity> subjectList;
private ArrayMap<String, ArrayList<Integer>> locationMap;
public Game2FragmentAdapter(Game2Fragment fragment, boolean isLoad) {
this.fragment = fragment;
this.context = fragment.getActivity();
this.listener = fragment;
subjectList = new ArrayList<>();
locationMap = new ArrayMap<>();
if (isLoad) {
initSubjectList();
}
}
public ArrayMap<String, ArrayList<Integer>> getLocationMap() {
return locationMap;
}
public void initSubjectList() {
JsonArrayExtendedRequest request = new JsonArrayExtendedRequest(
Config.HOST + "game/tuijian",
new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
Type listType = new TypeToken<ArrayList<SubjectEntity>>() {}.getType();
Gson gson = new Gson();
List<SubjectEntity> list = gson.fromJson(response.toString(), listType);
if (list != null && !list.isEmpty()) {
GameManager manager = new GameManager(context);
SubjectEntity subjectEntity;
GameEntity gameEntity;
for (int j = 0; j < list.size(); j++) {
subjectEntity = list.get(j);
if (subjectEntity.getData().size() == 1
&& !TextUtils.isEmpty(subjectEntity.getData().get(0).getImage())){
list.remove(j);
j--;
continue;
}
for (int i = 0; i < subjectEntity.getData().size(); i++) {
gameEntity = subjectEntity.getData().get(i);
if (gameEntity.getApk() != null && !gameEntity.getApk().isEmpty()) {
gameEntity.setEntryMap(DownloadManager.getInstance(context).getEntryMap(gameEntity.getName()));
manager.addOrUpdate(gameEntity.getApk(), gameEntity.getId(), gameEntity.getName());
} else if (TextUtils.isEmpty(gameEntity.getId())) {
if (TextUtils.isEmpty(gameEntity.getType())
|| TextUtils.isEmpty(gameEntity.getLink())
|| TextUtils.isEmpty(gameEntity.getName())
|| TextUtils.isEmpty(gameEntity.getImage())) {
subjectEntity.getData().remove(i);
i--;
}
}
}
}
if (list.size() != 0) {
if (!fragment.isHidden() && !fragment.isEverpause()) {
subjectList = list;
notifyItemRangeInserted(0, getItemCount());
} else {
subjectList = list;
notifyDataSetChanged();
}
}
initLocationMap();
}
listener.loadDone();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// 无网络连接和访问超时
if (error.getClass().equals(NoConnectionError.class)
|| error.getClass().equals(TimeoutError.class)) {
listener.loadError();
}
}
});
AppController.addToRequestQueue(request, Game2Fragment.TAG);
}
private void initLocationMap() {
locationMap.clear();
if (!subjectList.isEmpty()) {
int count = getItemCount() - 1;
int offset;
ArrayList<Integer> list;
GameEntity gameEntity;
for (int position = 0; position < count; position++) {
offset = 0;
for (int i = 0, size = subjectList.size(); i < size; i++) {
if (position > offset && position <= subjectList.get(i).getData().size() + offset) {
gameEntity = subjectList.get(i).getData().get(position - offset - 1);
if (gameEntity.getApk() != null && !gameEntity.getApk().isEmpty()) {
for (ApkEntity apkEntity : gameEntity.getApk()) {
list = locationMap.get(apkEntity.getPackageName());
if (list == null) {
list = new ArrayList<>();
locationMap.put(apkEntity.getPackageName(), list);
}
list.add(position);
}
}
break;
}
offset = subjectList.get(i).getData().size() + offset + 1;
}
}
}
}
public GameEntity getGameEntityByLocation(int position) {
int offset = 0;
for (int i = 0; i < subjectList.size(); i++) {
if (position > offset && position <= subjectList.get(i).getData().size() + offset) {
return subjectList.get(i).getData().get(position - offset - 1);
}
offset = subjectList.get(i).getData().size() + offset + 1;
}
return null;
}
@Override
public int getItemCount() {
int subjectSize = 0;
if (!subjectList.isEmpty()) {
for (int i = 0; i < subjectList.size(); i++) {
SubjectEntity subjectEntity = subjectList.get(i);
subjectSize += subjectEntity.getData().size() + 1;
}
subjectSize += 1;
}
return subjectSize;
}
@Override
public int getItemViewType(int position) {
if (!subjectList.isEmpty()) {
int offset = 0;
GameEntity gameEntity;
for (int i = 0; i < subjectList.size(); i++) {
if (position >= offset && position <= subjectList.get(i).getData().size() + offset) {
int index = position - offset - 1;
if (index < 0) {
index = 0;
}
gameEntity = subjectList.get(i).getData().get(index);
if (position == offset && !TextUtils.isEmpty(gameEntity.getImage())) {
return ItemViewType.GAME_IMAGE;
} else if (position == offset) {
return ItemViewType.COLUMN_HEADER;
}
if (position == offset + 1 && !TextUtils.isEmpty(subjectList.get(i).getData().get(0).getImage())) {
return ItemViewType.COLUMN_HEADER;
}
if (gameEntity.getTest() != null) {
return ItemViewType.GAME_TEST;
}
return ItemViewType.GAME_NORMAL;
}
offset = subjectList.get(i).getData().size() + offset + 1;
}
}
return ItemViewType.LOADING;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == ItemViewType.COLUMN_HEADER) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.home_game_head_item, parent, false);
return new GameHeadViewHolder(view);
} else if (viewType == ItemViewType.GAME_IMAGE) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.home_game_image_item, parent, false);
return new GameImageViewHolder(view);
} else if (viewType == ItemViewType.GAME_TEST) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.game_test_item, parent, false);
return new GameTestViewHolder(view);
} else if (viewType == ItemViewType.GAME_NORMAL) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.game_normal_item, parent, false);
return new GameNormalViewHolder(view);
} else if (viewType == ItemViewType.LOADING) {
View view = LayoutInflater.from(parent.getContext()).inflate(
R.layout.refresh_footerview, parent, false);
return new FooterViewHolder(view);
}
return null;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (holder instanceof GameHeadViewHolder) {
initGameHeadViewHolder((GameHeadViewHolder) holder, position);
} else if (holder instanceof GameNormalViewHolder) {
initGameNormalViewHolder((GameNormalViewHolder) holder, position);
} else if (holder instanceof GameTestViewHolder) {
initGameTestViewHolder((GameTestViewHolder) holder, position);
} else if (holder instanceof GameImageViewHolder) {
initGameImageViewHolder((GameImageViewHolder) holder, position);
} else if (holder instanceof FooterViewHolder) {
initFooterViewHolder((FooterViewHolder) holder);
}
}
private void initFooterViewHolder(FooterViewHolder holder) {
holder.footerview_line1.setVisibility(View.VISIBLE);
holder.footerview_line2.setVisibility(View.VISIBLE);
holder.footerview_progressbar.setVisibility(View.GONE);
holder.footerview_tv_loading.setText("到底了哦~");
holder.itemView.setClickable(false);
}
private void initGameHeadViewHolder(GameHeadViewHolder holder, int position) {
int offset = 0;
GameEntity gameEntity;
for (int i = 0; i < subjectList.size(); i++) {
if (position >= offset && position <= subjectList.get(i).getData().size() + offset) {
int index = position - offset;
if (index < 0){
index = 0;
}
gameEntity = subjectList.get(i).getData().get(index);
if (position == offset && TextUtils.isEmpty(gameEntity.getImage())
|| position == offset + 1 && !TextUtils.isEmpty(subjectList.get(i).getData().get(0).getImage())) {
if (TextUtils.isEmpty(subjectList.get(i).getData().get(0).getImage())
&& i == 0) {
((CardLinearLayout) holder.itemView).setmTop(DisplayUtils.dip2px(context, 8));
} else {
((CardLinearLayout) holder.itemView).setmTop(0);
}
holder.thumb.setVisibility(View.GONE);
holder.title.setText(subjectList.get(i).getName());
if (subjectList.get(i).getData().size()>= Integer.parseInt(subjectList.get(i).getMore())){
holder.link.setVisibility(View.GONE);
}else {
holder.link.setVisibility(View.VISIBLE);
}
final int ii = i;
holder.link.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SubjectEntity subjectEntity = subjectList.get(ii);
Intent intent = new Intent(context, SubjectActivity.class);
intent.putExtra("id", subjectEntity.getId());
intent.putExtra("name", subjectEntity.getName());
intent.putExtra("order",subjectEntity.getOrder());
intent.putExtra("entrance", "(游戏-推荐:" + subjectEntity.getName() + "-全部)");
context.startActivity(intent);
}
});
break;
}
}
offset = subjectList.get(i).getData().size() + offset + 1;
}
}
private void initGameNormalViewHolder(GameNormalViewHolder holder, int position) {
int offset = 0;
GameEntity gameEntity;
for (int i = 0, size = subjectList.size(); i < size; i++) {
if (position > offset && position <= subjectList.get(i).getData().size() + offset) {
int index = position - offset - 1;
if (index<0){
index = 0;
}
gameEntity = subjectList.get(i).getData().get(index);
if (TextUtils.isEmpty(gameEntity.getImage()) && gameEntity.getTest() == null) {
int order = position - offset - 1;
if (subjectList.get(i).getData().get(0).getImage() != null) {
order--;
}
initGameNormal(holder, gameEntity, order, subjectList.get(i), i + 1 == size);
break;
}
}
offset = subjectList.get(i).getData().size() + offset + 1;
}
}
private void initGameNormal(GameNormalViewHolder holder, GameEntity entity,
final int i, final SubjectEntity subjectEntity, boolean isBottom) {
// 最后一个
((CardLinearLayout) holder.itemView).setBottom(isBottom);
if (TextUtils.isEmpty(subjectEntity.getData().get(0).getImage())) {
if (i + 1 == subjectEntity.getData().size()) {
((CardLinearLayout) holder.itemView).setmBottom(DisplayUtils.dip2px(context, 8));
} else {
((CardLinearLayout) holder.itemView).setmBottom(0);
}
} else {
if (i + 2 == subjectEntity.getData().size()) {
((CardLinearLayout) holder.itemView).setmBottom(DisplayUtils.dip2px(context, 8));
} else {
((CardLinearLayout) holder.itemView).setmBottom(0);
}
}
if (subjectEntity.getOrder()) {
holder.home1_game_order.setVisibility(View.VISIBLE);
holder.home1_game_order.setText(String.valueOf(i + 1));
} else {
holder.home1_game_order.setVisibility(View.GONE);
}
holder.gameThumb.setImageURI(entity.getIcon());
holder.gameNameAndSize.setText(entity.getName());
if (entity.getApk() == null || entity.getApk().isEmpty()) {
holder.gameDes.setText(entity.getBrief());
} else {
holder.gameDes.setText(String.format("%s %s", entity.getApk().get(0).getSize(), entity.getBrief()));
}
GameViewUtils.setLabelList(context, holder.labelList, entity.getTag());
final GameEntity gameEntity = entity;
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Map<String, Object> kv = new HashMap<>();
kv.put("名字", gameEntity.getName());
kv.put("位置", String.valueOf(i + 1));
DataUtils.onEvent(context, "点击", "游戏-推荐-" + subjectEntity.getName(), kv);
Map<String, Object> map = new HashMap<>();
map.put("location", subjectEntity.getName() + "-列表");
map.put("page", "游戏-推荐");
map.put("game", gameEntity.getName());
map.put("game_id", gameEntity.getId());
DataCollectionManager.onEvent(context, "click-item", map);
GameUtils.startGameDetailActivity(context, gameEntity, "(游戏-推荐:" + subjectEntity.getName() + "-列表)");
}
});
DownloadItemUtils.setOnClickListener(context, holder.downloadBtn, entity, i,
Game2FragmentAdapter.this, "(游戏-推荐:" + subjectEntity.getName() + "-列表)",
"游戏-推荐-" + subjectEntity.getName() + ":" + entity.getName());
DownloadItemUtils.updateItem(context, holder.gameDes,
holder.game_progressbar, holder.game_ll_info, holder.download_speed,
holder.download_percentage, holder.downloadBtn, entity);
}
private void initGameTestViewHolder(GameTestViewHolder holder, int position) {
int offset = 0;
GameEntity gameEntity;
for (int i = 0, size = subjectList.size(); i < size; i++) {
if (position >= offset && position <= subjectList.get(i).getData().size() + offset) {
int index = position - offset - 1;
if (index < 0){
index = 0;
}
gameEntity = subjectList.get(i).getData().get(index);
if (gameEntity.getTest() != null) {
int order = position - offset - 1;
if (subjectList.get(i).getData().get(0).getImage() != null) {
order--;
}
initGameTest(holder, gameEntity, order, subjectList.get(i), i + 1 == size);
break;
}
}
offset = subjectList.get(i).getData().size() + offset + 1;
}
}
private void initGameTest(GameTestViewHolder holder, final GameEntity gameEntity,
final int i, final SubjectEntity subjectEntity, boolean isBottom) {
// 最后一个
((CardLinearLayout) holder.itemView).setBottom(isBottom);
if (TextUtils.isEmpty(subjectEntity.getData().get(0).getImage())) {
if (i + 1 == subjectEntity.getData().size()) {
((CardLinearLayout) holder.itemView).setmBottom(DisplayUtils.dip2px(context, 8));
} else {
((CardLinearLayout) holder.itemView).setmBottom(0);
}
} else {
if (i + 2 == subjectEntity.getData().size()) {
((CardLinearLayout) holder.itemView).setmBottom(DisplayUtils.dip2px(context, 8));
} else {
((CardLinearLayout) holder.itemView).setmBottom(0);
}
}
if (subjectEntity.getOrder()) {
holder.home2_game_order.setVisibility(View.VISIBLE);
holder.home2_game_order.setText(String.valueOf(i + 1));
} else {
holder.home2_game_order.setVisibility(View.GONE);
}
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<String, Object> kv = new HashMap<>();
kv.put("名字", gameEntity.getName());
kv.put("位置", String.valueOf(i + 1));
DataUtils.onEvent(context, "点击", "游戏-推荐-" + subjectEntity.getName(), kv);
Map<String, Object> map = new HashMap<>();
map.put("location", subjectEntity.getName() + "-列表");
map.put("page", "游戏-推荐");
map.put("game", gameEntity.getName());
map.put("game_id", gameEntity.getId());
DataCollectionManager.onEvent(context, "click-item", map);
GameUtils.startGameDetailActivity(context, gameEntity, "(游戏-推荐:" + subjectEntity.getName() + "-列表)");
}
});
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, i,
Game2FragmentAdapter.this, "(游戏-推荐:" + subjectEntity.getName() + "-列表)",
"游戏-推荐-" + subjectEntity.getName() + ":" + 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, i,
Game2FragmentAdapter.this, "(游戏-推荐:" + subjectEntity.getName() + "-列表)",
"游戏-推荐-" + subjectEntity.getName() + ":" + 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 initGameImageViewHolder(GameImageViewHolder holder, int position) {
int offset = 0;
GameEntity gameEntity;
for (int i = 0, size = subjectList.size(); i < size; i++) {
if (position >= offset && position <= subjectList.get(i).getData().size() + offset) {
int index = position - offset - 1;
if (index < 0){
index = 0;
}
gameEntity = subjectList.get(i).getData().get(index);
if (position == offset && !TextUtils.isEmpty(gameEntity.getImage())) {
if (i == 0) {
((CardLinearLayout) holder.itemView).setmTop(DisplayUtils.dip2px(context, 8));
} else {
((CardLinearLayout) holder.itemView).setmTop(0);
}
final GameEntity entity = gameEntity;
final String name = subjectList.get(i).getName();
ImageUtils.getInstance(context).display(entity.getImage(), holder.image, context, 16);
holder.image.setImageURI(entity.getImage());
holder.image.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Map<String, Object> kv = new HashMap<>();
kv.put("名字", entity.getName());
kv.put("位置", "大图");
DataUtils.onEvent(context, "点击", "游戏-推荐-" + name, kv);
Map<String, Object> map = new HashMap<>();
map.put("location", name + "-大图");
map.put("page", "游戏-推荐");
DataCollectionManager.onEvent(context, "click-item", map);
if ("game".equals(entity.getType())) {
GameUtils.startGameDetailActivity(context, entity.getLink(), "(游戏-推荐:" + name + "-大图)");
} else if ("news".equals(entity.getType())) {
// 统计阅读量
NewsUtils.statNewsViews(entity.getLink());
Intent intent = new Intent(context, NewsDetailActivity.class);
intent.putExtra("newsId", entity.getLink());
intent.putExtra("entrance", "(游戏-推荐:" + name + "-大图)");
context.startActivity(intent);
} else if ("column".equals(entity.getType())) {
Intent intent = new Intent(context, SubjectActivity.class);
intent.putExtra("id", entity.getLink());
intent.putExtra("name", entity.getName());
intent.putExtra("entrance", "(游戏-推荐:" + name + "-大图)");
context.startActivity(intent);
}
}
});
break;
}
}
offset = subjectList.get(i).getData().size() + offset + 1;
}
}
public List<SubjectEntity> getSubectList() {
return subjectList;
}
}