Android之listview为空时显示布局

本文介绍了在Android中,当ListView没有数据时如何优雅地显示提示布局。通过使用ListView的setEmptyView方法,可以自动检测数据集,当数据为空时显示预设的空视图。这种方法简化了代码逻辑,使得在列表无数据状态下的用户体验更佳。

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

当listview没有数据显示时,通常显示一些提示语,一般都是先判断集合是否有数据,没数据就显示提示语,但是在listview有个方法setEmptyView(view),它的内部会自动判断这个集合是否有数据,但没有数据时就会显示空的view,源码实现:

 @android.view.RemotableViewMethod
    public void setEmptyView(View emptyView) {
        mEmptyView = emptyView;

        final T adapter = getAdapter();
        final boolean empty = ((adapter == null) || adapter.isEmpty());
        updateEmptyStatus(empty);
    }

    private void updateEmptyStatus(boolean empty) {
        if (isInFilterMode()) {
            empty = false;
        }

        if (empty) {
            if (mEmptyView != null) {
                mEmptyView.setVisibility(View.VISIBLE);
                setVisibility(View.GONE);
            } else {
                // If the caller just removed our empty view, make sure the list view is visible
                setVisibility(View.VISIBLE);
            }

            // We are now GONE, so pending layouts will not be dispatched.
            // Force one here to make sure that the state of the list matches
            // the state of the adapter.
            if (mDataChanged) {           
                this.onLayout(false, mLeft, mTop, mRight, mBottom); 
            }
        } else {
            if (mEmptyView != null) mEmptyView.setVisibility(View.GONE);
            setVisibility(View.VISIBLE);
        }
    }

看下源码就一幕了燃,

package com.example.listview;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;

public class MainActivity extends Activity {
	private ListView listview;
	private ArrayList<String> datas;
	private LayoutInflater inflater;
	private MyAdapter adapter;
	private TextView tvContent;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		listview = (ListView) findViewById(R.id.listview);
		tvContent = (TextView) findViewById(R.id.tvContent);
		inflater = LayoutInflater.from(this);
		initData();
		
		adapter = new MyAdapter(datas,this);
		listview.setAdapter(adapter);
		listview.setEmptyView(tvContent);
	}
	private void initData() {
		datas = new ArrayList<String>();
//		for(int i=0;i<100;i++){
//			datas.add("测试-------");
//		}
	}
	class MyAdapter extends BaseAdapter{
		public MyAdapter(List<String> datas, Context context) {
			super();
		}
		@Override
		public int getCount() {
			return 0;
		}
		@Override
		public Object getItem(int position) {
			return null;
		}
		@Override
		public long getItemId(int position) {
			return 0;
		}
		@Override
		public View getView(int position, View converView, ViewGroup arg2) {
			ViewHolder holder = null;
			if(converView==null){
				converView = inflater.inflate(R.layout.item, null);
				holder = new ViewHolder();
				holder.tvContent = (TextView) converView.findViewById(R.id.tvContent);
			    converView.setTag(holder);
			}else{
				holder = (ViewHolder) converView.getTag();
			}
			holder.tvContent.setText(datas.get(position));
			return converView;
		}
		class ViewHolder{
			TextView tvContent;
		}
	}
}

activity.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
>

    <ListView
        android:id="@+id/listview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:cacheColorHint="#00000000" />
	<TextView 
	    android:id="@+id/tvContent"
	    android:layout_width="fill_parent"
	    android:layout_height="fill_parent"
	    android:text="没有数据"
	    android:gravity="center"
	    />
</RelativeLayout>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值