I have seen a lot of similar issues with this exception, but it is strange neither of them fits me. I'm not sure where the issue is.

What I have done: I have the Main Activity which is a drawer layout having a bottom navigation bar one of its menus directs to the System Activity(mentioned below) and it has a coordinatorlayout as mentioned below. Inside System Activity, there are a couple of fragments, and every other function works well except when I select an item in the First Fragment (SystemFragList - mentioned below) I get this strange exception.

My Attempt 1: For the first fragment(SystemFragList) of my System Activity I have 1st added a grid view and I wanted to pass the corresponding parameter(like the selected name) to other fragments when I select one grid view item. Grid view was created with a base adapter having an image and a text view. Then when I select one grid item I got below error (same exception).

24034-24034/com.example.myapplication E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.myapplication, PID: 24034
java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams cannot be cast to android.widget.AbsListView$LayoutParams
    at android.widget.ListView.removeUnusedFixedViews(ListView.java:1908)
    at android.widget.ListView.layoutChildren(ListView.java:1769)
    at android.widget.AbsListView.onLayout(AbsListView.java:2162)
    at android.view.View.layout(View.java:17637)
    at android.view.ViewGroup.layout(ViewGroup.java:5575)
    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1741)
    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1585)
    at android.widget.LinearLayout.onLayout(LinearLayout.java:1494)
    at android.view.View.layout(View.java:17637)
    at android.view.ViewGroup.layout(ViewGroup.java:5575)
    at androidx.viewpager.widget.ViewPager.onLayout(ViewPager.java:1775)
    at android.view.View.layout(View.java:17637)
    at android.view.ViewGroup.layout(ViewGroup.java:5575)
    at androidx.coordinatorlayout.widget.CoordinatorLayout.layoutChild(CoordinatorLayout.java:1213)
    at androidx.coordinatorlayout.widget.CoordinatorLayout.onLayoutChild(CoordinatorLayout.java:899)
    at com.google.android.material.appbar.ViewOffsetBehavior.layoutChild(ViewOffsetBehavior.java:66)
    at com.google.android.material.appbar.HeaderScrollingViewBehavior.layoutChild(HeaderScrollingViewBehavior.java:152)
    at com.google.android.material.appbar.ViewOffsetBehavior.onLayoutChild(ViewOffsetBehavior.java:43)
    at com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior.onLayoutChild(AppBarLayout.java:1892)
    at androidx.coordinatorlayout.widget.CoordinatorLayout.onLayout(CoordinatorLayout.java:918)
    at android.view.View.layout(View.java:17637)
    at android.view.ViewGroup.layout(ViewGroup.java:5575)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
    at android.view.View.layout(View.java:17637)
    at android.view.ViewGroup.layout(ViewGroup.java:5575)
    at androidx.appcompat.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:446)
    at android.view.View.layout(View.java:17637)
    at android.view.ViewGroup.layout(ViewGroup.java:5575)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
    at android.view.View.layout(View.java:17637)
    at android.view.ViewGroup.layout(ViewGroup.java:5575)
    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1741)
    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1585)
    at android.widget.LinearLayout.onLayout(LinearLayout.java:1494)

My Attempt 2: Then I made the grid viwe to a simple list view by converting fragment to list fragment, so that I could find the issue. Now I'm getting the similar exception again.

Error I'm facing:

