Добавление элемента в recyclerview из диалога внутри класса фрагмента.?

У меня есть фрагмент, который должен содержать два вида ресайклера. Вид выглядит следующим образом. мне нужно добавить элемент в нижний recyclerview из диалогового окна. Я опубликую свой код для класса адаптера и xml. Пожалуйста, помогите мне добиться этого, образец или код более чем приветствуются.

Добавление элемента в recyclerview из диалога внутри класса фрагмента.?

Я попытался передать данные из диалогового окна второму recyclerview, но он не показывает добавленный элемент. Скажи мне что-нибудь, что я здесь делаю не так. Ничего из того, что я пробовал, не помогло обновить мой второй повторный просмотр ...: /

Мой класс фрагмента

public class ReceiptFragment extends Fragment { //implements ContReceiptsAdapter.ItemOnClickListener

RecyclerView rv_rceipts, rv_addpayments;
RecyclerView.Adapter mContReceiptsAdapter,mAddPaymentsAdapter;
RecyclerView.LayoutManager mLayoutManager1,mLayoutManager2;
View receipts_view;
private Context mContext;
ContReceiptsAdapter contReceiptsAdapter;
AddPaymentsAdapter addPaymentsAdapter;
//-- items in detailed dialog here
private ArrayList<Contract> contracts;
private ArrayList<AddPayments> payments;
private View linearLayout;
public View mRootView;

public ReceiptFragment() {
}

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

    receipts_view = inflater.inflate(R.layout.fragment_receipt, container, false);

    BuildReceiptsRV();
    BuildAddedPaymentsRV();
    // for setting the first item as default in the list
 //        onItemClicked(0);
    return receipts_view;

}

private void BuildReceiptsRV() {
    rv_rceipts = receipts_view.findViewById(R.id.rv_tobe_added);
    rv_rceipts.setHasFixedSize(true);
    rv_rceipts.setItemAnimator(new DefaultItemAnimator());

    mLayoutManager1 = new LinearLayoutManager(getActivity());
    rv_rceipts.setLayoutManager(mLayoutManager1);

    mContReceiptsAdapter = new ContReceiptsAdapter(getActivity(), ApplicationClass.contractList);
    rv_rceipts.setAdapter(mContReceiptsAdapter);
}

private void BuildAddedPaymentsRV() {
    rv_addpayments = receipts_view.findViewById(R.id.rv_added);
    rv_addpayments.setHasFixedSize(true);
    rv_addpayments.setItemAnimator(new DefaultItemAnimator());

    mLayoutManager2 = new LinearLayoutManager(getActivity());
    rv_addpayments.setLayoutManager(mLayoutManager2);

    mAddPaymentsAdapter = new AddPaymentsAdapter(getActivity(),ApplicationClass.paymentList);
    rv_addpayments.setAdapter(mAddPaymentsAdapter);
}

//change when click on change on item added to second rv
private void changeLayoutRV() {
    linearLayout = mRootView.findViewById(R.id.rv_tobe_added);

    if (linearLayout.getVisibility() == View.GONE) {
        linearLayout.setVisibility(View.VISIBLE);
    } else {
        linearLayout.setVisibility(View.GONE);
    }
}
}

Мой адаптер для первого Recyclerview

public class ContReceiptsAdapter extends RecyclerView.Adapter<ContReceiptsAdapter.ReceiptsViewHolder> {

//    private static Dialog AddItemDialog;
private ArrayList<Contract> contracts;
private ArrayList<AddPayments> payments = new ArrayList<>();
Context mContext;
String inPending;
//for the details dialog
EditText et_number, contract_id_val, product_type_val, mobile_number_ADialog, et_amount_add;
//    ImageView btn_add_item;
//--to set to add item dialog
public TextView contract_number, vehicle_number, contract_number_ADialog, vehicle_number_ADialog;
CheckBox checkbox_pending;

public ContReceiptsAdapter(Context context, ArrayList<Contract> contractList) {
    contracts = contractList;
    mContext = context;
}

public class ReceiptsViewHolder extends RecyclerView.ViewHolder {

    TextView tv_contract, tvVehicleN, tvContractType;
    ImageView btn_add_item;
    LinearLayout detailsLayout;

    public ReceiptsViewHolder(@NonNull final View itemView) {
        super(itemView);

        detailsLayout = itemView.findViewById(R.id.add_details_item_id);
        tv_contract = itemView.findViewById(R.id.tv_contract);
        tvVehicleN = itemView.findViewById(R.id.tvVehicleN);
        tvContractType = itemView.findViewById(R.id.tvContractType);
        btn_add_item = itemView.findViewById(R.id.btn_add_item);
    }
}

@NonNull
@Override
public ContReceiptsAdapter.ReceiptsViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {

    View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.receipt_tobe_added_rv_item, viewGroup, false);

    final ReceiptsViewHolder receiptsViewHolder = new ReceiptsViewHolder(view);

