0

When you click on the CardView, a DialogFragment should appear, but the application crashes, writes the following in the logs

 Process: com.example.testfuntura, PID: 15385
    java.lang.ClassCastException: android.view.ContextThemeWrapper cannot be cast to androidx.appcompat.app.AppCompatActivity
        at com.example.testfuntura.Attraction.AdapterAttractionsPackageOffer.lambda$onBindViewHolder$0(AdapterAttractionsPackageOffer.java:56)
        at com.example.testfuntura.Attraction.-$$Lambda$AdapterAttractionsPackageOffer$4cZEQxk2beWA40yZmNkr6ZJp7o8.onClick(lambda)
        at android.view.View.performClick(View.java:5692)
        at android.view.View$PerformClick.run(View.java:22596)

My Adapter

public class AdapterAttractionsPackageOffer extends RecyclerView.Adapter<AdapterAttractionsPackageOffer.AttractionsViewHolderPackageOffer> {
    public ArrayList<ItemPOA> mFavList;

    public AdapterAttractionsPackageOffer(ArrayList<ItemPOA> favList) {
        mFavList = favList;
    }

    @NonNull
    @Override
    public AttractionsViewHolderPackageOffer onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_attraction_package_offer, parent, false);
        return new AttractionsViewHolderPackageOffer(v);
    }

    public static class AttractionsViewHolderPackageOffer extends RecyclerView.ViewHolder {
        public ImageView card_image_1;
        public TextView Package_offer_title;
        public CardView Card;

        public AttractionsViewHolderPackageOffer(View itemView) {
            super(itemView);
            Card = itemView.findViewById(R.id.att_po);
            card_image_1 = itemView.findViewById(R.id.img_po);
            Package_offer_title = itemView.findViewById(R.id.tex);

        }
    }
    @SuppressLint("LongLogTag")
    @Override
    public void onBindViewHolder(AttractionsViewHolderPackageOffer holder, int position) {
        ItemPOA currentItem = mFavList.get(position);
        holder.Package_offer_title.setText(currentItem.get_Package_offer_title());
        holder.Card.setOnClickListener(v -> {
            DialogPOA dialog = new DialogPOA();
            dialog.show(((AppCompatActivity) v.getContext()).getSupportFragmentManager(), "item");
            Bundle bundle1 = new Bundle();

            bundle1.putString("title_po", currentItem.get_Package_offer_title());
            bundle1.putString("description_po", currentItem.get_Package_offer_description());
            bundle1.putString("cost_po", currentItem.get_Package_offer_cost());
            dialog.setArguments(bundle1);
        });
        holder.getAdapterPosition();
    }

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

I have a similar Adapter, but when called, everything works, that is, the problem is not in the DialogFragment, since everything works when called from another fragment.

Fragment that the CardView is in

public class FragmentAtt extends Fragment {
    ArrayList<ItemPOA> mFavList;

    String URL = "http://qqqqqqqqq.mcdir.ru/dbpo.php";
    RecyclerView mRec;
    RecyclerView.LayoutManager recyclerViewlayoutManager;
    RecyclerView.Adapter recyclerViewadapter;

    //ImageView GET_PO_IMG;
    String GET_PO_TITLE = "title_po";
    String GET_PO_DESCRIPTION = "description_po";
    String GET_PO_COST = "cost_po";