27490-27490/com.example.myapplication E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.myapplication, PID: 27490
java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams cannot be cast to android.widget.AbsListView$LayoutParams
    at android.widget.ListView.removeUnusedFixedViews(ListView.java:1908)
    at android.widget.ListView.layoutChildren(ListView.java:1769)
    at android.widget.AbsListView.onLayout(AbsListView.java:2162)
    at android.view.View.layout(View.java:17637)
    at android.view.ViewGroup.layout(ViewGroup.java:5575)
    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1741)
    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1585)
    at android.widget.LinearLayout.onLayout(LinearLayout.java:1494)
    at android.view.View.layout(View.java:17637)
    at android.view.ViewGroup.layout(ViewGroup.java:5575)
    at androidx.viewpager.widget.ViewPager.onLayout(ViewPager.java:1775)
    at android.view.View.layout(View.java:17637)
    at android.view.ViewGroup.layout(ViewGroup.java:5575)
    at androidx.coordinatorlayout.widget.CoordinatorLayout.layoutChild(CoordinatorLayout.java:1213)
    at androidx.coordinatorlayout.widget.CoordinatorLayout.onLayoutChild(CoordinatorLayout.java:899)
    at com.google.android.material.appbar.ViewOffsetBehavior.layoutChild(ViewOffsetBehavior.java:66)
    at com.google.android.material.appbar.HeaderScrollingViewBehavior.layoutChild(HeaderScrollingViewBehavior.java:152)
    at com.google.android.material.appbar.ViewOffsetBehavior.onLayoutChild(ViewOffsetBehavior.java:43)
    at com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior.onLayoutChild(AppBarLayout.java:1892)
    at androidx.coordinatorlayout.widget.CoordinatorLayout.onLayout(CoordinatorLayout.java:918)
    at android.view.View.layout(View.java:17637)
    at android.view.ViewGroup.layout(ViewGroup.java:5575)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
    at android.view.View.layout(View.java:17637)
    at android.view.ViewGroup.layout(ViewGroup.java:5575)
    at androidx.appcompat.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:446)
    at android.view.View.layout(View.java:17637)
    at android.view.ViewGroup.layout(ViewGroup.java:5575)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
    at android.view.View.layout(View.java:17637)
    at android.view.ViewGroup.layout(ViewGroup.java:5575)
    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1741)
    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1585)
    at android.widget.LinearLayout.onLayout(LinearLayout.java:1494)
    at android.view.View.layout(View.java:17637)
    at android.view.ViewGroup.layout(ViewGroup.java:5575)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
    at com.android.internal.policy.DecorView.onLayout(DecorView.java:726)
    at android.view.View.layout(View.java:17637)
    at android.view.ViewGroup.layout(ViewGroup.java:5575)
    at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2346)
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2068)
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1254)
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6337)
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:874)
    at android.view.Choreographer.doCallbacks(Choreographer.java:686)
    at android.view.Choreographer.doFrame(Choreographer.java:621)
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:860)
    at android.os.Handler.handleCallback(Handler.java:751)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:6119)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)

I tried: This suggestion and changed "extends AppCompatActivity" to "Extends Activity" but it seems not working for my case.

What I'm looking for: It is strange I cannot find where this casting gets failed. May I know any clue on how to fix this issue or how to trigger the failing point. I found several threads on this same exception but neither one of worked for me since I'm not using a custom adapter. I'm trying the simple version to find out the error.

Codes are as below where my selection fragment and the corresponding XML. I would appreciate any suggestions on this.

SystemFragList : When I select item here I get the exception.

public class SystemFragList extends ListFragment {
    // parameter declrations
public SystemFragList() {
   
}

public interface OnSMDevSelectedListener {
    public void onSMDevSelected(String MLocation, String DevName);
}

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    try {
        mCallBack = (OnSMDevSelectedListener) activity;
    } catch (ClassCastException e) {
        throw new ClassCastException(activity.toString() + "nSMDevSelectedListener");
    }
}

public static SystemFragList newInstance() {
    SystemFragList fragment = new SystemFragList();
    Bundle args = new Bundle();
    fragment.setArguments(args);
    return fragment;
}

public void buildSMsConnectedListView(final List<SMDev> DevList, final Context context){
    if(isVisible()){
        SMDevList = DevList;
        this.context = context;
        if(DevList == null) {
            Log.d("Dev","null");

        }
        else{
            final String[] MList = new String[DevList.size()];
            final String[] displayList = new String[DevList.size()];
            final String[] nameList = new String[DevList.size()];

            for (int i = 0; i < nameList.length; i++) {
                nameList[i] = DevList.get(i).getSMUserAssignedName();
                MList[i] = DevList.get(i).getMId();
                displayList[i] = nameList[i] + "\n" + MList[i];
                          }

            ArrayAdapter<String> listAdapter = new ArrayAdapter<String>(context, R.layout.system_frag_list, displayList);


            setListAdapter(listAdapter);

            final ListView listView = getListView();
            listView.setChoiceMode(AbsListView.CHOICE_MODE_SINGLE);
            listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    selectedItemPos = position;

                    selectedDevLocation = MList[position];
                    selectedDevName = nameList[position];
                    selectedDevPos = position;

                    try {
                        mCallBack.onSMDevSelected(MList[position], nameList[position]);
                    } catch (ClassCastException cce) {

                    }
                }
            });

                            if (selectedDevLocation != null) {
                for (int i = 0; i < listView.getAdapter().getCount(); i++) {

                    View view = getView (i, listView);
                    CheckedTextView checkedTextView = (CheckedTextView) view.findViewById(R.id.sys_frag_checked_box);
                    if (checkedTextView != null) {
                        String text = checkedTextView.getText().toString();
                        if (text.contains(selectedDevLocation)) {
                            listView.setItemChecked(i, true);
                        } else {
                            listView.setItemChecked(i, false);
                        }
                    }

                }
            }

        }
    }
}

