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 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>() { @Override public List call(List list) { // 去掉重复数据 return NewsUtils.removeDuplicateData(newsEntities, list); } }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Response>() { @Override public void onResponse(List 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 { @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 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; } } }