    RequestQueue requestQueue;
    JsonArrayRequest jsonArrayRequest;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRetainInstance(true);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_test_attraction, container, false);
        TabLayout tabLayout = view.findViewById(R.id.tab);
        ViewPager viewPager = view.findViewById(R.id.pager);
        setupViewPager(viewPager);

        tabLayout.setupWithViewPager(viewPager);
        return view;
    }

    @Override
    public void onViewCreated(@NonNull final View view, @Nullable Bundle savedInstanceState) {

        mRec = requireView().findViewById(R.id.rec_po);

        mFavList = new ArrayList<>();

        recyclerViewadapter = new AdapterAttractionsPackageOffer(mFavList);

        recyclerViewlayoutManager = new LinearLayoutManager(getContext());

        mRec.setHasFixedSize(true);
        mRec.setLayoutManager(recyclerViewlayoutManager);
        mRec.setAdapter(recyclerViewadapter);
        JSON_DATA_WEB_CALL2_RINK();

        //recyclerViewlayoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false);

        //SnapHelper snapHelper = new GravitySnapHelper(Gravity.START);
        //snapHelper.attachToRecyclerView(mRec);
    }

    private void setupViewPager(ViewPager viewPager) {
        PagerAdapter adapter = new PagerAdapter(getChildFragmentManager());
        adapter.addFragment(new FragmentAttractionRecyclerView(), "Аттракционы");
        adapter.addFragment(new FragmentAttractionRecyclerView(), "Видеоигры");
        viewPager.setAdapter(adapter);

    }

    public void JSON_DATA_WEB_CALL2_RINK() {
        jsonArrayRequest = new JsonArrayRequest(URL,
                this::JSON_PARSE_DATA_AFTER_WEBCALL_RINK,
                error ->
                        Log.e("Volley", error.toString())) {
            @Override
            protected Response<JSONArray> parseNetworkResponse(NetworkResponse response) {
                try {
                    Cache.Entry cacheEntry = HttpHeaderParser.parseCacheHeaders(response);
                    if (cacheEntry == null) {
                        cacheEntry = new Cache.Entry();
                    }
                    final long cacheExpired = 24 * 60 * 60 * 1000; // in 24 hours this cache entry expires completely
                    long now = System.currentTimeMillis();
                    final long ttl = now + cacheExpired;
                    cacheEntry.data = response.data;
                    cacheEntry.softTtl = now;
                    cacheEntry.ttl = ttl;
                    String headerValue;
                    headerValue = response.headers.get("Date");
                    if (headerValue != null) {
                        cacheEntry.serverDate = HttpHeaderParser.parseDateAsEpoch(headerValue);
                    }
                    headerValue = response.headers.get("Last-Modified");
                    if (headerValue != null) {
                        cacheEntry.lastModified = HttpHeaderParser.parseDateAsEpoch(headerValue);
                    }
                    cacheEntry.responseHeaders = response.headers;
                    final String jsonString = new String(response.data,
                            HttpHeaderParser.parseCharset(response.headers));
                    return Response.success(new JSONArray(jsonString), cacheEntry);
                } catch (UnsupportedEncodingException | JSONException e) {
                    return Response.error(new ParseError(e));
                }
            }
        };
        requestQueue = Volley.newRequestQueue(requireContext());
        requestQueue.add(jsonArrayRequest);
    }

    public void JSON_PARSE_DATA_AFTER_WEBCALL_RINK(JSONArray array) {
        mFavList.clear();
        for (int i = 0; i < array.length(); i++) {
            ItemPOA GetDataAdapter2 = new ItemPOA();
            JSONObject json;
            try {
                json = array.getJSONObject(i);
                GetDataAdapter2.set_Package_offer_title(json.getString(GET_PO_TITLE));
                GetDataAdapter2.set_Package_offer_description(json.getString(GET_PO_DESCRIPTION));
                GetDataAdapter2.set_Package_offer_cost(json.getString(GET_PO_COST));
            } catch (JSONException e) {
                e.printStackTrace();
            }
            mFavList.add(GetDataAdapter2);
        }
        recyclerViewadapter = new AdapterAttractionsPackageOffer(mFavList);
        mRec.setAdapter(recyclerViewadapter);
    }
}

An Adapter that has the same functionality, but why does it work, explain the difference?

public class AdapterSkatingRinkSchedule_2 extends RecyclerView.Adapter<AdapterSkatingRinkSchedule_2.SkatingRinkScheduleViewHolder> {
    public ArrayList<ItemSkatingRinkSchedule_2> mSkatingRinkScheduleList;

    public AdapterSkatingRinkSchedule_2(ArrayList<ItemSkatingRinkSchedule_2> SkatingRinkScheduleList) {
        mSkatingRinkScheduleList = SkatingRinkScheduleList;
    }

