首页 > 解决方案 > 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 将其大小减小到活动工具栏。

标签: androidandroid-recyclerviewbottom-sheet

解决方案


Add notifyDataSetChanged().

  mDebtPay.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        ViewDialog dialog = new ViewDialog(mContext);
                        dialog.showDialogForPayment(amountToTrans, phoneNo, debtId);
                        notifyDataSetChanged();
                    }
                });

推荐阅读