Ammar Salahi
Ammar Salahi

Reputation: 33

Cannot Cast Activity to Interface in fragment

my code has Class Cast Exception error.

When the string is sent from the adapter to the fragment by interface. In the fragment, the interface goes to the specific activity if the particular string is selected.

this is Interface code:

public interface StringListener {
 void sendStr(String title);
  }

and so this is adapter code:

public class StringRecyclerViewAdapter extends RecyclerView.Adapter<StringRecyclerViewAdapter.MyViewHolder>{

List<GridSubject> subjects;
Context context;
public StringRecyclerViewAdapter(Context context,List<GridSubject> subjects)
{
    this.context=context;
    this.subjects=subjects;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view;
    LayoutInflater inflater=LayoutInflater.from(context);
    view=inflater.inflate(R.layout.custom_layout,parent,false);
    return new MyViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
      final GridSubject subject=subjects.get(position);
      holder.txts.setText(subject.text);
      holder.imgs.setImageResource(subject.drwab);
      holder.myCard.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
              sendStrMe(subject.getText());
          }
      });
}

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

public void sendStrMe(String title) {
    StringListener listener=(StringListener) context;
    listener.sendStr(title);
}

class MyViewHolder extends RecyclerView.ViewHolder{
    TextView txts;
    ImageView imgs;
    CardView myCard;
    public MyViewHolder(View itemView) {
        super(itemView);

        txts=itemView.findViewById(R.id.txt);
        imgs=itemView.findViewById(R.id.img);
        myCard=itemView.findViewById(R.id.my_card);
    }

}

and this is Fragment Code:

public class FragmentA extends Fragment  implements SportListener {

private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";


private String mParam1;
private String mParam2;
 public Intent intent;

public FragmentA() {
    // Required empty public constructor
}

public static FragmentA newInstance(String param1, String param2) {
    FragmentA fragment = new FragmentA();
    Bundle args = new Bundle();
    args.putString(ARG_PARAM1, param1);
    args.putString(ARG_PARAM2, param2);
    fragment.setArguments(args);
    return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
        mParam1 = getArguments().getString(ARG_PARAM1);
        mParam2 = getArguments().getString(ARG_PARAM2);
    }
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    return inflater.inflate(R.layout.my_layout_sport, container, false);
}



@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    try {

        super.onActivityCreated(savedInstanceState);
        RecyclerView recyclerView=getView().findViewById(R.id.recycler_me);
        final String[] txts={"Special","Hard","Manual","Easy"};
        int[] imgs={R.drawable.special,R.drawable.hard,R.drawable.manual,R.drawable.easy};

        List<GridSubject> subjects=new ArrayList<>();
        for(int i=0;i<imgs.length;i++) {
            subjects.add(new GridSubject(txts[i], imgs[i]));
        }
       int ori=getResources().getConfiguration().orientation;
        int span;
        if(ori== Configuration.ORIENTATION_LANDSCAPE)
            span=3;
        else
            span=2;
        StringRecyclerViewAdapter adapter=new StringRecyclerViewAdapter(getActivity(),subjects);
        recyclerView.setLayoutManager(new GridLayoutManager(getActivity(),span));
        recyclerView.setAdapter(adapter);
    }
    catch (Exception e)
    {
        Toast.makeText(getActivity().getApplicationContext(), e.getMessage(), Toast.LENGTH_SHORT).show();
    }

}

@Override
public void onDetach() {
    super.onDetach();
}


@Override
public void sendSport(String title) {
    if(title=="Special") {
        intent=new Intent(getActivity(),WebActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    }
    else{
        intent=new Intent(getActivity(),SportShowActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

    }
    startActivity(intent);

}

}

and this is Activity code:

public class MainActivity extends AppCompatActivity {


BottomNavigationView btm_navs;
FragmentA afrag;
FragmentB bfrag;
FragmentC cfrag;
FragmentD dfrag;
ViewPager pagerS;
MenuItem menuItem;

@Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        btm_navs = findViewById(R.id.btn_navs);
        pagerS = findViewById(R.id.view_pager_mes);


        btm_navs.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                switch (item.getItemId()) {
                    case R.id.item_a:
                        pagerS.setCurrentItem(0);
                        break;
                    case R.id.item_b:
                        pagerS.setCurrentItem(1);
                        break;
                    case R.id.item_c:
                        pagerS.setCurrentItem(2);
                        break;
                    case R.id.item_d:
                        pagerS.setCurrentItem(3);
                        break;

                }
                return true;
            }
        });
        pagerS.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                if (menuItem != null) {
                    menuItem.setChecked(false);
                }
                else {
                    btm_navs.getMenu().getItem(position).setChecked(false);
                }
                btm_navs.getMenu().getItem(position).setChecked(true);
                menuItem = btm_navs.getMenu().getItem(position);
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });
        setupViewPager();

    }
    catch (Exception e)
    {
        Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
    }
}

public void setupViewPager()
{
   ViewPageradapter pageradapter=new ViewPageradapter(getSupportFragmentManager());
  afrag=new FragmentA();
  bfrag=new FragmentB();
  cfrag =new FragmentC();
  dfrag=new FragmentD();
  pageradapter.addFragment(afrag);
  pageradapter.addFragment(bfrag);
  pageradapter.addFragment(cfrag);
  pageradapter.addFragment(dfrag);
   pagerS.setAdapter(pageradapter);
}

}

and so these are errors:

 java.lang.ClassCastException: com.example.project.MainActivity cannot be  cast to com.example.project.StringListener
    at com.example.pakhkhsh.StringRecyclerViewAdapter.sendStrMe(StringRecyclerViewAdapter.java:56)
    at com.example.pakhkhsh.StringRecyclerViewAdapter$1.onClick(StringRecyclerViewAdapter.java:45)
    at android.view.View.performClick(View.java:4756)
    at android.view.View$PerformClick.run(View.java:19749)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:135)
    at android.app.ActivityThread.main(ActivityThread.java:5221)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

Upvotes: 0

Views: 958

Answers (1)

Micael Mota
Micael Mota

Reputation: 590

Your activity needs to implement SportListener, not the fragment.

just do it:

public class MainActivity extends AppCompatActivity implements SportListener {
// your code ...
}```

Upvotes: 3

Related Questions