    //dialog ini
 //        ShowDetails();
    final Dialog detailedDialog = new Dialog(this.mContext);
    detailedDialog.setContentView(R.layout.fragment_details);

    receiptsViewHolder.detailsLayout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //click view dto show the detaileds view of the list item
            contract_number = detailedDialog.findViewById(R.id.contract_id_val);
            vehicle_number = detailedDialog.findViewById(R.id.vehicle_num_val);
            contract_number.setText(contracts.get(receiptsViewHolder.getAdapterPosition()).getContractNumber());
            vehicle_number.setText(contracts.get(receiptsViewHolder.getAdapterPosition()).getVehicleNumber());
            detailedDialog.show();
            detailedDialog.setCancelable(true);
//                    mListener.onItemClicked(contracts.indexOf(v.getTag()));
        }
    });

    return receiptsViewHolder;
}

@Override
public void onBindViewHolder(@NonNull final ContReceiptsAdapter.ReceiptsViewHolder viewHolder, int i) {

    viewHolder.itemView.setTag(contracts.get(i));
//        Contract currentItem = contracts.get(i);

    viewHolder.tv_contract.setText(contracts.get(i).getContractNumber());
    viewHolder.tvVehicleN.setText(contracts.get(i).getVehicleNumber());
    viewHolder.tvContractType.setText(contracts.get(i).getContractType());

    final Dialog AddItemDialog = new Dialog(mContext);
    AddItemDialog.setContentView(R.layout.fragment_add_receipt);

    viewHolder.btn_add_item.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
 //                ShowDetails();7
            contract_number_ADialog = AddItemDialog.findViewById(R.id.contract_id_val_add);
            contract_number_ADialog.setText(contracts.get(viewHolder.getAdapterPosition()).getContractNumber());
            vehicle_number_ADialog = AddItemDialog.findViewById(R.id.product_type_val_add);
            vehicle_number_ADialog.setText(contracts.get(viewHolder.getAdapterPosition()).getVehicleNumber());
            mobile_number_ADialog = AddItemDialog.findViewById(R.id.et_number_add);
            mobile_number_ADialog.setText(contracts.get(viewHolder.getAdapterPosition()).getMobileNumber());
            checkbox_pending = AddItemDialog.findViewById(R.id.checkbox_pending_add);
            checkbox_pending.setChecked(Boolean.parseBoolean(contracts.get(viewHolder.getAdapterPosition()).getPendingState()));
            Button btn_cancel_receipt = AddItemDialog.findViewById(R.id.btn_cancel_receipt);
            Button btn_add_receipt = AddItemDialog.findViewById(R.id.btn_add_receipt);

            et_amount_add = AddItemDialog.findViewById(R.id.et_amount_add);

            AddItemDialog.show();
            AddItemDialog.setCancelable(true);

            btn_cancel_receipt.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    AddItemDialog.dismiss();
                }
            });
            btn_add_receipt.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    AddData();

                    //add item to rv2
                    AddItemDialog.dismiss();

                }
            });

        }
    });
}

@Override
public int getItemCount() {
    return contracts.size();
}

private void addAnItem(AddPayments payment) {
    payments = ApplicationClass.paymentList;
    payments.add(payment);
    this.notifyDataSetChanged();
}

private void AddData() {

    String c_code = contract_number_ADialog.getText().toString();
    String c_mobile = mobile_number_ADialog.getText().toString();
    String c_amount = et_amount_add.getText().toString();

    AddPayments added_payment = new AddPayments(c_amount, c_code, c_mobile, "true");

    payments.add(added_payment);
    notifyDataSetChanged();

}
}

Мой класс адаптера для второго Recyclerview

public class AddPaymentsAdapter extends RecyclerView.Adapter<AddPaymentsAdapter.AddPayViewHolder> {

private ArrayList<AddPayments> payments;
Context mContext;

public AddPaymentsAdapter(Context context, ArrayList<AddPayments> addPayments) {
    mContext = context ;
    payments = addPayments;
}

public class AddPayViewHolder extends RecyclerView.ViewHolder{

    TextView tv_contract_d, tv_amount_d, tv_isPending_d, tv_mobile_num_d;
    ImageView btn_delete_item;
    ConstraintLayout addedPaymentLayout;

    public AddPayViewHolder(@NonNull View itemView) {
        super(itemView);

        addedPaymentLayout = itemView.findViewById(R.id.added_payment_item_id);
        tv_contract_d = itemView.findViewById(R.id.tv_contract_d);
        tv_amount_d = itemView.findViewById(R.id.tv_amount_d);
        tv_isPending_d = itemView.findViewById(R.id.tv_isPending_d);
        tv_mobile_num_d = itemView.findViewById(R.id.tv_mobile_num_d);
        btn_delete_item = itemView.findViewById(R.id.btn_delete_item);
    }
}

@NonNull
@Override
public AddPaymentsAdapter.AddPayViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {

    View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.receipt_added_rv_item, viewGroup, false);

