Files
assistant-android/app/src/main/java/com/gh/gamecenter/adapter/GameNewsAdapter.java
2018-04-12 17:08:50 +08:00

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);
}
}