gpt4 book ai didi

java - CardView 中的进度条在 Recyclerview 中不起作用

转载 作者:行者123 更新时间:2023-12-02 13:23:54 24 4
gpt4 key购买 nike

我的 RecyclerView 改编自带有一些 TextView 和水平进度条的 CardView。所有 TextView 都按计划运行,但进度条未按预期移动。但是最后一个 Cardview 中的最后一个进度条可以工作,但这甚至没有按计划工作。请帮忙。 ProgressBar是使用异步任务类实现的

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

}

}


}

}

最佳答案

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

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

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


}

关于java - CardView 中的进度条在 Recyclerview 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43461599/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com