Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Android

Cách đặt dung lượng tối thiểu ArrayList cho ListView Android

Giới thiệu

Ví dụ này minh họa việc sử dụng ensureCapacity(int minCapacity) để đặt trước dung lượng (capacity) của ArrayList, tránh chi phí resize liên tục khi thêm phần tử, cải thiện hiệu năng ListView.

Bước 1 & 2: Tạo dự án và Giao diện

Giao diện: EditText, nút Lưu, Làm mới, ListView.

Bước 3: MainActivity.java

package com.example.andy.myapplication;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Set;

public class MainActivity extends AppCompatActivity {
    EditText name;
    ArrayAdapter<String> arrayAdapter;
    ArrayList<String> array_list;
    Set<String> set = new HashSet<>();
    ListView listView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        array_list = new ArrayList<>();
        // QUAN TRỌNG: Đặt dung lượng tối thiểu 20 phần tử
        array_list.ensureCapacity(20);

        name = findViewById(R.id.name);
        listView = findViewById(R.id.listView);

        findViewById(R.id.refresh).setOnClickListener(v -> {
            if (arrayAdapter != null) {
                arrayAdapter.notifyDataSetChanged();
                listView.invalidateViews();
                listView.refreshDrawableState();
            }
        });

        findViewById(R.id.save).setOnClickListener(v -> {
            String input = name.getText().toString();
            if (!input.isEmpty()) {
                set.add(input);
                array_list.clear();
                array_list.addAll(set);
                Collections.sort(array_list, new Comparator<String>() {
                    @Override
                    public int compare(String o1, String o2) {
                        return o1.compareTo(o2);
                    }
                });
                arrayAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, array_list);
                listView.setAdapter(arrayAdapter);
                Toast.makeText(this, "Đã thêm", Toast.LENGTH_LONG).show();
            } else {
                name.setError("Nhập tên");
            }
        });
    }
}

Giải thích ensureCapacity()

  • Mặc định: ArrayList khởi tạo capacity = 10 (hoặc 0 trong Java 8+).
  • Khi đầy: Tự động mở rộng gấp 1.5 lần (newCapacity = oldCapacity * 3/2 + 1).
  • Chi phí: Mở rộng mảng tốn O(n) copy dữ liệu.
  • ensureCapacity(n): Đảm bảo capacity ≥ n, tránh resize nhiều lần.

Khi nào nên dùng?

  • Biết trước số lượng phần tử ước lượng (ví dụ: load 1000 item từ DB).
  • Thêm nhiều phần tử trong vòng lặp.
  • Ứng dụng nhạy cảm hiệu năng (game, real-time).

Đối 비교: trimToSize()

  • ensureCapacity(): Tăng capacity LÊN.
  • trimToSize(): Giảm capacity XUỐNG = size hiện tại (giải phóng bộ nhớ).

Chạy ứng dụng

Cách đặt dung lượng tối thiểu ArrayList cho ListView Android

ListView hiển thị danh sách đã sắp xếp, hiệu năng tốt hơn khi thêm nhiều item.