Android 调用listView上的addFooterView以添加按钮时发生ClassCastException

Android 调用listView上的addFooterView以添加按钮时发生ClassCastException,android,listview,android-fragments,Android,Listview,Android Fragments,我在创建包含listView和该listView上的页脚按钮的片段时遇到问题。当我在listView上调用addFooterView()时,在运行我的应用程序时会出现以下异常: E/AndroidRuntime: FATAL EXCEPTION: main Process: com.joshuaindustries.FindFun, PID: 5164 java.lang.ClassCastException: android.widget.LinearL

我在创建包含listView和该listView上的页脚按钮的片段时遇到问题。当我在listView上调用addFooterView()时,在运行我的应用程序时会出现以下异常:

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)
我的片段(overview_tab_fragment.xml)的布局如下所示:

        <?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>

这是我的片段类(CustomListFragment.java)的源代码:

package com.joshuaindustries.CustomFragments;
导入com.joshuaindustries.FindFun.DetailsActivity;
导入com.joshuaindustries.data.Persons;
导入android.R;
导入android.R.id;
导入android.app.Activity;
导入android.content.Intent;
导入android.support.v4.app.ListFragment;
导入android.os.Bundle;
导入android.util.Log;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.BaseAdapter;
导入android.widget.Button;
导入android.widget.ListView;
导入android.widget.simpledapter;
导入android.widget.Toast;
导入android.widget.AbsListView.LayoutParams;
导入java.util.ArrayList;
导入java.util.HashMap;
导入java.util.List;
/**
*由Joshua于2016年12月21日创建。
*/
公共类CustomListFragment扩展了ListFragment{
String TAG=“CustomListFragment”;
私有视图viewRoot;
私有按钮加载更多事件按钮;
私有SimpleAdapter列表适配器;
私人信息;
私人列表personData;
私有ArrayList>adapterData;
来自的私有字符串[];
私人int[]至;
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
super.onCreateView(充气机、容器、保存状态);
Log.d(标记“onCreateView已启动”);
viewRoot=inflater.inflate(com.joshuaindustries.FindFun.R.layout.overview_tab_片段,容器,false);
返回(viewRoot);
}
@凌驾
已创建ActivityState上的公共无效(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
loadMoreEventsButton=(按钮)viewRoot.findViewById(com.joshuaindustries.FindFun.R.id.load\u more\u事件);
getListView().addFooterView((视图)loadMoreEventsButton);
d(标记“onActivityCreated:added footer view”);
}
@凌驾
public void onListItemClick(ListView ListView、View视图、int viewPosition、long rowID){
Log.d(标签,“视图位置”+视图位置);
Log.d(标记“rowID”+rowID);
Toast-onItemClickToast=Toast.makeText(getContext(),(String)((HashMap)listAdapter.getItem((int)rowID)).get(from[0]),Toast.LENGTH_LONG);
nonitimclicktoast.show();
Intent detailsinent=新的意图(getContext(),DetailsActivity.class);
Persons.putinent(personsInfo.getPersonAtPosition((int)rowID),detailsinent);
起始触觉(细节);
}
}
我尝试了这些建议,但没有结果

提前感谢您的帮助,
Joshua

替换您输入的

import android.widget.AbsListView.LayoutParams;


实际上,出现此异常是因为您试图添加与Linearlayout父级关联的按钮,因为您使用FindViewById()添加视图,因此添加到Listview的视图将具有Linearlayout参数

您可以将按钮移动到另一个xml中,如下所示

<?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>

因此,在这里,当我膨胀xml时,我将Listview作为父视图传递,因此现在Footerview将具有AbsListView$LayoutParams,因此您的问题将得到解决

如果答案解决了我的问题。非常感谢。你让我走上了解决问题的正确道路,我感谢你的解释。不过,这次我确实选择在代码中设置按钮(以保持文件夹的可管理性):


祝你今天愉快

很好的捕获。但是他在发布的代码中使用了
LayoutParams
?嗨,Anjali,谢谢你的回答。我尝试导入android.view.ViewGroup.LayoutParams,但这也无助于不幸地共享其他代码
 import android.view.viewgroup.layoutparams;
<?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>
RelativeLayout footerview = (RelativeLayout) getLayoutInflater().inflate(R.layout.footer_view, getListView(),false);
getListView().addFooterView(footerview);
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 );