Files
assistant-android/app/src/main/java/com/gh/gamecenter/NewsSearchActivity.java
2017-09-19 14:28:43 +08:00

321 lines
12 KiB
Java

package com.gh.gamecenter;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.NonNull;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.text.Html;
import android.util.DisplayMetrics;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.gh.base.BaseActivity;
import com.gh.common.util.DataCollectionUtils;
import com.gh.common.util.DataUtils;
import com.gh.common.util.EntranceUtils;
import com.gh.common.util.NewsUtils;
import com.gh.common.view.VerticalItemDecoration;
import com.gh.gamecenter.adapter.viewholder.FooterViewHolder;
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 java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import butterknife.BindView;
import retrofit2.HttpException;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Func1;
import rx.schedulers.Schedulers;
/**
* Created by khy on 2016/8/22.
* 新闻搜索界面
*/
public class NewsSearchActivity extends BaseActivity {
@BindView(R.id.gamedetail_news_rv)
RecyclerView mNewsSearchRv;
@BindView(R.id.tv_search)
TextView mNewsSearchTv;
@BindView(R.id.reuse_none_data)
LinearLayout mNoneData;
@BindView(R.id.et_search)
EditText mNewsSearchEt;
@BindView(R.id.gamedetail_news_ll_loading)
LinearLayout mLoading;
@BindView(R.id.reuse_no_connection)
LinearLayout mNoConn;
private LinearLayoutManager layoutManager;
private List<NewsEntity> newsEntities;
private NewsSearchAdapter searchAdapter;
private boolean isLoadOver = true;
private boolean isRemove = false;
private boolean isNetworkError = false;
private String searchKey;
private String gameId;
private Handler handler = new Handler();
private int page = 1;
@NonNull
public static Intent getIntent(Context context, String gameName, String searchKey, String gameId, String entrance) {
Intent intent = new Intent(context, NewsSearchActivity.class);
intent.putExtra("gameName", gameName);
intent.putExtra("searchKey", searchKey);
intent.putExtra("gameId", gameId);
intent.putExtra(EntranceUtils.KEY_ENTRANCE, entrance);
return intent;
}
@Override
protected int getLayoutId() {
return R.layout.activity_gamedetail_news;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = getIntent();
String gameName = intent.getExtras().getString("gameName");
searchKey = intent.getExtras().getString("searchKey");
gameId = intent.getExtras().getString("gameId");
initTitle(gameName);
DisplayMetrics outMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(outMetrics);
newsEntities = new ArrayList<>();
searchAdapter = new NewsSearchAdapter();
layoutManager = new LinearLayoutManager(this);
mNewsSearchRv.setLayoutManager(layoutManager);
mNewsSearchRv.setAdapter(searchAdapter);
mNewsSearchRv.addItemDecoration(new VerticalItemDecoration(NewsSearchActivity.this, 1, false));
mNewsSearchEt.setText(searchKey);
loadNewsData(page);
mNewsSearchTv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
searchKey = mNewsSearchEt.getText().toString().trim();
if (searchKey.length() >= 1) {
newsEntities.clear();
searchAdapter.notifyDataSetChanged();
mLoading.setVisibility(View.VISIBLE);
mNoneData.setVisibility(View.GONE);
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
handler.postDelayed(new Runnable() {
@Override
public void run() {
page = 1;
loadNewsData(page);
}
}, 500);
} else {
Toast.makeText(NewsSearchActivity.this, "请输入关键字", Toast.LENGTH_SHORT).show();
}
}
});
mNewsSearchRv.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (newState == RecyclerView.SCROLL_STATE_IDLE && layoutManager.findLastVisibleItemPosition() + 1 == searchAdapter.getItemCount()
&& isLoadOver && !isRemove && !isNetworkError) {
isLoadOver = false;
page++;
loadNewsData(page);
}
}
});
mNoConn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mNoConn.setVisibility(View.GONE);
mLoading.setVisibility(View.VISIBLE);
handler.postDelayed(new Runnable() {
@Override
public void run() {
loadNewsData(1);
}
}, 1000);
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
handler.removeCallbacksAndMessages(null);
}
private void loadNewsData(final int page) {
// DataUtils.onEvent(this, "游戏新闻搜索", searchKey);
// DataCollectionUtils.uploadSearch(this, searchKey, "游戏新闻搜索");
RetrofitManager.getInstance(this).getApi().getSearchNews(gameId, searchKey, page, 20)
.map(new Func1<List<NewsEntity>, List<NewsEntity>>() {
@Override
public List<NewsEntity> call(List<NewsEntity> list) {
// 去掉重复数据
return NewsUtils.removeDuplicateData(newsEntities, list);
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Response<List<NewsEntity>>() {
@Override
public void onResponse(List<NewsEntity> response) {
isLoadOver = true;
mLoading.setVisibility(View.GONE);
mNoneData.setVisibility(View.GONE);
if (response.size() != 0) {
newsEntities.addAll(response);
searchAdapter.notifyDataSetChanged();
} else {
if (page == 1) {
mNoneData.setVisibility(View.VISIBLE);
}
isRemove = true;
searchAdapter.notifyItemChanged(searchAdapter.getItemCount() - 1);
}
if (response.size() < 20) {
isRemove = true;
}
}
@Override
public void onFailure(HttpException e) {
if (page == 1) {
mNoConn.setVisibility(View.VISIBLE);
mLoading.setVisibility(View.GONE);
}
isLoadOver = true;
toast("加载失败,请检查网络状态");
isNetworkError = true;
searchAdapter.notifyItemChanged(searchAdapter.getItemCount() - 1);
}
});
}
public class NewsSearchAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == 0) {
View view = LayoutInflater.from(parent.getContext()).inflate(
R.layout.refresh_footerview, parent, false);
return new FooterViewHolder(view);
} else {
View view = LayoutInflater.from(parent.getContext()).inflate(
R.layout.news_text_item, parent, false);
return new NewsTextViewHolder(view);
}
}
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {
if (holder instanceof NewsTextViewHolder) {
NewsTextViewHolder viewHolder = (NewsTextViewHolder) holder;
viewHolder.title.setText(Html.fromHtml(newsEntities.get(position).getTitle()));
viewHolder.type.setVisibility(View.GONE);
viewHolder.line.setVisibility(View.GONE);
viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
NewsEntity newsEntity = newsEntities.get(holder.getPosition());
Map<String, Object> kv = new HashMap<>();
kv.put("名字", newsEntity.getTitle());
kv.put("位置", String.valueOf(holder.getPosition() + 1));
DataUtils.onEvent(NewsSearchActivity.this, "点击", "游戏新闻搜索", kv);
DataCollectionUtils.uploadClick(NewsSearchActivity.this,
"列表", "游戏新闻搜索", newsEntity.getTitle());
// 统计阅读量
NewsUtils.statNewsViews(NewsSearchActivity.this, newsEntity.getId());
NewsDetailActivity.startNewsDetailActivity(NewsSearchActivity.this, newsEntity,
mEntrance + "+(游戏新闻搜索[" + searchKey + "])");
}
});
} else if (holder instanceof FooterViewHolder) {
FooterViewHolder viewHolder = (FooterViewHolder) holder;
viewHolder.itemView.setPadding(0, 0, 0, 0);
if (isNetworkError) {
viewHolder.loading.setVisibility(View.GONE);
viewHolder.hint.setText(R.string.loading_failed_retry);
viewHolder.itemView.setClickable(true);
viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
isNetworkError = false;
notifyItemChanged(getItemCount() - 1);
loadNewsData(page);
}
});
} else if (isRemove) {
viewHolder.loading.setVisibility(View.GONE);
viewHolder.hint.setText(R.string.loading_complete);
viewHolder.itemView.setClickable(false);
} else {
viewHolder.loading.setVisibility(View.VISIBLE);
viewHolder.hint.setText(R.string.loading);
viewHolder.itemView.setClickable(false);
}
}
}
@Override
public int getItemViewType(int position) {
if (position == newsEntities.size()) {
return 0;
} else {
return 1;
}
}
@Override
public int getItemCount() {
if (newsEntities.isEmpty()) {
return 0;
}
return newsEntities.size() + 1;
}
}
}