Добавление элемента в окно повторного просмотра из диалога внутри класса фрагмента. - PullRequest
0 голосов
/ 21 декабря 2018

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

My Screen with two recyclerviews

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

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

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

Мой адаптер для первого обзора переработчика

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

}
}

Класс «Мой адаптер» для Second 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);
}
}

1 Ответ

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

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

Таким образом, можно создать метод внутри фрагмента, который принимает список 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);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...