在recyclerView点击滚动时添加ProgressBar

时间:2016-05-19 12:29:50

标签: android android-recyclerview android-adapter

  

我必须在recyclerView中添加分页。但是当我在recyclerView滚动时,我被困在添加进度条。

我一直在尝试一天但是unfortunately没有得到有效的解决方案来在recyclerView scrolling运行时添加进度条。我有三个ViewHolder。

RecyclerView Scroll Listener

rvRewardItems.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
            }

            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);

                int visibleItemCount = recyclerView.getChildCount();
                int totalItemCount = wrapperLinearLayout.getItemCount();
                int firstVisibleItem = wrapperLinearLayout.findFirstVisibleItemPosition();
                int lastInScreen = firstVisibleItem + visibleItemCount;

                if ((lastInScreen == totalItemCount) && !isLoadingMore) {
                    if (!mStopLoadingData) {
                        try {
                            isLoadingMore = true;
                            // Add item for progress ba
                            new Handler().post(new Runnable() {
                                @Override
                                public void run() {
                                    adapter.addProgressView();
                                }
                            });

                            loadReviews(false, false);
                        }catch (IllegalStateException e){
                            e.printStackTrace();
                        }
                    }
                }
            }
        });

RewardFinalAdapter.class

public class RewardFinalAdapter  extends RecyclerView.Adapter<MainViewHolder>
{
    private Context context;
    private ArrayList<RewardItemBO> rewardArray;
    private OnItemClickListener mItemClickListener;
    public static final int VIEW_TYPE_PROGRESS = 0;
    public static final int VIEW_TYPE_ITEM = 1;
    public static final int VIEW_TYPE_HEADER = 2;

    public RewardFinalAdapter(Context context, ArrayList<RewardItemBO> mainItems) {
        this.context = context;
        rewardArray = getFilterRewards(mainItems);
    }

    public void resetArray(ArrayList<RewardItemBO> latestArray)
    {
        rewardArray = getFilterRewards(latestArray);
    }

    public void setArrayItems(ArrayList<RewardItemBO> latestArray) {
        rewardArray = latestArray;
    }

    @Override
    public int getItemViewType(int position) {
        if(rewardArray.get(position).isHeader())
            return VIEW_TYPE_HEADER;
        else if(rewardArray.get(position).isShowProgress())
            return VIEW_TYPE_PROGRESS;
        else
            return VIEW_TYPE_ITEM;
    }

    @Override
    public int getItemCount() {
        return rewardArray.size();
    }

    public RewardItemBO getItem(int position) {
        return rewardArray.get(position);
    }

    public void addItems( ArrayList<RewardItemBO> overallItem){

        rewardArray = getFilterRewards(overallItem);
//        notifyItemInserted(items.size() - 1);
        this.notifyDataSetChanged();
    }

    // Create new views (invoked by the layout manager)

