2017-04-18 53 views
0

我的RecyclerView使用一些文本視圖和一個水平編目欄從CardView進行調整。所有textvIews都按計劃運行,但進度條並未按預期移動。 BU最後一個Cardview中的最後一個progressBar工作正常,但那還沒有按計劃進行。請幫忙。該進度條使用異步任務類實現CardViews中的進度條無法在Recycler視圖中使用

ViewHolder類

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

您需要將holder.budgetProgressBar傳遞到AsyncTask作爲參數,並使用相同的參考來設置進度onProgressUpdate()。從你的代碼中,我可以看到沒有連接到AsynTask中的特定列表項進度條。

添加進度條到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]); 
     } 


    } 
+0

請一些代碼幫助之前設置一個標籤(位置) 。謝謝 –

+0

請檢查更新的答案 –

+0

ive更新了代碼,我做了所有更改並添加了getTag asnd setTag。我也添加了ViewHolder類。它仍然無法正常工作。 –