Xử lý ListView khi dữ liệu rỗng
Khi ArrayList rỗng, ListView hiển thị trống. Cần hiển thị thông báo "Không có dữ liệu" hoặc ẩn ListView để UX tốt hơn.
Cách 1: Sử dụng setEmptyView (Khuyên dùng)
<!-- activity_main.xml -->
<FrameLayout xmlns:android="https://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<!-- View hiển thị khi ListView rỗng -->
<TextView
android:id="@+id/emptyView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="Chưa có dữ liệu"
android:textSize="18sp"
android:textColor="#999"
android:visibility="gone"/>
</FrameLayout>
// MainActivity.java listView = findViewById(R.id.listView); TextView emptyView = findViewById(R.id.emptyView); listView.setEmptyView(emptyView); // Tự động show/hide adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, dataList); listView.setAdapter(adapter);
Cách 2: Kiểm tra thủ công isEmpty()
private void updateListView() {
if (dataList.isEmpty()) {
listView.setVisibility(View.GONE);
emptyView.setVisibility(View.VISIBLE);
} else {
listView.setVisibility(View.VISIBLE);
emptyView.setVisibility(View.GONE);
adapter.notifyDataSetChanged();
}
}
Cách 3: Empty View trong ListActivity/Fragment
// Nếu dùng ListFragment
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
getListView().setEmptyView(view.findViewById(R.id.emptyView));
}
Ví dụ hoàn chỉnh (tương tự bài trước)
findViewById(R.id.save).setOnClickListener(v -> {
String name = edtName.getText().toString().trim();
if (name.isEmpty()) {
edtName.setError("Nhập tên");
return;
}
nameSet.add(name);
edtName.setText("");
dataList.clear();
dataList.addAll(nameSet);
Collections.sort(dataList);
// Cập nhật UI
updateListView(); // Gọi cách 2
Toast.makeText(this, "Đã thêm", Toast.LENGTH_SHORT).show();
});
Kết quả

Ban đầu hiển thị "Chưa có dữ liệu". Sau khi thêm, ListView hiện dữ liệu, empty view ẩn.
Best Practices
- Luôn dùng
setEmptyView()- đơn giản, tự động, ít bug. - Empty view nên nằm cùng parent với ListView (FrameLayout/RelativeLayout).
- RecyclerView: dùng
adapter.registerAdapterDataObserver()để observe thay đổi. - Kiểm tra null trước isEmpty():
if (list == null || list.isEmpty()).