2017-04-18 5 views
0

RecyclerViewは、いくつかのtextViewsと水平proggress barを持つCardViewから適応します。すべてのテキストニュースは計画どおりに機能していますが、プログレスバーは意図したとおりに動いていません。最後のprogressBarを最後のCardviewの作品で使用しますが、それは計画通りに動作しません。助けてください。プログレスバーは、あなたがにholder.budgetProgressBarを渡す必要がCardViewの進捗バーがRecycler Viewで機能しない

@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); 
    } 

非同期タスクOnBindViewHolder非同期タスククラスを使用してクラス

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

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

を実施していますAsyncTaskをパラメータとして使用し、同じ参照を使用して進捗状況を設定するonProgressUpdate()。あなたのコードから、AsynTaskの特定のリストアイテムのプログレスバーへの接続がないことがわかります。

viewHolderクラスにプログレスバーを追加し、親切にいくつかのコードを支援onProgessupdate

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

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


    } 
+0

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; } 

以下のようasynctask

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

変更コンストラクタを呼び出す前に、タグ(位置)を設定。ありがとうございました –

+0

pls check updated答え –

+0

iveがコードを更新しました。私はすべての変更を加え、getTag asnd setTagを追加しました。また、ViewHolderクラスも追加しました。それでもまだ動作していません。 –

関連する問題