@Override
public void onResume() {
    if(savedListView != null && savedListAdapter != null) {
        buildSMsConnectedListView(SMDevList, context);
    } else {
        buildSMsConnectedListView(null, getActivity().getApplicationContext());
    }
    super.onResume();
}

public View getView (int pos, ListView listView) {
    final int firstListItemPosition = listView.getFirstVisiblePosition();
    final int lastListItemPosition = firstListItemPosition + listView.getChildCount() - 1;

    if (pos < firstListItemPosition || pos > lastListItemPosition ) {
        return listView.getAdapter().getView(pos, null, listView);
    } else {
        final int childIndex = pos - firstListItemPosition;
        return listView.getChildAt(childIndex);
    }
}

}

SystemFragList XML

<?xml version="1.0" encoding="utf-8"?>

<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/sys_frag_checked_box"
    android:layout_width="match_parent"
    android:layout_height="?android:attr/listPreferredItemHeightSmall"
    android:textAppearance="?android:attr/textAppearanceListItemSmall"
    android:gravity="center_vertical"
    android:checkMark="?android:attr/listChoiceIndicatorMultiple"
    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
    android:checkMarkTint="@color/colorPrimary"
    android:paddingRight="?android:attr/listPreferredItemPaddingRight"
    android:paddingLeft="?android:attr/listPreferredItemPaddingLeft" />

SystemAcivity : Activity corresponding to Fragment. This is one of the menu items of bottom navigation bar in the Main Activity

public class SystemActivity extends AppCompatActivity implements SystemFragList.OnSMDevSelectedListener,EnableSenFrag.OnSenSelectedListener {
        
 //… Other functions & fragment new instance


    @Override
    public void onSMDevSelected(String MLocation, String DevName) {

        if(!mService.getSM(MLocation).isLive()){
            Toast.makeText(this, "Selected " + DevName + "\n" + MLocation, Toast.LENGTH_SHORT).show();
            selectedDevLocation = MLocation;
            selectedDevName = DevName;

            //Pass the selected Dev to the fragments
            SMDev Dev = mService.getSM(selectedDevLocation);
            enableSenFrag.setSMService(mService);
            enableSenFrag.buildSenList(Dev, this, mService.getBluetoothManager());

            configurationFrag.buildDevConfigList(Dev, this, mService.getBluetoothManager());

            } else{
            Toast.makeText(this, "Selected " + DevName + " " + “Unable to select!", Toast.LENGTH_SHORT).show();
        }

    }

SystemActivity XML

  <?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto">


    <androidx.viewpager.widget.ViewPager
        android:id="@+id/viewpager_system_activity"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        >

      <androidx.viewpager.widget.PagerTabStrip
            android:id="@+id/pager_title_strip"
            android:layout_width="wrap_content"
            android:layout_height="45dp"
            android:layout_gravity="top"
            android:background="@color/colorPrimary"
            android:paddingTop="4dp"
            android:paddingBottom="4dp"
            android:textColor="@color/colorAccent" />
    </androidx.viewpager.widget.ViewPager>

</androidx.coordinatorlayout.widget.CoordinatorLayout>

Update : 2 Fragments having footers

EnableSenFrag: This is a simple List Fragment having a footer with a button.

    public class EnableSenFrag extends ListFragment {

// other parameters
Button button ;
boolean buttonAvailable =false;

// function related to adding a footer
public void buildSenList(final SMDev SMDev, final Context activityContext,
                                 final SMBluetoothManagerAndroid bluetoothManager) {

        if(!SMDev.isLive()) {
// .. creating an arrays and data for the list here
            ArrayAdapter<String> adapter = new ArrayAdapter<String>(activityContext, R.layout.enable_sen_list_checkedtext_item, arraySen);
            setListAdapter(adapter);

            final ListView listView = getListView();
            listView.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE);


            //if (listView.getFooterViewsCount() == 0 || buttonAvailable==false) {
            if (buttonAvailable==false) {   //Only add the button if there is no existing button
                //Create button in the ListView footer
                listView.removeFooterView(button); // remove the previously added footer if avilable
                button = new Button(activityContext);
                button.setText("OK");
                button.setLayoutParams(new ListView.LayoutParams(ListView.LayoutParams.WRAP_CONTENT, ListView.LayoutParams.WRAP_CONTENT));
                listView.addFooterView(button);
                button.setTextColor(Color.parseColor("#ee669b"));
/*            if (SMDev.isLive()){
                button.setEnabled(false);
                button.setVisibility(View.GONE);
            }*/
                button.setEnabled(true);
                button.setVisibility(View.VISIBLE);
                buttonAvailable=true;
                button.setOnClickListener(new View.OnClickListener() {
                  // ..button on click functions here 
    );

            }

            updateCheckboxes(listView, count);

            
            listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

                  // list view item on click functions here
);
        }else{
            setDevNotLiveView();
        }
    }

public void setDevNotLiveView() {
    String[] values = new String[] {"Devs are not Live"};
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(),  R.layout.enable_sen_list_item, values);
    setListAdapter(adapter);
    if(buttonAvailable){
        button.setEnabled(false);
        button.setVisibility(View.GONE);
    }
    buttonAvailable=false;
}

ConfigurationFrag: This has a linear layout with a TextView, Button, and Expandable list view having a footer for buttons.

public class ConfigurationFrag extends Fragment {

