【问题标题】:FrameLayout cannot be cast to android.widget.AbsListViewFrameLayout 无法转换为 android.widget.AbsListView
【发布时间】:2014-08-19 07:39:45
【问题描述】:

我想为列表视图设置页脚。但我得到以下错误:

 >     : FATAL EXCEPTION: main
 >     08-19 07:26:53.225: E/AndroidRuntime(1176): java.lang.ClassCastException: android.widget.FrameLayout$LayoutParams
 > cannot be cast to android.widget.AbsListView$LayoutParams
 >     08-19 07:26:53.225: E/AndroidRuntime(1176):  at android.widget.ListView.clearRecycledState(ListView.java:513)
 >     08-19 07:26:53.225: E/AndroidRuntime(1176):  at android.widget.ListView.resetList(ListView.java:500)
 >     08-19 07:26:53.225: E/AndroidRuntime(1176):  at android.widget.ListView.setAdapter(ListView.java:442)
 >     08-19 07:26:53.225: E/AndroidRuntime(1176):  at .SimpeSearch.onClick(SimpeSearch.java:91)

第 91 行是 setAdapter 方法:

FrameLayout footerLayout = (FrameLayout) getLayoutInflater().inflate(R.layout.footer_loadmore,null);
TextView footer = (TextView) footerLayout.findViewById(R.id.footer);



listview.addFooterView(footer);

        AdapterSimpleSearch ad = new AdapterSimpleSearch(this,R.layout.row_list_simple_search,10, footer);
listview.setAdapter(ad); 

页脚加载更多:

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

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="6dp"
>

<TextView android:id="@+id/footer"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:textAppearance="@android:style/TextAppearance.Medium"
    android:text="Loading..."
    />

</FrameLayout>

构造函数:

public AdapterSimpleSearch(Context context,int layoutResourceId,int pageSize, TextView footer){
    super(context,layoutResourceId);

我该如何解决?

更新:

我的适配器:

public AdapterSimpleSearch(Context context,int layoutResourceId,int pageSize, TextView footer){
    super(context,layoutResourceId);
    helperbooks = new ArrayList<>(); 
    this.context            = context ;
    //this.helperbooks      = hbooks ;
    this.mFooter = footer ;
    inflater = (LayoutInflater)this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    this.mPageSize = pageSize ;

}

public void notifyNoMoreItems(){
    mHasMoreItems = false;
    mFooter.setText("No more Items");
}


@Override
public int getCount() {
    // TODO Auto-generated method stub
    return this.helperbooks.size();
}


@Override
public long getItemId(int position) {
    // TODO Auto-generated method stub
    return position;
}


public static class ViewHolder{

    TextView txt_view_title,txt_view_author,txt_view_publisher ;

}


@Override
public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub

    if(position == getCount() - 1 && mHasMoreItems){
        LoaderTaskSimpleSearch t = new LoaderTaskSimpleSearch(position + 1, position + 1 + mPageSize, context,this,"book");
        t.execute();
        mFooter.setText("Loading . . .");
    }


    ViewHolder viewholder ;

    if(convertView == null){
        convertView = this.inflater.inflate(R.layout.row_list_simple_search, null);
        viewholder = new ViewHolder();

        viewholder.txt_view_title       = (TextView)convertView.findViewById(R.id.txt_view_title_list_simple_search);
        viewholder.txt_view_author      = (TextView)convertView.findViewById(R.id.txt_view_author_list_simple_search);
        viewholder.txt_view_publisher   = (TextView)convertView.findViewById(R.id.txt_view_publisher_list_simple_search);
        convertView.setTag(viewholder);

    }else

        viewholder = (ViewHolder)convertView.getTag();

    viewholder.txt_view_title.setText(helperbooks.get(position).getTitle());
    viewholder.txt_view_author.setText(helperbooks.get(position).getAuthor());
    viewholder.txt_view_publisher.setText(helperbooks.get(position).getPublisher());

    return convertView;
}

}

【问题讨论】:

  • SimpeSearch 类的第 91 行是什么?
  • 请发布适配器类
  • 第 91 行:listview.setAdapter(ad);
  • 我的帖子更新了。

标签: android xml android-listview


【解决方案1】:

从您的页脚 XML 中删除 FrameLayout 父级。您只需要TextView。您可以使用边距作为填充。

(或者,只需将整个 FrameLayout 设置为页脚视图。)

发生错误是因为footer 父级是FrameLayout,而ListView 需要控制父级本身。

所以,XML:

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

<TextView android:id="@+id/footer"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_margin="6dp"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:textAppearance="@android:style/TextAppearance.Medium"
    android:text="Loading..."
    />

和代码:

View footer = getLayoutInflater().inflate(R.layout.footer_loadmore, null);
listview.addFooterView(footer);

【讨论】:

    【解决方案2】:

    这对我有帮助,在 android 文档的某个地方找到。 (以 JetPack 为例)

    尝试先设置适配器,然后添加页脚/页眉。

    val binding = ProductDetailFragmentBinding.inflate(inflater, container, false)
    
    val headerView = ProductListHeaderBinding.inflate(inflater, container, false)
    val footerView = ProductListFooterBinding.inflate(inflater, container, false)
    
    binding.productListView.adapter = adapter
    
    binding.productListView.addHeaderView(headerView.root)
    binding.productListView.addFooterView(footerView.root)
    

    【讨论】:

      【解决方案3】:

      使用这个。

      View footerLayout = ((LayoutInflater) this.getSystemService(
                  Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.footer_loadmore,
                  null, false);
      listview.addFooterView(footerLayout);
      

      还将FrameLayoutheightwidth 更改为wrap_content。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-27
        • 1970-01-01
        • 1970-01-01
        • 2016-07-26
        相关资源
        最近更新 更多