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

Cách thêm nhiều bản sao vào ArrayList cho ListView Android

Mục tiêu

Sử dụng Collections.nCopies() để thêm nhiều bản sao của một phần tử vào ArrayList hiển thị trên ListView.

Ví dụ minh họa

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <EditText android:id="@+id/name" android:layout_width="match_parent"
        android:hint="Nhập tên" android:layout_height="wrap_content"/>

    <LinearLayout android:layout_width="wrap_content"
        android:layout_height="wrap_content">
        <Button android:id="@+id/save" android:text="Lưu"
            android:layout_width="wrap_content" android:layout_height="wrap_content"/>
        <Button android:id="@+id/refresh" android:text="Làm mới"
            android:layout_width="wrap_content" android:layout_height="wrap_content"/>
    </LinearLayout>

    <ListView android:id="@+id/listView"
        android:layout_width="match_parent" android:layout_height="wrap_content"/>
</LinearLayout>

MainActivity.java

package com.example.multicopydemo;

import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class MainActivity extends AppCompatActivity {
    EditText name;
    ArrayAdapter<String> adapter;
    ArrayList<String> dataList;
    Set<String> uniqueSet = new HashSet<>();
    ListView listView;

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

        dataList = new ArrayList<>();
        dataList.ensureCapacity(20);
        name = findViewById(R.id.name);
        listView = findViewById(R.id.listView);

        findViewById(R.id.refresh).setOnClickListener(v -> {
            if (adapter != null) {
                adapter.notifyDataSetChanged();
            }
        });

        findViewById(R.id.save).setOnClickListener(v -> {
            String input = name.getText().toString().trim();
            if (!input.isEmpty()) {
                uniqueSet.add(input);
                dataList.clear();

                if (dataList.isEmpty()) {
                    dataList.addAll(uniqueSet);
                    // Thêm 2 bản sao của tên vừa nhập
                    List<String> copies = Collections.nCopies(2, input);
                    dataList.addAll(copies);
                    dataList.trimToSize();

                    adapter = new ArrayAdapter<>(this, 
                        android.R.layout.simple_list_item_1, dataList);
                    listView.setAdapter(adapter);
                } else {
                    listView.setVisibility(View.GONE);
                }
                Toast.makeText(this, "Đã thêm", Toast.LENGTH_SHORT).show();
            } else {
                name.setError("Nhập tên");
            }
        });
    }
}

Kết quả

Nhập "sairam" một lần → ListView hiển thị: sairam, sairam, sairam (1 gốc + 2 bản sao).

Giải thích code

  • HashSet lưu các tên duy nhất (tránh trùng lặp khi nhập lại tên cũ).
  • Collections.nCopies(2, input) tạo list chứa 2 bản sao của input.
  • dataList.addAll(copies) gộp vào danh sách chính.

Cải tiến: Cho phép tùy chỉnh số bản sao

// Thêm EditText số lượng bản sao
int count = Integer.parseInt(copiesEditText.getText().toString());
List<String> copies = Collections.nCopies(count, input);

Lưu ý

List trả về bởi nCopies() là fixed-size (không add/remove được), nhưng ArrayList.addAll() copy nội dung vào list mới nên không vấn đề.