    @NonNull
    @Override
    public SkatingRinkScheduleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_srs, parent, false);
        return new SkatingRinkScheduleViewHolder(v);
    }

    public static class SkatingRinkScheduleViewHolder extends RecyclerView.ViewHolder {
        public TextView number_srs, start_time_srs, end_time_srs, cost_1_srs, cost_2_srs;
        public LinearLayout ll_main;


        public SkatingRinkScheduleViewHolder(View itemView) {
            super(itemView);
            ll_main = itemView.findViewById(R.id.ll_main);
            number_srs = itemView.findViewById(R.id.number_srs);
            start_time_srs = itemView.findViewById(R.id.start_time_srs);
            end_time_srs = itemView.findViewById(R.id.end_time_srs);
            cost_1_srs = itemView.findViewById(R.id.cost_1_srs);
            cost_2_srs = itemView.findViewById(R.id.cost_2_srs);
        }
    }
    @SuppressLint("LongLogTag")
    @Override
    public void onBindViewHolder(SkatingRinkScheduleViewHolder holder, int position) {
        ItemSkatingRinkSchedule_2 currentItem = mSkatingRinkScheduleList.get(position);
        holder.number_srs.setText(currentItem.get_session_number());
        holder.start_time_srs.setText(currentItem.get_session_start());
        holder.end_time_srs.setText(currentItem.get_session_end());
        holder.cost_1_srs.setText(currentItem.get_weekdays());
        holder.cost_2_srs.setText(currentItem.get_weekends_and_holidays());
        holder.ll_main.setOnClickListener(v -> {
            DialogSkatingRinkSchedule dialogSRS = new DialogSkatingRinkSchedule();
            dialogSRS.show(((AppCompatActivity) v.getContext()).getSupportFragmentManager(), "item");
            Bundle bundle2 = new Bundle();

            bundle2.putString("number", currentItem.get_session_number());
            bundle2.putString("start", currentItem.get_session_start());
            bundle2.putString("end", currentItem.get_session_end());
            bundle2.putString("w", currentItem.get_weekdays());
            bundle2.putString("wah", currentItem.get_weekends_and_holidays());
            dialogSRS.setArguments(bundle2);
        });
        holder.getAdapterPosition();
    }

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

1 Answers1

0

java.lang.ClassCastException: android.view.ContextThemeWrapper cannot be cast to androidx.appcompat.app.AppCompatActivity

Here you are casting a context to an AppCompatActivity but actually Activity is not a Context

You have two options to solve this:

  1. First option: Create a listener interface between the activity/fragment that holds the RecyclerView, implement it in that activity, and trigger its callback within the CardView onClickListener onClick() callback.

  2. Second option: Change the constructor signature of the AdapterAttractionsPackageOffer adapter to accept a FragmentManager instance; save it as a class field like below, and reflect that on the instantiation of the adapter

public class AdapterAttractionsPackageOffer extends RecyclerView.Adapter<AdapterAttractionsPackageOffer.AttractionsViewHolderPackageOffer> {
    public ArrayList<ItemPOA> mFavList;
    
    private FragmentManager fragmentMgr;
    
    public AdapterAttractionsPackageOffer(ArrayList<ItemPOA> favList, FragmentManager fManger) {
        mFavList = favList;
        fragmentMgr = fManger;
    }

    //......... suppressed code
    
    
    @SuppressLint("LongLogTag")
    @Override
    public void onBindViewHolder(AttractionsViewHolderPackageOffer holder, int position) {
        ItemPOA currentItem = mFavList.get(position);
        holder.Package_offer_title.setText(currentItem.get_Package_offer_title());
        
        holder.Card.setOnClickListener(v -> {
            DialogPOA dialog = new DialogPOA();
            dialog.show(fragmentMgr, "item");
            Bundle bundle1 = new Bundle();

            bundle1.putString("title_po", currentItem.get_Package_offer_title());
            bundle1.putString("description_po", currentItem.get_Package_offer_description());
            bundle1.putString("cost_po", currentItem.get_Package_offer_cost());
            dialog.setArguments(bundle1);
        });
        holder.getAdapterPosition();
    }

    //......... suppressed code

}
Zain
  • 37,492
  • 7
  • 60
  • 84
  • I updated the question, could you see what is the difference between `Adapter`? I just don't understand why I repeated the same thing, but it doesn't work –  Jan 15 '21 at 01:50
  • I couldn't see the difference between both .. but the casting is not that right .. are the dialogs the same? – Zain Jan 15 '21 at 01:59
  • No, `dialog` other, strange for some reason it does not work with this adapter –  Jan 15 '21 at 02:21