Files
assistant-android/app/src/main/java/com/gh/gamecenter/adapter/GameNewsAdapter.java
叶子维 9d91796548 feat: APP内容配置重构-换一批—客户端 https://jira.shanqu.cc/browse/GHZS-4256
feat: APP内容配置重构-刷新轮换—客户端 https://jira.shanqu.cc/browse/GHZS-4257
feat: APP内容配置重构-其他组件:搜索栏—客户端 https://jira.shanqu.cc/browse/GHZS-4073
feat: APP内容配置重构-页面:多tab导航页—客户端 https://jira.shanqu.cc/browse/GHZS-4080
feat: APP内容配置重构-其他组件:下拉推送—客户端 https://jira.shanqu.cc/browse/GHZS-4070
feat: APP内容配置重构-页面:多tab导航页—客户端 https://jira.shanqu.cc/browse/GHZS-4080
feat: APP内容配置重构-底部tab—客户端 https://jira.shanqu.cc/browse/GHZS-4025
2024-01-30 11:53:31 +08:00

282 lines
11 KiB
Java

package com.gh.gamecenter.adapter;
import android.content.Context;
import android.content.Intent;
import android.text.Html;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.LinearLayout;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.RecyclerView.ViewHolder;
import com.gh.common.util.DataCollectionUtils;
import com.gh.common.util.NewsUtils;
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.NewsTextViewHolder;
import com.gh.gamecenter.common.retrofit.Response;
import com.gh.gamecenter.common.utils.TextHelper;
import com.gh.gamecenter.common.viewholder.FooterViewHolder;
import com.gh.gamecenter.core.utils.DisplayUtils;
import com.gh.gamecenter.core.utils.StringUtils;
import com.gh.gamecenter.core.utils.UrlFilterUtils;
import com.gh.gamecenter.databinding.GameNewsSearchItemBinding;
import com.gh.gamecenter.databinding.GameNewsTypeItemBinding;
import com.gh.gamecenter.databinding.NewsTextItemBinding;
import com.gh.gamecenter.feature.entity.NewsEntity;
import com.gh.gamecenter.newsdetail.NewsDetailActivity;
import com.gh.gamecenter.retrofit.RetrofitManager;
import com.lightgame.adapter.BaseRecyclerAdapter;
import com.lightgame.utils.Utils;
import java.util.ArrayList;
import java.util.List;
import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.functions.Function;
import io.reactivex.schedulers.Schedulers;
import retrofit2.HttpException;
/**
* 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;
notifyItemChanged(getItemCount() - 1);
Observable<List<NewsEntity>> observable;
if (mContext.getString(R.string.news_all).equals(mNewsType)) {
observable = RetrofitManager.getInstance().getApi().getGameNews(
UrlFilterUtils.getFilterQuery("game_id", mGameId), 20, mPage);
} else {
observable = RetrofitManager.getInstance().getApi().getGameNews(
UrlFilterUtils.getFilterQuery("game_id", mGameId, "type", mNewsType), 20, mPage);
}
observable.subscribeOn(Schedulers.io())
.map(new Function<List<NewsEntity>, List<NewsEntity>>() {
@Override
public List<NewsEntity> apply(List<NewsEntity> 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;
notifyItemChanged(getItemCount() - 1);
}
});
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == 0) {
return new GameNewsSearchViewHolder(GameNewsSearchItemBinding.inflate(mLayoutInflater, parent, false));
} else if (viewType == 1) {
return new GameNewsTypeListViewHolder(GameNewsTypeItemBinding.inflate(mLayoutInflater, parent, false));
} else if (mNewsList.size() > 0 && viewType > 1 && viewType <= 1 + mNewsList.size()) {
return new NewsTextViewHolder(NewsTextItemBinding.inflate(mLayoutInflater, parent, false));
} else {
View view = mLayoutInflater.inflate(R.layout.refresh_footerview, parent, false);
return new FooterViewHolder(view);
}
}
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {
if (holder instanceof GameNewsTypeListViewHolder) {
GameNewsTypeListViewHolder viewHolder = (GameNewsTypeListViewHolder) holder;
ViewGroup.LayoutParams params = viewHolder.binding.gameNewsTypeList.getLayoutParams();
params.height = (int) Math.ceil(mTypeList.size() / 5f) * DisplayUtils.dip2px(mContext, 35) + DisplayUtils.dip2px(mContext, 12);
viewHolder.binding.gameNewsTypeList.setLayoutParams(params);
if (viewHolder.binding.gameNewsTypeList.getAdapter() == null) {
viewHolder.binding.gameNewsTypeList.setHasFixedSize(true);
viewHolder.binding.gameNewsTypeList.setLayoutManager(new GridLayoutManager(mContext, 5));
viewHolder.binding.gameNewsTypeList.setAdapter(new GameNewsTypeListAdapter(mContext, mTypeList, mNewsType));
}
} else if (holder instanceof NewsTextViewHolder) {
final NewsTextViewHolder viewHolder = (NewsTextViewHolder) holder;
viewHolder.binding.newsTextType.setVisibility(View.GONE);
// 第一个
if (position - 2 == 0) {
viewHolder.binding.newsTextLine.setVisibility(View.GONE);
} else {
viewHolder.binding.newsTextLine.setVisibility(View.VISIBLE);
}
final NewsEntity newsEntity = mNewsList.get(position - 2);
viewHolder.binding.newsTextType.setBackgroundResource(NewsUtils.getDrawableIdByType(newsEntity.getType()));
viewHolder.binding.newsTextType.setText(newsEntity.getType());
viewHolder.binding.newsTextTitle.setText(Html.fromHtml(newsEntity.getTitle()));
viewHolder.binding.getRoot().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
DataCollectionUtils.uploadClick(mContext, mNewsType, "游戏新闻列表", newsEntity.getTitle());
// 统计阅读量
NewsUtils.statNewsViews(newsEntity.getId());
NewsDetailActivity.startNewsDetailActivity(mContext, newsEntity,
StringUtils.buildString(mEntrance, "+(游戏新闻列表[", mNewsType + "])"));
}
});
} else if (holder instanceof FooterViewHolder) {
FooterViewHolder viewHolder = ((FooterViewHolder) holder);
viewHolder.initItemPadding();
viewHolder.initFooterViewHolder(isLoading, isNetworkError, isRemove, v -> {
if (isNetworkError) {
isNetworkError = false;
notifyItemChanged(getItemCount() - 1);
addList();
}
});
} else if (holder instanceof GameNewsSearchViewHolder) {
if (isOpenKeyBoard) {
((GameNewsSearchViewHolder) holder).binding.gameNewsEtSearch.requestFocus();
InputMethodManager imm = (InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(0, InputMethodManager.SHOW_FORCED);
isOpenKeyBoard = false;
}
GameNewsSearchViewHolder searchViewHolder = ((GameNewsSearchViewHolder) holder);
searchViewHolder.binding.gameNewsTvSearch.setOnClickListener(v -> {
String searchKey = ((GameNewsSearchViewHolder) holder).binding.gameNewsEtSearch.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);
}
});
TextHelper.limitTheLengthOfEditText(searchViewHolder.binding.gameNewsEtSearch, 50, () -> Utils.toast(searchViewHolder.binding.gameNewsEtSearch.getContext(), "最多输入50个字"));
}
}
@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);
}
}