Reputation: 751
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]);
}
}
}
}
Upvotes: 0
Views: 362
Reputation: 534
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]);
}
}
Upvotes: 1