adapter的notifyDataSetChanged(),无法调用getView()

前几天在写一个测试文件时,,在原布局文件中添加listview并绑定到自定义的adapter(继承自BaseAdapter)发现未达到期望效果,调试发现未进入getView()方法;

没有道理,分明调用了adapter的notifyDataSetChanged()方法,然后应该进入getView()的,可是为什么不调用呢?

网上查了资料,有三种原因:

1、getCount()返回的size为0,因此不会执行;

2、布局文件的问题、( 这类问题应该不能统一,各种布局问题都可能导致getView不运行 );

3、线程问题、可能单独开了线程执行例如下载等操作,但修改UI必须是在主线程中的,也就是说注意看下是否是在主线程中;

回到我的问题:首先调试排除1跟3的可能,size返回为4,未单独开辟线程,所以很可能是2存在问题,之前一直觉得没问题额。后来查了一下布局文件,发现是布局文件的问题导致的getView无法运行。看看我关于布局文件的部分代码

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <ImageView 
        android:id="@+id/iv_addExcepReport"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginTop="10dp"
        android:src="@drawable/btn_add_report"/>
    <LinearLayout 
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal"
        android:layout_marginTop="20dp">
        <TextView 
            android:id="@+id/tv_submitTime"
            android:layout_width="100dp"
            android:layout_height="wrap_content"
            android:layout_marginLeft="30dp"
            android:text="test"
            style="@style/tile"/>

</LinearLayout>

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

</LinearLayout>

在第二个LinearLayout中,我把高度设置成了android:layout_height="match_parent",这样导致了ListView中要显示的内容没有办法在容器中显示了。因为标题栏的高度设置成了match_parent了。把match_parent改成wrap_parent,那么就可以正常显示内容了。



在 Android 开发中,ListView 是常用的列表控件,而 Adapter 则是 ListView 显示列表数据的适配器。当数据源改变时,我们需要调用 AdapternotifyDataSetChanged() 方法来通知 ListView 更新数据。不过有时候,我们会发现调用 notifyDataSetChanged() 方法后,ListView 并没有更新数据,这通常是由以下几个原因造成的: 1. 数据源没有更新 在调用 notifyDataSetChanged() 方法之前,需要先确保数据源已经更新了。如果数据源没有更新,调用 notifyDataSetChanged() 方法也不会更新 ListView 显示的数据。 2. Adapter 对象没有重新设置 如果使用的是同一个 Adapter 对象,那么需要重新设置 Adapter 对象才能更新 ListView 显示的数据。可以通过 setAdapter() 方法重新设置 Adapter 对象。 3. ListView 没有重新绘制 当调用 notifyDataSetChanged() 方法后,ListView 并不会立即重新绘制,而是等到系统认为需要重新绘制时才会更新。可以通过调用 invalidate() 方法让 ListView 立即重新绘制。 4. 数据源和 Adapter 对象不匹配 如果数据源和 Adapter 对象不匹配,即数据源中的数据类型和 Adapter 中的数据类型不一致,调用 notifyDataSetChanged() 方法也无法更新 ListView 显示的数据。 综上所述,如果在 ListView调用 notifyDataSetChanged() 方法无效,可以先检查数据源是否更新,是否重新设置 Adapter 对象,是否调用了 invalidate() 方法以及数据源和 Adapter 对象是否匹配。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值