简体   繁体   中英

Progress Bars In CardViews not working in Recycler View

My RecyclerView adapts from a CardView with some textViews and a horizontal proggress bar. All textvIews are working as planned, but the progress bars are not moving as intended. BUt the last progressBar in the last Cardview works, but that isnt even working as planned. PLease help. The ProgressBar is implemented using the Async Task Class

ViewHolder Class

    public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        public TextView cat,tvTotalBudgetAmountPerCategory,tvCurrencyGoale,tvCurrencyAmountSpent,
                tvCurrencyPredicted,tvCurrencyRemainder, tvTotalAmountSpentPerCategory,tvRemainingAmountPerCategory ;
        public ImageView cat_pic;
        public ProgressBar budgetProgressBar;

        public MyViewHolder(View view) {
            super(view);
            //pic = (ImageView) view.findViewById(R.id.pic);
            cat = (TextView) view.findViewById(R.id.cat_title);

//Refercing ImageViews for circular shape
            cat_pic = (ImageView) view.findViewById(R.id.cat_pic);

            //Referencing Currency textViews
            tvCurrencyGoale = (TextView) view.findViewById(R.id.tvCurrencyGoale);
            tvCurrencyAmountSpent = (TextView) view.findViewById(R.id.tvCurrencyAmountSpent);
          //  tvCurrencyPredicted = (TextView) view.findViewById(R.id.tvCurrencyPredicted);
            tvCurrencyRemainder = (TextView) view.findViewById(R.id.tvCurrencyRemainder);


            //TextViews For Budget, Amount & Reaminder textviews
            tvTotalBudgetAmountPerCategory = (TextView) view.findViewById(R.id.tvTotalBudgetAmountPerCategory);
            tvTotalAmountSpentPerCategory = (TextView) view.findViewById(R.id.tvTotalAmountSpentPerCategory);
            tvRemainingAmountPerCategory = (TextView) view.findViewById(R.id.tvRemainingAmountPerCategory);

            //Referencing ProgressBar
            budgetProgressBar = (ProgressBar) view.findViewById(R.id.budgetProgressBar1);



            view.setOnClickListener(this);
        }

        @Override
        public void onClick(View view) {
            notifyItemClicked(getAdapterPosition());
        }
    }



    private void notifyItemClicked(int adapterPosition) {
        if (listener != null) {
            listener.onItemClicked(adapterPosition, catList.get(adapterPosition));

        }
    }


    public BudgetCardAdapter(List<CategoriesModel> catList, List<Double> budgetAmountList, List<Double> expenseAmountList) {
        this.catList = catList;
        this.budgetAmountList =budgetAmountList;
        this.expenseAmountList =expenseAmountList;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.budget_card_list, parent, false);
        currencyManager = new CurrencyManager(parent.getContext());


        return new MyViewHolder(itemView);
    }

OnBindViewHolder

    @Override
    public void onBindViewHolder(final MyViewHolder holder, int position) {

        CategoriesModel categoriesModel = catList.get(position);
        b_val =budgetAmountList.get(position);
        e_val =expenseAmountList.get(position);


        holder.cat.setText(categoriesModel.getCat_name());
        holder.cat_pic.setColorFilter(Color.RED);


        //chaning the colors of the catgrory colors
        ArrayList<Integer> colors = new ArrayList<Integer>();
        colors.add(Color.CYAN);
        colors.add(Color.BLUE);
        colors.add(Color.RED);
        colors.add(Color.YELLOW);
        colors.add(Color.GREEN);
        colors.add(Color.LTGRAY);
        colors.add(Color.BLACK);
        colors.add(Color.MAGENTA);
        colors.add(Color.TRANSPARENT);
        colors.add(Color.GRAY);
        colors.add(Color.CYAN);
        colors.add(Color.LTGRAY);
        colors.add(Color.DKGRAY);
        colors.add(Color.LTGRAY);

        holder.cat_pic.setColorFilter(colors.get(position));



        //Setting BUdget Values After Formatting it
        DecimalFormat formatter = new DecimalFormat("#,###.00");
        String formatted_budget_amount= formatter.format(b_val);
        holder.tvTotalBudgetAmountPerCategory.setText(formatted_budget_amount+"");

        //Setting Expense Values After Formatting it
        String formatted_expense_amount= formatter.format(e_val);
        holder.tvTotalAmountSpentPerCategory.setText(formatted_expense_amount+"");


        double remainder = b_val - e_val;
        String formatted_remainder_amount= formatter.format(remainder);
        holder.tvRemainingAmountPerCategory.setText(formatted_remainder_amount+"");


        //Getting Currnecy From CUrrency Table.
        String Currency = currencyManager.getCurrency();
        holder.tvCurrencyGoale.setText(Currency);
        holder.tvCurrencyAmountSpent.setText(Currency);
        holder.tvCurrencyRemainder.setText(Currency);

            //Setting Tag
        holder.budgetProgressBar.setTag(position);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
            new BudgetCardAdapter.myTask(b_val, e_val, holder.budgetProgressBar).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
        else
            new BudgetCardAdapter.myTask(b_val, e_val,holder.budgetProgressBar).execute();

    }


    @Override
    public int getItemCount() {

        return catList.size();
    }

    public interface OnItemClickedListener {
        void onItemClicked(int pos, CategoriesModel model);
    }

Async Task Class

    class myTask extends AsyncTask<Void, Integer, String> {
        private final ProgressBar budgetProgressBar;
        double b_val,e_val;
        int position;


        public myTask(double b_val ,double e_val,ProgressBar budgetProgressBar) {
            this.b_val = b_val;
            this.e_val = e_val;
            this.budgetProgressBar= budgetProgressBar;
            position = (int) budgetProgressBar.getTag();
        }

        int pStatus = (int) e_val;
        int maxBudget = (int) b_val;

        @Override
        protected void onPreExecute() {
            budgetProgressBar.setMax(maxBudget);
            budgetProgressBar.setVisibility(View.VISIBLE);
        }

          @Override
    protected String doInBackground(Void... params) {

        int incrementor =10;

        for (int i = incrementor; i<=pStatus; i+=incrementor){
            try {
                Thread.sleep(300);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
          publishProgress(i);
        }


       return "Complete";
    }


        @Override
        protected void onProgressUpdate(Integer... p) {

            super.onProgressUpdate(p);

            if ((int) budgetProgressBar.getTag() == position){
                budgetProgressBar.incrementProgressBy(p[0]);
                budgetProgressBar.setProgress(p[0]);

            }

        }


    }

}

You need to pass the holder.budgetProgressBar to the AsyncTask as parameter and use the same reference for setting the progress in onProgressUpdate(). From your code i can see that there is no connection to specific list item progressbar in AsynTask.

Add progressBar to viewHolder class and set a tag(position) before calling asynctask

holder.progressBar.setTag(position); 
new BudgetCardAdapter.myTask(b_val ,e_val ,holder.progressbar).execute();

Change constructor as below

int b_val,e_val,position;
ProgressBar progressBar;


myTask(int b_val ,int e_val,Progressbar progressBar){

    this.b_val = b_val;
    this.e_Val = e_val;
    this.progessBar = progressBar;
    position = (int)progressBar.getTag;

}

in onProgessupdate

 @Override
    protected void onProgressUpdate(Integer... p) {
        super.onProgressUpdate(p);

        if ((int)progressBar.getTag()==position) {
            progressBar.incrementProgressBy(p[0]);
            progressBar.setProgress(p[0]);
        }


    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM