0

I'm having a problem creating a fragment with a listView and a footer button on that listview. When I call addFooterView() on my listView, I get the following exception when running my app:

E/AndroidRuntime: FATAL EXCEPTION: main
          Process: com.joshuaindustries.FindFun, PID: 5164
          java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams cannot be cast to android.widget.AbsListView$LayoutParams
              at android.widget.ListView.clearRecycledState(ListView.java:545)
              at android.widget.ListView.resetList(ListView.java:532)
              at android.widget.ListView.layoutChildren(ListView.java:1556)
              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 android.support.v4.view.ViewPager.onLayout(ViewPager.java:1767)
              at android.view.View.layout(View.java:17637)
              at android.view.ViewGroup.layout(ViewGroup.java:5575)
              at android.support.design.widget.HeaderScrollingViewBehavior.layoutChild(HeaderScrollingViewBehavior.java:131)
              at android.support.design.widget.ViewOffsetBehavior.onLayoutChild(ViewOffsetBehavior.java:42)
              at android.support.design.widget.AppBarLayout$ScrollingViewBehavior.onLayoutChild(AppBarLayout.java:1364)
              at android.support.design.widget.CoordinatorLayout.onLayout(CoordinatorLayout.java:846)
              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 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)
              at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

The layout of my fragment (overview_tab_fragment.xml) looks like this:

        <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ListView
        android:id="@android:id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <Button
        android:id="@+id/load_more_events"
        android:text="@string/button_load_more_events"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_alignParentBottom="true" />
</LinearLayout>

And this is the source code of my fragment class (CustomListFragment.java):

package com.joshuaindustries.CustomFragments;

import com.joshuaindustries.FindFun.DetailsActivity;
import com.joshuaindustries.data.Persons;
import android.R;
import android.R.id;
import android.app.Activity;
import android.content.Intent;
import android.support.v4.app.ListFragment;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;
import android.widget.AbsListView.LayoutParams;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
/**
 * Created by Joshua on 21/12/2016.
 */
public class CustomListFragment extends ListFragment {
    String TAG = "CustomListFragment";
    private View viewRoot;
    private Button loadMoreEventsButton;

    private SimpleAdapter listAdapter;
    private Persons personsInfo;
    private List < Persons.Person > personData;
    private ArrayList < HashMap < String, String > > adapterData;
    private String [ ] from;
    private int [ ] to;

    @Override
    public View onCreateView ( LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState ) {
        super.onCreateView ( inflater, container, savedInstanceState );
        Log.d ( TAG, "onCreateView started" );
        viewRoot = inflater.inflate ( com.joshuaindustries.FindFun.R.layout.overview_tab_fragment, container, false );
        return ( viewRoot );
    }

    @Override
    public void onActivityCreated ( Bundle savedInstanceState ) {
        super.onActivityCreated ( savedInstanceState );

        loadMoreEventsButton = ( Button ) viewRoot.findViewById ( com.joshuaindustries.FindFun.R.id.load_more_events );
        getListView ( ).addFooterView ( (View) loadMoreEventsButton );
        Log.d ( TAG, "onActivityCreated: added footer view " );
    }

    @Override
    public void onListItemClick ( ListView listView, View view, int viewPosition, long rowID ) {
        Log.d ( TAG, "viewPosition " + viewPosition );
        Log.d ( TAG, "rowID" + rowID );
        Toast onItemClickToast = Toast.makeText ( getContext ( ), ( String ) ( ( HashMap ) listAdapter.getItem ( ( int ) rowID ) ).get ( from [ 0 ] ), Toast.LENGTH_LONG );
        onItemClickToast.show ( );

        Intent detailsIntent = new Intent ( getContext ( ), DetailsActivity.class );
        Persons.putInIntent ( personsInfo.getPersonAtPosition ( ( int ) rowID ), detailsIntent );
        startActivity ( detailsIntent );
    }
}

I tried the suggestions here and here to no avail.

Thanks in advance for your help, Joshua

1
  • share your other code Commented Dec 27, 2016 at 11:45

3 Answers 3

0

Actually you are getting this exception because you are trying to add the button which is associated with Linearlayout parent ,because you add your view using FindViewById() ,so the view which is added to the Listview will have LinearLayout params

you can move your button into another xml as shown below

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <Button
        android:id="@+id/load_more_events"
        android:text="Load more"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"/>

</RelativeLayout>

and in the code you can use it as shown below

RelativeLayout footerview = (RelativeLayout) getLayoutInflater().inflate(R.layout.footer_view, getListView(),false);
getListView().addFooterView(footerview);

so here when i am inflating the xml, i am passing Listview as parent, so now the Footerview will have AbsListView$LayoutParams ,and hence your issue will be resolved

Sign up to request clarification or add additional context in comments.

Comments

0

replace your import of

import android.widget.AbsListView.LayoutParams;

with

 import android.view.viewgroup.layoutparams;

2 Comments

Nice catch.but where he is using LayoutParams in posted code?
Hi Anjali, Thanks for your answer. I tried importing android.view.ViewGroup.LayoutParams but that also didn't help unfortunately
0

Hasifs answer solved my problem. Thank you! You put me on the right track to solving my problem and I appreciate the explanation. I did opt to make my button in code this time though (to keep my folders somewhat managable ):

Button loadMoreEventsButton = new Button ( getContext ( ) );
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams ( LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT );
layoutParams.addRule ( RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE );
loadMoreEventsButton.setLayoutParams ( new AbsListView.LayoutParams ( layoutParams ) );
loadMoreEventsButton.setText ( "Load more events ..." );
getListView ( ).addFooterView ( loadMoreEventsButton );

Have a nice day! ;)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.