【问题标题】:Not able to add new address field in RecyclerView When "Add More Address" button is clicked?单击“添加更多地址”按钮时,无法在 RecyclerView 中添加新地址字段?
【发布时间】:2020-03-31 16:55:28
【问题描述】:

我正在尝试创建一个表单,该表单具有用于地址的 recyclerView,并且在 RecyclerView 上方有一个按钮,onClick 能够在此 RecyclerView 内添加更多地址字段,但当按钮单击应用程序崩溃时无法执行此操作. 这是我得到的日志输出

进程:com.fitness.client,PID:101621

java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“boolean androidx.recyclerview.widget.RecyclerView$ViewHolder.shouldIgnore()” 在 androidx.recyclerview.widget.RecyclerView$LayoutManager.removeAndRecycleAllViews(RecyclerView.java:10079) 在 androidx.recyclerview.widget.RecyclerView.removeAndRecycleViews(RecyclerView.java:1174) 在 androidx.recyclerview.widget.RecyclerView.setAdapterInternal(RecyclerView.java:1197) 在 androidx.recyclerview.widget.RecyclerView.setAdapter(RecyclerView.java:1156) 在 com.fitness.client.ui.main.fragments.listing.ListingFragment$1.onClick(ListingFragment.java:144) 在 android.view.View.performClick(View.java:6608) 在 android.view.View.performClickInternal(View.java:6585) 在 android.view.View.access$3100(View.java:785) 在 android.view.View$PerformClick.run(View.java:25921) 在 android.os.Handler.handleCallback(Handler.java:873) 在 android.os.Handler.dispatchMessage(Handler.java:99) 在 android.os.Looper.loop(Looper.java:201)

这是我的片段的代码

顺便说一句,按钮名称是“地址”

package com.fitness.client.ui.main.fragments.listing;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.text.InputType;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.LinearLayout;

import androidx.annotation.NonNull;

import com.fitness.client.BR;
import com.fitness.client.R;
import com.fitness.client.api.RetroFitFactory;
import com.fitness.client.api.product.ProductDetailResponse;
import com.fitness.client.api.user.UserProfileResponse;
import com.fitness.client.api.user.UserService;
import com.fitness.client.base.classes.BaseFragment;
import com.fitness.client.base.classes.BaseRecyclerViewAdapter;
import com.fitness.client.base.classes.BaseViewHolder;
import com.fitness.client.databinding.ItemOfferingBinding;
import com.fitness.client.databinding.ItemProductListingBinding;
import com.fitness.client.objects.Product;
import com.fitness.client.ui.main.fragments.listing.adapter.AddressAdapter;
import com.fitness.client.ui.main.fragments.listing.adapter.DescriptionAdapter;
import com.fitness.client.ui.main.fragments.listing.adapter.EmailAdapter;
import com.fitness.client.ui.main.fragments.listing.adapter.FacilitesAdapter;
import com.fitness.client.ui.main.fragments.listing.adapter.PhoneAdapter;
import com.fitness.client.ui.main.fragments.listing.adapter.TagAdapter;
import com.fitness.client.ui.main.fragments.listing.adapter.TermsAdapter;
import com.fitness.client.ui.main.fragments.listing.adapter.TimingAdapter;
import com.fitness.client.ui.offering.OfferingActivity;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Objects;

public class ListingFragment extends BaseFragment<ItemProductListingBinding, ListingViewModel, ListingNavigator> implements ListingNavigator {

    public String TAG = "ListingFragment";
    private AddressAdapter addressAdapter;
    private EmailAdapter emailAdapter;
    private FacilitesAdapter facilitesAdapter;
    private PhoneAdapter phoneAdapter;
    private DescriptionAdapter descriptionAdapter;
    private TermsAdapter termsAdapter;
    private TagAdapter tagAdapter;
    private TimingAdapter timingAdapter;

    private OfferingAdapter offeringAdapter;
    private LinearLayout addressLayout;
    private LinearLayout.LayoutParams layoutParams;

    private int ids = 0;
    private int hint = 0;

    public static ListingFragment getInstance(Context context) {
        return (ListingFragment) ListingFragment.instantiate(context, ListingFragment.class.getName());
    }


