288 lines
11 KiB
Java
288 lines
11 KiB
Java
package com.gh.gamecenter.adapter;
|
|
|
|
import android.content.Context;
|
|
import android.content.Intent;
|
|
import android.support.v7.widget.GridLayoutManager;
|
|
import android.support.v7.widget.RecyclerView;
|
|
import android.support.v7.widget.RecyclerView.ViewHolder;
|
|
import android.text.Html;
|
|
import android.view.View;
|
|
import android.view.ViewGroup;
|
|
import android.view.inputmethod.InputMethodManager;
|
|
import android.widget.LinearLayout;
|
|
|
|
import com.gh.common.constant.Config;
|
|
import com.gh.common.util.DataCollectionUtils;
|
|
import com.gh.common.util.DataUtils;
|
|
import com.gh.common.util.DisplayUtils;
|
|
import com.gh.common.util.NewsUtils;
|
|
import com.gh.common.util.StringUtils;
|
|
import com.gh.common.util.UrlFilterUtils;
|
|
import com.gh.gamecenter.NewsDetailActivity;
|
|
import com.gh.gamecenter.NewsSearchActivity;
|
|
import com.gh.gamecenter.R;
|
|
import com.gh.gamecenter.adapter.viewholder.GameNewsSearchViewHolder;
|
|
import com.gh.gamecenter.adapter.viewholder.GameNewsTypeListViewHolder;
|
|
import com.gh.gamecenter.adapter.viewholder.NewsFooterViewHolder;
|
|
import com.gh.gamecenter.adapter.viewholder.NewsTextViewHolder;
|
|
import com.gh.gamecenter.entity.NewsEntity;
|
|
import com.gh.gamecenter.retrofit.Response;
|
|
import com.gh.gamecenter.retrofit.RetrofitManager;
|
|
import com.lightgame.adapter.BaseRecyclerAdapter;
|
|
import com.lightgame.utils.Utils;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.HashMap;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
|
|
import retrofit2.HttpException;
|
|
import rx.Observable;
|
|
import rx.android.schedulers.AndroidSchedulers;
|
|
import rx.functions.Func1;
|
|
import rx.schedulers.Schedulers;
|
|
|
|
/**
|
|
* Created by LGT on 2016/8/29.
|
|
*/
|
|
public class GameNewsAdapter extends BaseRecyclerAdapter<ViewHolder> {
|
|
|
|
private RecyclerView mGameNewsList;
|
|
|
|
private LinearLayout mNoDataLl;
|
|
|
|
private ArrayList<NewsEntity> mNewsList;
|
|
private List<String> mTypeList;
|
|
|
|
private String mGameId;
|
|
private String mNewsType;
|
|
private String mEntrance;
|
|
|
|
private boolean isLoading;
|
|
private boolean isRemove;
|
|
private boolean isNetworkError;
|
|
private boolean isOpenKeyBoard;
|
|
|
|
private int mPage;
|
|
|
|
public GameNewsAdapter(Context context, List<String> tList, RecyclerView mGameNewsList, String id, String type,
|
|
String entrance, LinearLayout noDataLl) {
|
|
super(context);
|
|
|
|
this.mGameNewsList = mGameNewsList;
|
|
this.mNoDataLl = noDataLl;
|
|
|
|
mNewsList = new ArrayList<>();
|
|
mTypeList = tList;
|
|
|
|
mGameId = id;
|
|
mNewsType = type;
|
|
mEntrance = entrance;
|
|
|
|
isLoading = false;
|
|
isRemove = false;
|
|
isNetworkError = false;
|
|
isOpenKeyBoard = false;
|
|
mPage = 1;
|
|
|
|
addList();
|
|
}
|
|
|
|
public void addList() {
|
|
if (isLoading) {
|
|
return;
|
|
}
|
|
isLoading = true;
|
|
|
|
Observable<List<NewsEntity>> observable;
|
|
if (mContext.getString(R.string.news_all).equals(mNewsType)) {
|
|
observable = RetrofitManager.getInstance(mContext).getApi().getGameNews(
|
|
UrlFilterUtils.getFilterQuery("game_id", mGameId), 20, mPage);
|
|
} else {
|
|
observable = RetrofitManager.getInstance(mContext).getApi().getGameNews(
|
|
UrlFilterUtils.getFilterQuery("game_id", mGameId, "type", mNewsType), 20, mPage);
|
|
}
|
|
observable.subscribeOn(Schedulers.io())
|
|
.map(new Func1<List<NewsEntity>, List<NewsEntity>>() {
|
|
@Override
|
|
public List<NewsEntity> call(List<NewsEntity> list) {
|
|
// 去除重复数据
|
|
Config.filterPluginArticle(list);
|
|
return NewsUtils.removeDuplicateData(mNewsList, list);
|
|
}
|
|
})
|
|
.observeOn(AndroidSchedulers.mainThread())
|
|
.subscribe(new Response<List<NewsEntity>>() {
|
|
@Override
|
|
public void onResponse(List<NewsEntity> response) {
|
|
if (mPage == 1) {
|
|
mNewsList.clear();
|
|
}
|
|
|
|
if (response.size() != 0) {
|
|
mNewsList.addAll(response);
|
|
notifyItemRangeInserted(mNewsList.size() - response.size() + 2, response.size());
|
|
notifyItemChanged(getItemCount() - response.size() - 2);
|
|
if (response.size() < 20) {
|
|
isRemove = true;
|
|
notifyItemChanged(getItemCount() - 1);
|
|
}
|
|
} else {
|
|
isRemove = true;
|
|
notifyItemChanged(getItemCount() - 1);
|
|
}
|
|
|
|
if (mPage == 1) {
|
|
mGameNewsList.scrollToPosition(1);
|
|
if (mNewsList.size() == 0) {
|
|
mNoDataLl.setVisibility(View.VISIBLE);
|
|
mGameNewsList.setVisibility(View.GONE);
|
|
|
|
} else {
|
|
mNoDataLl.setVisibility(View.GONE);
|
|
mGameNewsList.setVisibility(View.VISIBLE);
|
|
}
|
|
}
|
|
|
|
mPage ++;
|
|
isLoading = false;
|
|
}
|
|
|
|
@Override
|
|
public void onFailure(HttpException e) {
|
|
isLoading = false;
|
|
isNetworkError = true;
|
|
}
|
|
});
|
|
}
|
|
|
|
@Override
|
|
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
|
|
if (viewType == 0) {
|
|
View view = mLayoutInflater.inflate(R.layout.game_news_search_item, parent, false);
|
|
return new GameNewsSearchViewHolder(view);
|
|
} else if (viewType == 1) {
|
|
View view = mLayoutInflater.inflate(R.layout.game_news_type_item, parent, false);
|
|
return new GameNewsTypeListViewHolder(view);
|
|
} else if (mNewsList.size() > 0 && viewType > 1 && viewType <= 1 + mNewsList.size()) {
|
|
View view = mLayoutInflater.inflate(R.layout.news_text_item, parent, false);
|
|
return new NewsTextViewHolder(view);
|
|
} else {
|
|
View view = mLayoutInflater.inflate(R.layout.news_footer_item, parent, false);
|
|
return new NewsFooterViewHolder(view);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {
|
|
if (holder instanceof GameNewsTypeListViewHolder) {
|
|
GameNewsTypeListViewHolder viewHolder = (GameNewsTypeListViewHolder) holder;
|
|
ViewGroup.LayoutParams params = viewHolder.typeList.getLayoutParams();
|
|
params.height = (int) Math.ceil(mTypeList.size() / 5f) * DisplayUtils.dip2px(mContext, 35) + DisplayUtils.dip2px(mContext, 12);
|
|
viewHolder.typeList.setLayoutParams(params);
|
|
|
|
if (viewHolder.typeList.getAdapter() == null) {
|
|
viewHolder.typeList.setHasFixedSize(true);
|
|
viewHolder.typeList.setLayoutManager(new GridLayoutManager(mContext, 5));
|
|
viewHolder.typeList.setAdapter(new GameNewsTypeListAdapter(mContext, mTypeList, mNewsType));
|
|
}
|
|
} else if (holder instanceof NewsTextViewHolder) {
|
|
final NewsTextViewHolder viewHolder = (NewsTextViewHolder) holder;
|
|
|
|
viewHolder.type.setVisibility(View.GONE);
|
|
|
|
// 第一个
|
|
if (position - 2 == 0) {
|
|
viewHolder.line.setVisibility(View.GONE);
|
|
} else {
|
|
viewHolder.line.setVisibility(View.VISIBLE);
|
|
}
|
|
|
|
|
|
final NewsEntity newsEntity = mNewsList.get(position - 2);
|
|
viewHolder.type.setBackgroundResource(NewsUtils.getDrawableIdByType(newsEntity.getType()));
|
|
viewHolder.type.setText(newsEntity.getType());
|
|
viewHolder.title.setText(Html.fromHtml(newsEntity.getTitle()));
|
|
viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
|
|
@Override
|
|
public void onClick(View v) {
|
|
Map<String, Object> kv = new HashMap<>();
|
|
kv.put("名字", newsEntity.getTitle());
|
|
kv.put("位置", String.valueOf(viewHolder.getPosition() + 1));
|
|
DataUtils.onEvent(mContext, "点击", "游戏新闻列表", kv);
|
|
|
|
DataCollectionUtils.uploadClick(mContext, mNewsType, "游戏新闻列表", newsEntity.getTitle());
|
|
|
|
// 统计阅读量
|
|
NewsUtils.statNewsViews(mContext, newsEntity.getId());
|
|
NewsDetailActivity.startNewsDetailActivity(mContext, newsEntity,
|
|
StringUtils.buildString(mEntrance, "+(游戏新闻列表[", mNewsType + "])"));
|
|
}
|
|
});
|
|
} else if (holder instanceof NewsFooterViewHolder) {
|
|
NewsFooterViewHolder footerViewHolder = ((NewsFooterViewHolder) holder);
|
|
if (isRemove) {
|
|
footerViewHolder.hint.setText(R.string.loading_complete);
|
|
footerViewHolder.loading.setVisibility(View.GONE);
|
|
} else {
|
|
footerViewHolder.hint.setText(R.string.loading);
|
|
footerViewHolder.loading.setVisibility(View.VISIBLE);
|
|
}
|
|
} else if (holder instanceof GameNewsSearchViewHolder) {
|
|
if (isOpenKeyBoard) {
|
|
((GameNewsSearchViewHolder) holder).searchEt.requestFocus();
|
|
InputMethodManager imm = (InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE);
|
|
imm.toggleSoftInput(0, InputMethodManager.SHOW_FORCED);
|
|
isOpenKeyBoard = false;
|
|
}
|
|
|
|
GameNewsSearchViewHolder searchViewHolder = ((GameNewsSearchViewHolder) holder);
|
|
searchViewHolder.searchTv.setOnClickListener(new View.OnClickListener() {
|
|
@Override
|
|
public void onClick(View v) {
|
|
String searchKey = ((GameNewsSearchViewHolder) holder).searchEt.getText().toString().trim();
|
|
if (searchKey.length() >= 1) {
|
|
Intent intent = NewsSearchActivity.getIntent(mContext, "搜索结果", searchKey, mGameId,
|
|
StringUtils.buildString(mEntrance, "+(游戏新闻列表[", mNewsType, "])"));
|
|
mContext.startActivity(intent);
|
|
} else {
|
|
Utils.toast(mContext, R.string.search_hint);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public int getItemViewType(int position) {
|
|
return position;
|
|
}
|
|
|
|
@Override
|
|
public int getItemCount() {
|
|
return 3 + mNewsList.size();
|
|
}
|
|
|
|
public ArrayList<NewsEntity> getNewsList() {
|
|
return mNewsList;
|
|
}
|
|
|
|
public boolean isLoading() {
|
|
return isLoading;
|
|
}
|
|
|
|
public boolean isRemove() {
|
|
return isRemove;
|
|
}
|
|
|
|
public boolean isNetworkError() {
|
|
return isNetworkError;
|
|
}
|
|
|
|
public void openKeyBoard() {
|
|
isOpenKeyBoard = true;
|
|
notifyItemChanged(0);
|
|
}
|
|
|
|
}
|