Files
assistant-android/app/src/main/java/com/gh/gamecenter/adapter/GameNewsAdapter.java

255 lines
9.8 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.Toast;
import com.gh.common.util.*;
import com.gh.gamecenter.NewsSearchActivity;
import com.gh.gamecenter.R;
import com.gh.gamecenter.adapter.viewholder.*;
import com.gh.gamecenter.entity.NewsEntity;
import com.gh.gamecenter.retrofit.Response;
import com.gh.gamecenter.retrofit.RetrofitManager;
import retrofit2.adapter.rxjava.HttpException;
import rx.Observable;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Func1;
import rx.schedulers.Schedulers;
import java.util.*;
/**
* Created by LGT on 2016/8/29.
*/
public class GameNewsAdapter extends BaseRecyclerAdapter<ViewHolder> {
private RecyclerView mGameNewsList;
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;
public GameNewsAdapter(Context context, List<String> tList, RecyclerView mGameNewsList, String id, String type,
String entrance) {
super(context);
this.mGameNewsList = mGameNewsList;
mNewsList = new ArrayList<>();
mTypeList = tList;
mGameId = id;
mNewsType = type;
mEntrance = entrance;
isLoading = false;
isRemove = false;
isNetworkError = false;
isOpenKeyBoard = false;
addList(0);
}
public void addList(final int offset) {
if (isLoading) {
return;
}
isLoading = true;
Observable<List<NewsEntity>> observable;
if ("全部".equals(mNewsType)) {
observable = RetrofitManager.getApi().getGameNews(mGameId, 20, offset);
} else {
observable = RetrofitManager.getApi().getGameNews(mGameId, 20, offset, mNewsType);
}
observable.subscribeOn(Schedulers.io())
.map(new Func1<List<NewsEntity>, List<NewsEntity>>() {
@Override
public List<NewsEntity> call(List<NewsEntity> list) {
// 去除重复数据
return NewsUtils.removeDuplicateData(mNewsList, list);
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Response<List<NewsEntity>>() {
@Override
public void onResponse(List<NewsEntity> response) {
if (offset == 0) {
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 (offset == 0) {
mGameNewsList.scrollToPosition(1);
}
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.game_news_type_list.getLayoutParams();
params.height = (int) Math.ceil(mTypeList.size() / 5f) * DisplayUtils.dip2px(mContext, 35) + DisplayUtils.dip2px(mContext, 12);
viewHolder.game_news_type_list.setLayoutParams(params);
if (viewHolder.game_news_type_list.getAdapter() == null) {
viewHolder.game_news_type_list.setHasFixedSize(true);
viewHolder.game_news_type_list.setLayoutManager(new GridLayoutManager(mContext, 5));
viewHolder.game_news_type_list.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(newsEntity.getId());
NewsUtils.startNewsDetailActivity(mContext, newsEntity, mEntrance + "+(游戏新闻列表:" + mNewsType + ")");
}
});
} else if (holder instanceof NewsFooterViewHolder) {
NewsFooterViewHolder footerViewHolder = ((NewsFooterViewHolder) holder);
if (isRemove) {
footerViewHolder.hint.setText("加载完毕");
footerViewHolder.loading.setVisibility(View.GONE);
} else {
footerViewHolder.hint.setText("加载中...");
footerViewHolder.loading.setVisibility(View.VISIBLE);
}
} else if (holder instanceof GameNewsSearchViewHolder) {
if (isOpenKeyBoard) {
((GameNewsSearchViewHolder) holder).game_news_et_search.requestFocus();
InputMethodManager imm = (InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(0, InputMethodManager.SHOW_FORCED);
isOpenKeyBoard = false;
}
GameNewsSearchViewHolder searchViewHolder = ((GameNewsSearchViewHolder) holder);
searchViewHolder.game_news_tv_search.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String searchKey = ((GameNewsSearchViewHolder) holder).game_news_et_search.getText().toString().trim();
if (searchKey.length() >= 1) {
Intent intent = new Intent(mContext, NewsSearchActivity.class);
intent.putExtra("gameName", "搜索结果");
intent.putExtra("searchKey", searchKey);
intent.putExtra("gameId", mGameId);
intent.putExtra("entrance", mEntrance + "+(游戏新闻列表:" + mNewsType + ")");
mContext.startActivity(intent);
} else {
Toast.makeText(mContext, "请输入关键字", Toast.LENGTH_SHORT).show();
}
}
});
}
}
@Override
public int getItemCount() {
return 3 + mNewsList.size();
}
@Override
public int getItemViewType(int position) {
return position;
}
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);
}
}