    @Override
    public int getBindingVariable() {
        return BR.listing_view_model;

    }

    @Override
    public int getLayoutId() {
        return R.layout.item_product_listing;
    }

    @Override
    public void init(View view, Bundle savedInstances) {
        addressAdapter = new AddressAdapter(new ArrayList<>());
        emailAdapter = new EmailAdapter(new ArrayList<>());
        facilitesAdapter = new FacilitesAdapter(new ArrayList<>());
        phoneAdapter = new PhoneAdapter(new ArrayList<>());
        descriptionAdapter = new DescriptionAdapter(new ArrayList<>());
        termsAdapter = new TermsAdapter(new ArrayList<>());
        tagAdapter = new TagAdapter(new ArrayList<>());
        timingAdapter = new TimingAdapter(new ArrayList<>());

        offeringAdapter = new OfferingAdapter(new ArrayList<>());


        getViewDataBinding().addressList.setAdapter(addressAdapter);
        getViewDataBinding().emailList.setAdapter(emailAdapter);
        getViewDataBinding().facilitiesList.setAdapter(facilitesAdapter);
        getViewDataBinding().phoneList.setAdapter(phoneAdapter);
        getViewDataBinding().descriptionList.setAdapter(descriptionAdapter);
        getViewDataBinding().termsAndConditionsList.setAdapter(termsAdapter);
        getViewDataBinding().tagList.setAdapter(tagAdapter);
        getViewDataBinding().timingList.setAdapter(timingAdapter);
        getViewDataBinding().offeringList.setAdapter(offeringAdapter);


        getViewModel().requestData();

//        LayoutInflater inflater = (LayoutInflater)
//                Objects.requireNonNull(getContext()).getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        LayoutInflater inflater = LayoutInflater.from(getContext());
       View view1 = inflater != null ? inflater.inflate(R.layout.item_edit_box, null) : null;


//        addressLayout =getViewDataBinding().layoutmain;
        if (view != null) {
            addressLayout = view1 != null ? view1.findViewById(R.id.createLayout) : null;
        }
        Log.e("Listing Fragment", String.format("Recyler View LAYOUT %s", addressLayout));
//        addressLayout = view.findViewById(R.id.createLayout);
        layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
        layoutParams.setMargins(5, 5, 5, 5);
        final int[] i = {0};
        getViewDataBinding().address.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                i[0] = i[0] + 1;
//                TextView more = new TextView(getContext());
//                more.setText(String.format("Address %s", i[0]));
//                more.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_START);
//                more.setVisibility(View.VISIBLE);
                ids++;
                hint++;
                EditText newEdit = new EditText(getContext());
                newEdit.setHint(String.format("Address %s", hint));
                newEdit.setId(ids);
                newEdit.setMinLines(4);

                Log.e("New Edittext: ", String.valueOf(ids));
                newEdit.setInputType(InputType.TYPE_CLASS_TEXT);
//                addressLayout.addView(more);
                addressLayout.addView(newEdit,layoutParams);
                getViewDataBinding().addressList.addView(addressLayout);
                AddressAdapter addressAdapter1 = new AddressAdapter(new ArrayList<>());
//                getViewDataBinding().addressList.addView(addressLayout);
                getViewDataBinding().addressList.setAdapter(addressAdapter1);
                addressAdapter1.notifyDataSetChanged();
//                 getViewDataBinding().moreAddress.setAdapter(addressAdapter);
//               addressAdapter.notifyDataSetChanged();


//                ListingFragment fragment = (ListingFragment) getFragmentManager().findFragmentByTag(TAG);
//                if (fragment != null) {
//                    fragment.addressAdapter.getAdapter().newAddeddata();
//                }

                //                getViewDataBinding().
//                getViewDataBinding().moreAddress.setAdapter(addressAdapter);
//                addressAdapter.notifyDataSetChanged();
//                RecyclerView recyclerView = new RecyclerView(getContext());
//               recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
//               recyclerView.setHasFixedSize(true);
//               recyclerView.setAdapter(addressAdapter);

            }
        });


    }

    @Override
    public void updateProductList(List<Product> products) {

        if (products != null && products.size() > 0) {
            for (Product product : products) {
                getViewModel().requestProductDetails(product.getId());
            }

        } else {
            showToast("No products found");
        }

    }

    @Override
    public void setUpProductDetails(ProductDetailResponse data) {

        offeringAdapter.addData(data.getData().getOffer_package());


    }

    @Override
    public void setProfileInformation(UserProfileResponse body) {
        getViewDataBinding().name.setText(body.getData().getName());
        timingAdapter.addData(body.getData().getTiming_info());
        termsAdapter.addData(Collections.singletonList(body.getData().getMerchant_info().getTermscondition()));

        Log.e("Listing Fragment", "Terms: " + Collections.singletonList(body.getData().getMerchant_info().getTermscondition()));

        tagAdapter.addData(Collections.singletonList(body.getData().getMerchant_info().getBusiness_tags()));
        descriptionAdapter.addData(Collections.singletonList(body.getData().getMerchant_info().getDescription()));
        addressAdapter.addData(body.getData().getAddress());
        if (body.getData().getFacilities_info().getFacilities() != null)
            facilitesAdapter.addData(Arrays.asList(body.getData().getFacilities_info().getFacilities().split(",")));
        List<String> emailList = Arrays.asList(body.getData().getContact_info().getAlter_email_1(),
                body.getData().getContact_info().getAlter_email_2(),
                body.getData().getContact_info().getAlter_email_3(),
                body.getData().getContact_info().getAlter_email_4());
//        emailAdapter.addData(emailList);
        emailAdapter.addData(emailList);
        Log.e("Listing Fragment", "Email: " + emailList);


//        phoneAdapter.addData(body.getData().getContact_info());

        List<String> phoneList = Arrays.asList(body.getData().getContact_info().getAlter_mobile_1(),
                body.getData().getContact_info().getAlter_mobile_2(),
                body.getData().getContact_info().getAlter_mobile_3(),
                body.getData().getContact_info().getAlter_mobile_4());
        Log.e("Listing Fragment", "Phone Number: " + phoneList);
        phoneAdapter.addData(phoneList);
//        phoneAdapter.addData(Arrays.asList(body.getData().getContact_info().getAlter_mobile_1(),
//                );


        getViewDataBinding().update.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                showLoading("Loading", "Please wait while update your profile");

                RetroFitFactory.getRetrofitCallFor(UserService.class)
                        .updateUserProfile();

            }
        });
    }


    class OfferingAdapter extends BaseRecyclerViewAdapter<OfferingAdapter.OfferingHolder, ProductDetailResponse.Offer_packageEntity> {

        public OfferingAdapter(List<ProductDetailResponse.Offer_packageEntity> data) {
            super(data);
        }

        @NonNull
        @Override
        public OfferingHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            return new OfferingHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_offering, parent, false));
        }

        class OfferingHolder extends BaseViewHolder<ProductDetailResponse.Offer_packageEntity, ItemOfferingBinding> {


            public OfferingHolder(View itemView) {
                super(itemView);

            }

            @Override
            protected void bindObject(ProductDetailResponse.Offer_packageEntity object) {
                getViewDataBinding().setOffering(object);

                getViewDataBinding().viewSch.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Intent intent = new Intent(getContext(), OfferingActivity.class);
                        intent.putParcelableArrayListExtra("data", object.getDays_timing());
                        startActivity(intent);
                    }
                });
              /*   adapter.clear();
                ProductDetailResponse.Days_timingEntity placeHolder = new ProductDetailResponse.Days_timingEntity();
                placeHolder.setDay("Day");
                placeHolder.setWeek("Week");
                adapter.addData(Collections.singletonList(placeHolder));
                adapter.addData(object.getDays_timing());*/


            }
        }
    }


}

【问题讨论】:

    标签: android android-recyclerview


    【解决方案1】:

    在您的适配器中创建函数,命名为 addItem 和 removeItem

    观看此视频以获得更详细的说明 :https://www.youtube.com/watch?v=enTvZm9LOGc&t=247s

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-06
      • 2022-11-18
      • 1970-01-01
      • 2015-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多