    //parameters declaration and other initial functions’=
    // function adding footers

    public void buildDevConfigList(final SMDev SMDev, final Context context,
                                      final SMBluetoothManagerAndroid bluetoothManager) {

        if(SMDev!=null){
        DevNameTV = (TextView) getView().findViewById(R.id.config_dev_name);
        setRateBtn = (Button) getView().findViewById(R.id.setRateBt);

    //.. create data list

        expandListAdapter = new ConfigDevListAdapter(context, listOfKeys, configOptionsMap, SMDev, SMDevClone);
        expandListView = (ExpandableListView) getView().findViewById(R.id.config_expandable_listview);
        expandListView.setAdapter(expandListAdapter);

        expandListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
//..onclick functions here  
        });

        //Only add the buttons if they haven't added previously        if(expandListView.getFooterViewsCount() == 0) {
            LinearLayout buttonLayout = new LinearLayout(context);
            buttonLayout.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
            buttonLayout.setOrientation(LinearLayout.HORIZONTAL);
            buttonLayout.setGravity(Gravity.CENTER);
            buttonLayout.setPadding(10,10,10,10);
            Button writeConfigButton = new Button(context);
            Button resetListButton = new Button(context);

            writeConfigButton.setOnClickListener(new View.OnClickListener() {
                        //writeButton On click functions
                
            });
            resetListButton.setOnClickListener(new View.OnClickListener() {
                         //resetButton On click functions   });

            writeConfigButton.setText("Write");
            resetListButton.setText("Reset ");
            writeConfigButton.setTextColor(Color.parseColor("#ee669b"));
            resetListButton.setTextColor(Color.parseColor("#ee669b"));
            buttonLayout.addView(resetListButton);
            buttonLayout.addView(writeConfigButton);
            expandListView.addFooterView(buttonLayout);
        }
        DevNameTV.setText(SMDev.getSMUserAssignedName()+ " " + "Unit");
        setRateBtn.setOnClickListener(new View.OnClickListener() {
                         //button On click functions   
        });

        }
        else{
            Log.d(" Dev is: ","null");
        }
            }



    public void setDevUnavailableView(Context context) {
        DevNameTV = (TextView) getView().findViewById(R.id.config_dev_name);
        setRateBtn = (Button) getView().findViewById(R.id.setRateBt);
        expandListView = (ExpandableListView) getView().findViewById(R.id.config_expandable_listview);
        SimpleExpandableListAdapter mAdapter;
        
        String groupItems[] = {"Dev is unavailable"};
        String[][] childItems = {{"Configuration is impossible"}};

        List<Map<String, String>> groupData = new ArrayList<Map<String, String>>();
        List<List<Map<String, String>>> childData = new ArrayList<List<Map<String, String>>>();

        for (int i = 0; i < groupItems.length; i++) {
            Map<String, String> curGroupMap = new HashMap<String, String>();
            groupData.add(curGroupMap);
            curGroupMap.put("NAME", groupItems[i]);
            List<Map<String, String>> children = new ArrayList<Map<String, String>>();
            for (int j = 0; j < childItems[i].length; j++) {
                Map<String, String> curChildMap = new HashMap<String, String>();
                children.add(curChildMap);
                curChildMap.put("NAME", childItems[i][j]);
            }
            childData.add(children);
        }

        String groupFrom[] = {"NAME"};
        int groupTo[] = {R.id.heading};
        String childFrom[] = {"NAME"};
        int childTo[] = {R.id.childItem};

        mAdapter = new SimpleExpandableListAdapter(context, groupData,
                R.layout.nosignal_group_item,
                groupFrom, groupTo,
                childData, R.layout.nosignal_child_item,
                childFrom, childTo);
        expandListView.setAdapter(mAdapter);
        expandListView.setGroupIndicator(null);

        DevNameTV.setText("Select a Dev");
        setRateBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(context, "SM Dev is unavailable", Toast.LENGTH_SHORT).show();
            }
        });
0

There are 0 best solutions below