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

Cách dùng Collections.rotate() cho ListView Android

Giới thiệu

Ví dụ này demo Collections.rotate(List, distance) để xoay vòng các phần tử trong ArrayList theo khoảng cách (distance) xác định trước khi hiển thị ListView.

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

Giao diện chuẩ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.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<>();
        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);

                // QUAN TRỌNG: Xoay vòng danh sách 2 vị trí
                // Phần tử ở cuối sẽ chuyển lên đầu
                Collections.rotate(array_list, 2);

                array_list.trimToSize();
                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 Collections.rotate()

  • Collections.rotate(list, distance): Dịch chuyển các phần tử.
  • distance > 0: Xoay về phía cuối (phần tử cuối về đầu).
  • distance < 0: Xoay về phía đầu (phần tử đầu về cuối).
  • Ví dụ: [A, B, C, D, E] rotate(2) → [D, E, A, B, C].
  • Thay đổi in-place, độ phức tạp O(n).

Lưu ý code gốc

Code gốc có logic sai: kiểm tra if (array_list.isEmpty()) sau khi addAll thì list không bao giờ rỗng. Phiên bản trên đã sửa.

Chạy ứng dụng

Cách dùng Collections.rotate() cho ListView Android

Danh sách bị xoay 2 vị trí so với thứ tự nhập.