简体   繁体   中英

java.lang.ClassCastException: Search cannot be cast to android.app.Activity

Hi does anyone know why i am getting this error in runtime? I am unsure how to resolve it and i am new to this. Please help. I have called the Search class in my MainActivity and my app crashes when i click on the button to open it.

Here is the code used to call the Search class:

search.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(MainActivity.this, Search.class);
            startActivity(intent);
        }
    });

And here is my Search class:

public class Search extends Fragment implements Filterable {

private FilterViewModel mViewModel;
private TextView fromMauritiusTheNearestTxt;
private TextView largestMagnitudeEarthquakeTxt;
private TextView deepestEarthquakeTxt;
private Button chooseByDateBtn;
private String startdateString, enddateString;
private final LatLng mauritiusLatLng = new LatLng(-20.2005136, 56.5541215);

List<String> alldates;

public List<ItemClass> mRssFeedModels;
private List<ItemClass> datafilteredlist;

public static Search newInstance() {
    return new Search();
}

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

    mViewModel = ViewModelProviders.of(this).get(FilterViewModel.class);

    View root = inflater.inflate(R.layout.activity_search, container, false);

    fromMauritiusTheNearestTxt = root.findViewById(R.id.from_mauritius_the_nearest_txt);
    largestMagnitudeEarthquakeTxt = root.findViewById(R.id.largest_magnitude_earthquake_txt);
    deepestEarthquakeTxt = root.findViewById(R.id.deepest_earthquake_txt);
    chooseByDateBtn = root.findViewById(R.id.choose_by_data_btn);
    alldates = new ArrayList<>();
    ;

    mRssFeedModels = mRssFeedModels;
    setNearestMagnitudeDeepest();

    chooseByDateBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            final AlertDialog.Builder mydialog1 = new AlertDialog.Builder(getContext());
            LayoutInflater inflater1 = LayoutInflater.from(getContext());
            View myview1 = inflater1.inflate(R.layout.custom_date_range_filter, null);
            mydialog1.setView(myview1);
            final AlertDialog dialog1 = mydialog1.create();
            dialog1.show();
            final TextView startdatetxt = myview1.findViewById(R.id.start_date_txt);
            final TextView enddatetxt = myview1.findViewById(R.id.end_date_txt);


            startdatetxt.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    final Calendar c = Calendar.getInstance();
                    int mYear = c.get(Calendar.YEAR);
                    final int mMonth = c.get(Calendar.MONTH);
                    int mDay = c.get(Calendar.DAY_OF_MONTH);


                    DatePickerDialog datePickerDialog = new DatePickerDialog(getContext(),
                            new DatePickerDialog.OnDateSetListener() {

                                @Override
                                public void onDateSet(DatePicker view, int year,
                                                      int monthOfYear, int dayOfMonth) {
                                    SimpleDateFormat format = new SimpleDateFormat("dd MMM yyyy");
                                    c.set(year, monthOfYear, dayOfMonth);
                                    startdateString = format.format(c.getTime());
                                    startdatetxt.setText(startdateString);
                                }
                            }, mYear, mMonth, mDay);
                    datePickerDialog.show();
                }
            });

            enddatetxt.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    final Calendar c = Calendar.getInstance();
                    int mYear = c.get(Calendar.YEAR);
                    final int mMonth = c.get(Calendar.MONTH);
                    int mDay = c.get(Calendar.DAY_OF_MONTH);
                    DatePickerDialog datePickerDialog = new DatePickerDialog(getContext(),
                            new DatePickerDialog.OnDateSetListener() {

                                @Override
                                public void onDateSet(DatePicker view, int year,
                                                      int monthOfYear, int dayOfMonth) {
                                    SimpleDateFormat format = new SimpleDateFormat("dd MMM yyyy");
                                    c.set(year, monthOfYear, dayOfMonth);
                                    enddateString = format.format(c.getTime());
                                    enddatetxt.setText(enddateString);

                                }
                            }, mYear, mMonth, mDay);
                    datePickerDialog.show();


                }
            });

            Button datefilterbtn = myview1.findViewById(R.id.filterbtn);
            datefilterbtn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (TextUtils.isEmpty(startdateString)) {
                        startdatetxt.setError("select date");
                    }
                    if (TextUtils.isEmpty(enddateString)) {
                        enddatetxt.setError("select ");
                    } else {

                        //setNearestMagnitudeDeepest();
                        alldates = getDates(startdateString, enddateString);
                        for (String date : alldates) {
                            System.out.println(date);
                        }
                        getFilter().filter(startdateString);
                        dialog1.dismiss();
                    }
                }
            });
        }
    });
    return root;
}