    @Override
    public MainViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
        switch (viewType){
            case VIEW_TYPE_HEADER:
                View itemView = LayoutInflater.from(viewGroup.getContext())
                        .inflate(R.layout.order_list_header, viewGroup, false);
                return new RewardListViewHolderHeader(itemView);
            case VIEW_TYPE_ITEM:
                View view = LayoutInflater.from(context).inflate(R.layout.item_rewards, viewGroup, false);
                return new RewardViewHolder(view);
            case VIEW_TYPE_PROGRESS:
                Log.v("view_type_progress","I am in VIEW_TYPE_PROGRESS");
                View progressView = LayoutInflater.from(context).inflate(R.layout.progress_loader, viewGroup, false);
                return new ProgressViewHolder(progressView);
        }
        return null;
    }

    // Replace the contents of a view (invoked by the layout manager)
    @Override
    public void onBindViewHolder(MainViewHolder viewHolder, int position) {

        RewardItemBO rewardItemBO= rewardArray.get(position);

        if(viewHolder instanceof RewardViewHolder)
        {
            RewardViewHolder  rewardViewHolder=(RewardViewHolder) viewHolder;
            rewardViewHolder.tvRewardTitle.setText(rewardArray.get(position).getRewardTitle());
            rewardViewHolder.tvRewardDescription.setText(rewardArray.get(position).getRewardMessage());

            String formatedDate = DateTimeOp.oneFormatToAnother(rewardArray.get(position).getRewardExpiryDate(), Constants.dateFormat18, Constants.dateFormat6);
            rewardViewHolder.tvRewardExpiry.setText("Expires " + formatedDate);

            if(rewardArray.get(position).getRewardShowRedeem().equals("1"))
            {
                rewardViewHolder.btnGrey.setVisibility(View.VISIBLE);
                rewardViewHolder.btnGrey.setText("Redeemed");
            }
            else if(rewardArray.get(position).getRewardExpired().equals("1"))
            {
                rewardViewHolder.btnGrey.setVisibility(View.VISIBLE);
                rewardViewHolder.btnGrey.setText("Expired");
            }
            else
            {
                rewardViewHolder.btnOrange.setVisibility(View.VISIBLE);
                rewardViewHolder.btnOrange.setText("Get Code");
            }
        }
        else if(viewHolder instanceof RewardListViewHolderHeader)
        {
            RewardListViewHolderHeader  holder = (RewardListViewHolderHeader ) viewHolder;
            holder.tvHeader.setText(rewardItemBO.getHeaderTitle());
        }
        else if(viewHolder instanceof ProgressViewHolder)
        {

            ProgressViewHolder  progressViewHolder = (ProgressViewHolder) viewHolder;
            progressViewHolder.progressBar.setIndeterminate(true);
        }
    }

    public void addOnTop(ArrayList<RewardItemBO> topItemList) {
        Collections.reverse(topItemList);
        rewardArray.addAll(0, topItemList);
        notifyItemRangeInserted(0, topItemList.size());
    }

    public interface OnItemClickListener {
        public void onItemClick(View view , int position);
    }

    public void SetOnItemClickListener(final OnItemClickListener mItemClickListener) {
        this.mItemClickListener = mItemClickListener;
    }

    @Override
    public long getItemId(int position) {
        return  position;
    }

    public ArrayList<RewardItemBO> getFilterRewards(ArrayList<RewardItemBO> mainItems){
        ArrayList<RewardItemBO> currentRewardList = new ArrayList<RewardItemBO>();
        ArrayList<RewardItemBO> pastRewardList = new ArrayList<RewardItemBO>();

        ArrayList<RewardItemBO> dummyArray = new ArrayList<>();

        for (RewardItemBO rewardItemBO : mainItems) {

            try {
                //because reward item with progress have everything null in it.
                if(rewardItemBO.getRewardExpired()!=null && !rewardItemBO.isShowProgress())
                {
                    int isExpired = Integer.parseInt(rewardItemBO.getRewardExpired());
                    if(isExpired==1)
                        pastRewardList.add(rewardItemBO);
                    else
                        currentRewardList.add(rewardItemBO);
                }

            }catch (NumberFormatException e){
                e.printStackTrace();
            }
        }

        if(currentRewardList.size()>0){
            currentRewardList.add(0, new RewardItemBO(context.getResources().getString(R.string.Current)));
            dummyArray.addAll(currentRewardList);
        }
        if(pastRewardList.size()>0){
            pastRewardList.add(0, new RewardItemBO(context.getResources().getString(R.string.Past)));
            dummyArray.addAll(pastRewardList);
        }
        return dummyArray;
    }

    public void addProgressView()
    {
        rewardArray.add(new RewardItemBO(true));
        //notifyItemChanged(rewardArray.size());
        notifyDataSetChanged();
    }

    public void removeProgressView(){
        int position = rewardArray.size() -1;
        rewardArray.remove(position);
        notifyItemRemoved(position);
        notifyItemRangeChanged(position, rewardArray.size());
    }

    public static class RewardListViewHolderHeader extends MainViewHolder {
        protected TextView tvHeader;

        public RewardListViewHolderHeader (View v) {
            super(v);
            tvHeader = (TextView) v.findViewById(R.id.header_text);
        }
    }

    public class RewardViewHolder extends MainViewHolder implements View.OnClickListener{
        public TextView tvRewardTitle;
        public TextView tvRewardDescription;
        public TextView tvRewardExpiry;
        public Button btnOrange,btnGrey;

        public RewardViewHolder(View v) {
            super(v);
            tvRewardTitle = (TextView) itemView.findViewById(R.id.tv_reward_title);
            tvRewardDescription = (TextView) itemView.findViewById(R.id.tv_reward_description);
            tvRewardExpiry = (TextView)  itemView.findViewById(R.id.tv_reward_expiry_date);
            btnOrange = (Button) itemView.findViewById(R.id.btn_item_reward_orange);
            btnGrey = (Button) itemView.findViewById(R.id.btn_item_reward_grey);

            btnOrange.setOnClickListener(this);
            btnGrey.setOnClickListener(this);
        }
        @Override
        public void onClick(View v) {
            //Toast.makeText(context, tvName.getText().toString(), Toast.LENGTH_SHORT).show();
            if (mItemClickListener != null) {
                mItemClickListener.onItemClick(v,getAdapterPosition());
            }
        }
    }

}

0 个答案:

没有答案