ListView第一条数据问题

本文针对Android开发中ListView显示不正常的问题提供了多种解决方案,包括只显示第一条数据或第一条数据不显示的情况,并介绍了如何调整布局和代码以确保数据正确加载。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.ListView第一条数据不显示问题

一般就是两方面的问题,不一定准确哈,希望能帮上有需要的人们,不喜勿喷,谢谢!

1.查看activity中的data是否实例 adapter只绑定一次 剩下的notifyDataSetChanged
2.过滤数据的时候在activity中做 不要去adapter中去做


2.ListView只显示第一条数据问题
请先检查你的数据是否已经获取到
检查数据,检查数据,检查数据,重要的事情说三遍
/**失败展示**/
<ScrollView  
    android:layout_width="fill_parent"  
    android:layout_height="fill_parent">  
    <LinearLayout  
        android:layout_width="fill_parent"  
        android:layout_height="wrap_content"  
        android:orientation="vertical">  
        <TextView  
            android:layout_width="fill_parent"  
            android:layout_height="wrap_content"  
            android:text="********start*********" />  
        <ListView  
            android:layout_width="fill_parent"  
            android:layout_height="wrap_content">  
        </ListView>  
        <TextView  
            android:layout_width="fill_parent"  
            android:layout_height="wrap_content"  
            android:text="********end*********" />  
    </LinearLayout>  
 </ScrollView>

1.一般是把ListView放在了ScrollView里面,这就会导致ListView的其他数据未显示出来
最简单的解决办法就是删除ScrollView控件
很多人都会问,为啥会存在这种结构呢,因为现实真实需要这种结构,比如头部需要一个标题,底部需要一个结尾,中间需要展示ListView,就需要这种结构的存在,整体还需要滚动
2.动态设置高度

    /** 
     * 动态设置高度
     * 传入View控件
     * @param listView 
     */  
    public static void setListViewHeightBasedOnChildren(ListView listView) {  
        // 获取ListView对应的Adapter  
        // 判断非null
        ListAdapter listAdapter = listView.getAdapter();  
        if (listAdapter == null) {  
            return;  
        }  

        int totalHeight = 0;  
        // 循环整个列表 算出整个ListView所占的高度
        for (int i = 0, i < listAdapter.getCount(); i++) { 
            View listItem = listAdapter.getView(i, null, listView);  
            listItem.measure(0, 0); // 计算子项View 的宽高  
            totalHeight += listItem.getMeasuredHeight(); // 统计所有子项的总高度  
        }  

        ViewGroup.LayoutParams params = listView.getLayoutParams();  
        // listView.getDividerHeight()获取子项间分隔符占用的高度  
        // params.height最后得到整个ListView完整显示需要的高度  
        params.height = totalHeight  
                + (listView.getDividerHeight() * (listAdapter.getCount() - 1));  
        listView.setLayoutParams(params);  
    }  

注意: 这种方法只适合单层LinearLayout,不适合其他情况;
还需手动将ScrollView滚动至顶端

sv.smoothScrollTo(0, 0); 

3.把头部和底部直接拼接在ListView里面,也就是使用ListView显示,不需要ScrollView
在自定义的Adapter里面做相应判断

public View getView(int position, View convertView, ViewGroup parent) {  
    //列表第一项  
    if(position == 0){  
       convertView = inflater.inflate(R.layout.item_top, null);  
        return convertView;  
    }  
    //列表最后一项  
    else if(position == data.size()-1){  
        convertView = inflater.inflate(R.layout.item_bottom, null);  
        return convertView;  
    }  
    //普通列表项  
    ViewHolder h = null;  
    if(convertView == null || convertView.getTag() == null){  
        convertView = inflater.inflate(R.layout.item_listview, null);  
        h = new ViewHolder();  
        h.tv = (TextView) convertView.findViewById(R.id.item_listview_tv);  
        convertView.setTag(h);  
    }else{  
        h = (ViewHolder) convertView.getTag();  
    }  
    h.tv.setText("第"+ position + "条数据");  
    return convertView;  
}  

4.既然我们可以动态设置高度,那么我们直接自定义一个ListView去适应这个ScrollView,岂不是更加方便

public class ListViewForScrollView extends ListView {  
    public ListViewForScrollView(Context context) {  
        super(context);  
    }  
    public ListViewForScrollView(Context context, AttributeSet attrs) {  
        super(context, attrs);  
    }  
    public ListViewForScrollView(Context context, AttributeSet attrs,  
        int defStyle) {  
        super(context, attrs, defStyle);  
    }  
    @Override  
    /** 
     * 重写方法,使ListView适应ScrollView
     */  
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
        int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,  
        MeasureSpec.AT_MOST);  
        super.onMeasure(widthMeasureSpec, expandSpec);  
    }  
}  

注意:这个方法跟动态设置ListView高度一样,都需要手动设置ScrollView到顶部

sv.smoothScrollTo(0, 0); 

今天就介绍到这里,有时间在继续

/************************************************************************************/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值