CardViews中的进度条在Recycler View中不起作用

时间:2017-04-18 00:17:35

标签: java android

我的RecyclerView适用于CardView,带有一些textView和一个水平proggress栏。所有textvIews都按计划工作,但进度条没有按预期移动。在最后的Cardview工作中保留最后一个progressBar,但这甚至没有按计划工作。请帮忙。 ProgressBar使用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);
    }

异步任务类

    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]);

            }

        }


    }

}

1 个答案:

答案 0 :(得分:1)

您需要将holder.budgetProgressBar传递给AsyncTask as参数,并使用相同的引用来设置onProgressUpdate()的进度。从您的代码中我可以看到AsynTask中没有与特定列表项进度条的连接。

将progressBar添加到viewHolder类并在调用asynctask之前设置标记(位置)

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

更改构造函数如下

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;

}

在onProgessupdate

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

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


    }