package com.gh.gamecenter.adapter; import android.content.Context; import android.graphics.drawable.ColorDrawable; import android.support.v4.content.ContextCompat; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView.ViewHolder; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.gh.base.adapter.BaseRecyclerAdapter; import com.gh.common.util.DisplayUtils; import com.gh.gamecenter.R; import com.gh.gamecenter.adapter.viewholder.FooterViewHolder; import com.gh.gamecenter.adapter.viewholder.VoteViewHolder; import com.gh.gamecenter.db.VersionVoteDao; import com.gh.gamecenter.entity.VersionVoteEntity; import com.gh.base.OnRequestCallBackListener; import com.gh.gamecenter.retrofit.Response; import com.gh.gamecenter.retrofit.RetrofitManager; import java.util.ArrayList; import java.util.List; import retrofit2.HttpException; import rx.android.schedulers.AndroidSchedulers; import rx.schedulers.Schedulers; /** * Created by khy on 2017/4/11. * 求版本投票页面适配器 */ public class VoteAdapter extends BaseRecyclerAdapter { private OnRequestCallBackListener mCallBackListener; private OnAddVoteListener mAddVoteListener; private float mPbwidth; //进度条原始最大宽度 private List mVoteList; private VersionVoteDao mVoteDao; private boolean isRemove; private boolean isNetworkError; private boolean isLoaded; private String mGameId; public VoteAdapter(Context context, OnRequestCallBackListener onRequestCallBackListener , OnAddVoteListener addVoteListener, String gameId, VersionVoteDao voteDao) { super(context); this.mCallBackListener = onRequestCallBackListener; this.mAddVoteListener = addVoteListener; this.mGameId = gameId; mPbwidth = (float) (mContext.getResources().getDisplayMetrics().widthPixels * 0.65); mVoteList = new ArrayList<>(); mVoteDao = voteDao; getVersionVote(0); } public void getVersionVote(final int offset) { RetrofitManager .getApi() .getVersionVote(mGameId, offset, 20) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Response>() { @Override public void onResponse(List response) { super.onResponse(response); if (response.size() > 0) { if (response.size() < 20) { isRemove = true; } if (offset == 0) { mCallBackListener.loadDone(); } mVoteList.addAll(response); notifyItemRangeInserted(mVoteList.size() - response.size(), response.size()); } else { isRemove = true; if (mVoteList.size() == 0) { mCallBackListener.loadEmpty(); } } isLoaded = true; } @Override public void onFailure(HttpException e) { super.onFailure(e); isLoaded = true; if (offset == 0) { mCallBackListener.loadError(); } else { isNetworkError = true; notifyItemChanged(getItemCount() - 1); } } }); } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if (viewType == 0) { View view = LayoutInflater.from(mContext).inflate(R.layout.refresh_footerview, parent, false); return new FooterViewHolder(view); } else { View view = LayoutInflater.from(mContext).inflate(R.layout.vote_item, parent, false); return new VoteViewHolder(view); } } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { if (holder instanceof VoteViewHolder) { final VoteViewHolder viewHolder = (VoteViewHolder) holder; viewHolder.voteBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { } }); VersionVoteEntity versionVoteEntity = mVoteList.get(position); if (mVoteDao.isVote(versionVoteEntity.getId())) { viewHolder.voteBtn.setBackgroundResource(R.drawable.border_suggest_bg); viewHolder.voteBtn.setTextColor(ContextCompat.getColor(mContext, R.color.content)); viewHolder.voteBtn.setText("已投"); viewHolder.voteBtn.setEnabled(false); } else { viewHolder.voteBtn.setBackgroundResource(R.drawable.comment_border_bg); viewHolder.voteBtn.setTextColor(ContextCompat.getColor(mContext, R.color.theme)); viewHolder.voteBtn.setText("投票"); viewHolder.voteBtn.setEnabled(true); } View progressbar = viewHolder.progressbar; ViewGroup.LayoutParams layoutParams = progressbar.getLayoutParams(); if (position > 0) { float maxSize = (float) mVoteList.get(0).getNum(); float curSize = (float) versionVoteEntity.getNum(); float f = curSize / maxSize; layoutParams.width = (int) (mPbwidth * f); } else { layoutParams.width = (int) mPbwidth; } viewHolder.name.setText(versionVoteEntity.getName()); viewHolder.count.setText(versionVoteEntity.getNum() + "票"); progressbar.setLayoutParams(layoutParams); viewHolder.voteBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mCallBackListener.loadDone(viewHolder.name.getText().toString()); } }); } else if (holder instanceof FooterViewHolder) { initFooterViewHolder((FooterViewHolder) holder); } } @Override public int getItemViewType(int position) { if (position == getItemCount() - 1) { return 0; } else { return 1; } } @Override public int getItemCount() { if (mVoteList.size() == 0) { return 0; } return mVoteList.size() + 1; } private void initFooterViewHolder(final FooterViewHolder viewHolder) { if (isNetworkError) { viewHolder.loading.setVisibility(View.GONE); viewHolder.hint.setText("加载失败,点击重试"); viewHolder.hint.setBackgroundDrawable(new ColorDrawable(0)); viewHolder.itemView.setClickable(true); viewHolder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { isNetworkError = false; notifyItemChanged(getItemCount() - 1); getVersionVote(mVoteList.size()); } }); } else if (isRemove) { viewHolder.loading.setVisibility(View.GONE); viewHolder.hint.setText("添加选项"); int dp = DisplayUtils.dip2px(mContext, 7); viewHolder.hint.setPadding(2 * dp, dp, 2 * dp, dp); viewHolder.hint.setBackgroundResource(R.drawable.border_suggest_bg); viewHolder.itemView.setClickable(false); viewHolder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mAddVoteListener.addVote(); } }); } else { viewHolder.loading.setVisibility(View.VISIBLE); viewHolder.hint.setText(R.string.loading); viewHolder.hint.setBackgroundDrawable(new ColorDrawable(0)); viewHolder.itemView.setClickable(false); } } public void voteCallBack(boolean cast, boolean isNewVote, String id, String name) { if (cast) { if (isNewVote) { VersionVoteEntity voteEntity = new VersionVoteEntity(); voteEntity.setId(id); voteEntity.setName(name); voteEntity.setNum(1); mVoteList.add(voteEntity); mCallBackListener.loadDone(); } else { for (VersionVoteEntity versionVoteEntity : mVoteList) { if ((id).equals(versionVoteEntity.getId())) { versionVoteEntity.setNum(versionVoteEntity.getNum() + 1); } } } } notifyDataSetChanged(); } public boolean isLoaded() { return isLoaded; } public boolean isRemove() { return isRemove; } public interface OnAddVoteListener { void addVote(); } }