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();
}
});
Fragmentis where the issue is? That stack trace indicates that theListViewcausing the Exception has at least one header or footerViewadded (improperly), but I don't see that anywhere in the given code.Fragment. It's possibly happening in that callback, then. In any case, it's aListViewsomewhere that has a header and/or footer.buttonLayout.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));– That's your problem, inConfigurationFragment. Those should beListView.LayoutParams, rather thanLinearLayout.LayoutParams; like you have it inEnableSenFrag.View'sLayoutParamswill be of its parent's type, not its own. That is, since those footers are in aListView, they needListView.LayoutParams.LayoutParamsare information for the parent to know how to layout the child, so they need to be the parent's type. As far as knowing that it was a header or footer causing the issue, I've tracked this error down before, on a previous question here. Anyhoo, glad you got it working. Cheers!