android - notifydatasetchanged 不适用于适配器
问题描述
从这个适配器我正在显示一个付款对话框,但在付款提交后它没有得到更新。如何更新视图?
public class PersonDebtDetailsAdapter extends RecyclerView.Adapter<PersonDebtDetailsAdapter.ViewHolder>{
private Context mContext;
private final LayoutInflater mLayoutInflater;
private final List<Debt> mDebtList;
public PersonDebtDetailsAdapter(Context context, List<Debt> debtList) {
mContext = context;
mLayoutInflater = LayoutInflater.from(context);
mDebtList = debtList;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View itemView = mLayoutInflater.inflate(R.layout.item_person_debt, parent, false);
return new ViewHolder(itemView);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
final int debtType = mDebtList.get(position).getDebtType();
if (debtType == Debt.DEBT_TYPE_IOWE){
holder.mDebtType.setText("OWE BY ME");
}else {
holder.mDebtType.setText("OWE TO ME");
}
holder.mDebtNote.setText(mDebtList.get(position).getNote());
holder.mDebtAmount.setText(String.valueOf(mDebtList.get(position).getAmount()));
long dueDate = mDebtList.get(position).getDueDate();
if (Calendar.getInstance().getTimeInMillis() > dueDate) {
holder.mDebtDueDate.setTextColor(Color.RED);
}
holder.mDebtDueDate.setText("Due Date : " + getDate(dueDate));
holder.amountToTrans = mDebtList.get(position).getAmount();
holder.debtId = mDebtList.get(position).getId();
holder.phoneNo = mDebtList.get(position).getPersonPhoneNumber();
}
private String getDate(long date) {
SimpleDateFormat df = new SimpleDateFormat("EEEE,dd MMM,yyyy");
String formattedDate = df.format(date);
return formattedDate;
}
@Override
public int getItemCount() {
return mDebtList.size();
}
public class ViewHolder extends RecyclerView.ViewHolder{
public final TextView mDebtAmount, mDebtNote, mDebtDueDate, mDebtType, mDebtPay;
private long mDateLong;
String debtId, phoneNo;
double amountToTrans;
private Button mDate;
private Calendar myCalendar;
private TextView mAmount;
private TextInputLayout mAmountLayout;
public ViewHolder(View itemView) {
super(itemView);
mDebtAmount = (TextView) itemView.findViewById(R.id.tv_debt_amount);
mDebtDueDate = (TextView) itemView.findViewById(R.id.tv_debt_due_date);
mDebtNote = (TextView) itemView.findViewById(R.id.tv_debt_note);
mDebtType = (TextView) itemView.findViewById(R.id.tv_debt_type);
mDebtPay = (TextView) itemView.findViewById(R.id.tv_payment);
mDebtPay.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ViewDialog dialog = new ViewDialog(mContext);
dialog.showDialogForPayment(amountToTrans, phoneNo, debtId);
}
});
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
}
}
}
视图中的 onClick 使对话框膨胀,对话框页面代码如下:
public void showDialogForPayment(final double amount, final String phoneNo, final String debtId){
final Dialog dialog = new Dialog(mContext);
dialog.setContentView(R.layout.content_payment);
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
dialog.show();
mDateHelper = new DateHelper();
myCalender = Calendar.getInstance();
mAmountLayout = (TextInputLayout) dialog.findViewById(R.id.til_amount_payment);
mAmountEditText = (EditText) dialog.findViewById(R.id.et_amount_payment);
mAmountEditText.setText(String.valueOf(amount));
mNoteEditText = (EditText) dialog.findViewById(R.id.et_comment_payment);
mDateButton = (Button) dialog.findViewById(R.id.btn_date_created_payment);
mDateButton.setText("CREATED ON : " + getCurrentDate());
mCloseDialog = (ImageView) dialog.findViewById(R.id.iv_close_dialog_payment);
mCloseDialog.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});
TextView proceed = (TextView) dialog.findViewById(R.id.tv_proceed);
proceed.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
double amountDouble = Double.parseDouble(mAmountEditText.getText().toString().trim());
String noteString = mNoteEditText.getText().toString().trim();
if (validateAmount(amountDouble, amount)) {
Payment payment = new Payment.Builder().amount(amountDouble)
.dateEntered(mDateLong).note(noteString).id(UUID.randomUUID().toString())
.personPhoneNumber(phoneNo).debtId(debtId).build();
DataManager dm = new DataManager(mContext);
dm.savePayment(payment);
Snackbar.make(v, "Payment Successful", Snackbar.LENGTH_SHORT).show();
dialog.dismiss();
}
}
});
final DatePickerDialog.OnDateSetListener dateSetListener = new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
myCalender.set(Calendar.DATE, dayOfMonth);
myCalender.set(Calendar.MONTH, month);
myCalender.set(Calendar.YEAR, year);
mDateLong = myCalender.getTimeInMillis();
updateLabelDateLong();
}
};
mDateButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
new DatePickerDialog(mContext, dateSetListener, myCalender
.get(Calendar.YEAR), myCalender.get(Calendar.MONTH),
myCalender.get(Calendar.DAY_OF_MONTH)).show();
}
});
}
请建议我在代码中需要更正。并且还发生了一个问题,即 BottomSheet 将其大小减小到活动工具栏。
解决方案
Add notifyDataSetChanged().
mDebtPay.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ViewDialog dialog = new ViewDialog(mContext);
dialog.showDialogForPayment(amountToTrans, phoneNo, debtId);
notifyDataSetChanged();
}
});
推荐阅读
- typescript - 为什么 TypeScript 允许一个方法返回一个对象字面量,而不能将相同的值分配给其他地方的返回类型?
- azure-table-storage - Mule 4 中的 Azure 表存储
- python - 创建两个不同序列的单个“排序”生成器的 Pythonic 方法
- firebase - 如何查询此 Firebase 结构?
- mysql - 如果我在安装过程中更改了 MySQL 的默认端口号(3306),会不会有什么问题?
- terraform - “count”和“for_each”元参数是互斥的,只有一个应该用来明确要创建的资源数量
- android - 如何将 IIS Express 开发证书导入 Android App?
- java - 关于 Java 中的多态性的 Private vs final
- python - 查找 0 夹在非零值之间的索引
- javascript - 内容固定时背景滚动