    final AddPayViewHolder addPayViewHolder= new AddPayViewHolder(view);

    return addPayViewHolder;
}

@Override
public void onBindViewHolder(@NonNull AddPaymentsAdapter.AddPayViewHolder addPayViewHolder, final int i) {

    AddPayments currentItem = payments.get(i);

    addPayViewHolder.itemView.setTag(payments.get(i));

    addPayViewHolder.tv_contract_d.setText(payments.get(i).getAddContractCode());
    addPayViewHolder.tv_isPending_d.setText(payments.get(i).getAddIsPending());
    addPayViewHolder.tv_amount_d.setText(payments.get(i).getAddAmount());
    addPayViewHolder.tv_mobile_num_d.setText(payments.get(i).getAddMobile());

    addPayViewHolder.btn_delete_item.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //delete function
 //                Toast.makeText(mContext, "clicked delete icon inHoldernAdapter", Toast.LENGTH_SHORT).show();
            removeItem(i);
        }
    });
}

@Override
public int getItemCount() {
    return payments.size();
}

private void removeItem(int i) {
    payments.remove(i);
    this.notifyItemRemoved(i);
}
}

Вы уведомляете адаптеры после добавления элементов ко второму адаптеру?

Farhana Naaz Ansari 21.12.2018 11:37

я сделал "this.notifyDataSetChanged ();" .. это способ сделать это?

Pixxu Waku 21.12.2018 11:41
1
2
617
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
  • Из вашего кода в адаптере для первого представления ресайклера вы используете этот метод AddData(); для добавления данных. Но этот метод добавляет данные в payments, который представляет собой список, в котором вы храните данные, которые вы хотите отобразить во втором представлении ресайклера, но не связаны с ним (это просто поле класса адаптера).

  • this.notifyDataSetChanged() уведомляет текущий адаптер об изменении данных (первое представление ресайклера). Вам нужно будет добавить эти данные во второй адаптер представления ресайклера thou. Вы не делаете этого прямо сейчас.

Таким образом, можно создать метод внутри фрагмента, который принимает список AddPayments в качестве аргумента и добавляет эти данные во второй адаптер представления ресайклера. Это было бы примерно так:

Метод фрагмента:

public void addSecondRVData(AddPayments itemToAdd) {
    mAddPaymentsAdapter.addNewPayment(itemToAdd);
}

Второй способ просмотра ресайклера:

public void addData(AddPayments itemToAdd) {
    payments.add(itemToAdd);
    this.notifyDataSetChanged():
}

Не забудьте инициализировать список payment во втором представлении ресайклера.

Затем в первом адаптере сделайте что-нибудь так:

private ReceiptFragment receiptFragment;

//Constructor
public ContReceiptsAdapter(Context context, ArrayList<Contract> contractList, ReceiptFragment receiptFragment) {
   contracts = contractList;
   mContext = context;
   this.receiptFragment = receiptFragment;
}

//Use this to add elements to second rv
receiptFragment.addSecondRVData(newItem);

Надеюсь, это поможет, хотя это не самое чистое решение. Посмотрите пример, который я написал здесь, потому что пока не могу его протестировать.

спасибо ебаша. Я пробовал, но немного запутался в месте "добавить платеж" ..?

Pixxu Waku 21.12.2018 12:41

Моя ошибка. Метод во втором адаптере rv должен называться «addNewPayment», а не «addData».

ebasha 21.12.2018 12:43

эта часть «mAddPayments Adapter.ad NewPayment (itemToAdd);» --- addNewPayment не идентифицирован в моем классе фрагмента

Pixxu Waku 21.12.2018 13:12

Где я должен вызвать этот метод addSecondRVData именно из ..?

Pixxu Waku 21.12.2018 13:22

появляется ошибка. Попытка вызвать виртуальный метод void com.comcredit.ccui.tobeadded.AddPaymentsAdapter.addNewPaymen‌ t (com.comcredit.ccui‌ .tobeadded.AddPaymen‌ ts) для ссылки на нулевой объект на com.comcredit.ccui .tobeadded.ReceiptFragment.addSecondRVData‌ (ReceiptFragment.jav‌ a: 90) на com.comcredit.ccui.tobeadded.ContReceiptsAdapter $ 2 $ 2.onClick‌ (ContReceiptsAdapter‌ .java: 169)

Pixxu Waku 21.12.2018 13:29

Вы должны инициализировать первый адаптер из фрагмента следующим образом: mContReceiptsAdapter = new ContReceiptsAdapter(getActivity(), ApplicationClass.contractList, this);

ebasha 21.12.2018 13:37

Я инициализировал оба адаптера внутри своего класса фрагмента. но данные не передаются ..: /

Pixxu Waku 21.12.2018 14:04

как-то в конце концов мне это удалось. но ваше руководство действительно помогло. благодаря.

Pixxu Waku 22.12.2018 02:38

Рад, что помог: D

ebasha 22.12.2018 11:21

Другие вопросы по теме