// mathod used to set
//from Mauritius The Nearest in Textbox
//largest Magnitude Earthquake in Textbox
//deepest Earthquake in Textbox
public void setNearestMagnitudeDeepest() {

    String fromMauritiusTheNearest = "";
    String largestMagnitudeEarthquake = "";
    String largestMagnitudeEarthquakeLocName = "";
    String deepestEarthquakeLocName = "";

    for (int i = 0; i < mRssFeedModels.size(); i++) {

        if (Double.parseDouble(mRssFeedModels.get(i).lat) == findNearestDoubleInList()) {

            fromMauritiusTheNearest = mRssFeedModels.get(i).getLocation();
            System.out.println(mRssFeedModels.get(i).lat + "------------- " + findNearestDoubleInList() + "  " + mRssFeedModels.get(i).getLocation());
        }
    }

    double maxMagnitude = Double.MIN_VALUE;
    for (int i = 0; i < mRssFeedModels.size(); i++) {
        if (Double.parseDouble(mRssFeedModels.get(i).getMagnitude()) > maxMagnitude) {
            maxMagnitude = Double.parseDouble(mRssFeedModels.get(i).getMagnitude());
            largestMagnitudeEarthquakeLocName = mRssFeedModels.get(i).getLocation();
        }
    }

    String maxDepthStr = null;
    int maxDepth = Integer.MIN_VALUE;
    for (int i = 0; i < mRssFeedModels.size(); i++) {
        if (Integer.parseInt(mRssFeedModels.get(i).getDepth().replaceAll("[^0-9]", "")) > maxDepth) {
            maxDepth = Integer.parseInt(mRssFeedModels.get(i).getDepth().replaceAll("[^0-9]", ""));
            maxDepthStr = mRssFeedModels.get(i).getDepth();
            deepestEarthquakeLocName = mRssFeedModels.get(i).getLocation();
        }
    }

    largestMagnitudeEarthquake = String.valueOf(maxMagnitude);

    fromMauritiusTheNearestTxt.setText(fromMauritiusTheNearest);
    largestMagnitudeEarthquakeTxt.setText(largestMagnitudeEarthquake + " in " + largestMagnitudeEarthquakeLocName);
    deepestEarthquakeTxt.setText(maxDepthStr + " in " + deepestEarthquakeLocName);
}

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    mViewModel = ViewModelProviders.of(this).get(FilterViewModel.class);
    // TODO: Use the ViewModel
}

//method use to find nearest location from mauritius
private Double findNearestDoubleInList() {
    Double answer = Double.parseDouble(mRssFeedModels.get(0).lat);
    Double current = Double.MAX_VALUE;
    for (int i = 0; i < mRssFeedModels.size(); i++) {
        if (Math.abs(Double.parseDouble(mRssFeedModels.get(i).lat) - mauritiusLatLng.latitude) < current) {
            answer = Double.parseDouble(mRssFeedModels.get(i).lat);
            current = Math.abs(answer - mauritiusLatLng.latitude);
        }
    }
    return answer;
}

@Override
public Filter getFilter() {
    return new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence charSequence) {

            String charString = charSequence.toString();
            if (charString.isEmpty()) {
                datafilteredlist = mRssFeedModels;
            } else {
                List<ItemClass> filteredList = new ArrayList<>();
                for (int i = 0; i < alldates.size(); i++) {
                    charString = alldates.get(i);
                    for (ItemClass row : mRssFeedModels) {
                        // name match condition. this might differ depending on your requirement
                        // here we are looking for name or phone number match
                        if (row.getDescription().toLowerCase().contains(charString.toLowerCase())) {
                            filteredList.add(row);
                            System.out.println("matched");
                        }
                    }

                }
                datafilteredlist = filteredList;
            }

            FilterResults filterResults = new FilterResults();
            filterResults.values = datafilteredlist;
            return filterResults;
        }

        @Override
        protected void publishResults(CharSequence charSequence, FilterResults results) {
            mRssFeedModels = (ArrayList<ItemClass>) results.values;
            setNearestMagnitudeDeepest();
            if (fromMauritiusTheNearestTxt.getText().toString().isEmpty()) {
                final android.app.AlertDialog.Builder builder = new android.app.AlertDialog.Builder(getContext());
                builder.setMessage("No record found on this date")
                        .setCancelable(false)
                        .setPositiveButton("Okay", new DialogInterface.OnClickListener() {
                            public void onClick(@SuppressWarnings("unused") final DialogInterface dialog, @SuppressWarnings("unused") final int id) {
                                mRssFeedModels = mRssFeedModels;
                                setNearestMagnitudeDeepest();
                            }
                        });
                final android.app.AlertDialog alert = builder.create();
                alert.show();
            }
        }
    };
}

private static List<String> getDates(String dateString1, String dateString2) {
    ArrayList<String> dates = new ArrayList<String>();
    SimpleDateFormat df1 = new SimpleDateFormat("dd MMM yyyy");

    Date date1 = null;
    Date date2 = null;

    try {
        date1 = df1.parse(dateString1);
        date2 = df1.parse(dateString2);
    } catch (ParseException e) {
        e.printStackTrace();
    }

    Calendar cal1 = Calendar.getInstance();
    cal1.setTime(date1);
    Calendar cal2 = Calendar.getInstance();
    cal2.setTime(date2);

    while (!cal1.after(cal2)) {
        //Date date=cal1.getTime();
        //dates.add(cal1.getTime());
        dates.add(df1.format(cal1.getTime()));
        cal1.add(Calendar.DATE, 1);
    }
    return dates;
}

}

Your Search class is a Fragment , you cannot start it with the Intent . Make Search to be Activity or switch between fragments using FragmentManager .

Intent intent = new Intent(MainActivity.this, Search.class);

The Intent constructor doesn't expect a Fragment class as a second Argument, Here you add Search.class which is a Fragment, but you need to have an Activity instead

Fragments can be loaded in activities using a Transaction, not an intent.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM