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

Cách cuộn ListView đến vị trí cụ thể bằng lập trình Android

Giới thiệu

Bài viết này hướng dẫn cuộn mượt (smooth scroll) ListView đến một vị trí xác định (index) bằng phương thức smoothScrollToPosition(int position). Ví dụ cuộn đến vị trí thứ 22 (index 22) trong danh sách 30 cầu thủ.

Các bước thực hiện

Bước 1: Tạo dự án mới

Mở Android Studio, chọn File → New Project và tạo dự án.

Bước 2: Thiết kế giao diện (res/layout/activity_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:id="@+id/rl"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="10dp"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Cuộn đến vị trí 22" />

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

</RelativeLayout>

Bước 3: Viết code logic (src/MainActivity.java)

import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final ListView listView = findViewById(R.id.listView);
        Button btn = findViewById(R.id.btn);

        String[] footballPlayers = new String[] {
            "Cristiano Ronaldo", "Lionel Messi", "Neymar Jnr", "Eden Hazard", "Isco",
            "Gareth Bale", "Sergio Buesquets", "Zlatan Ibrahimovic", "GG Buffon", "Iker Casillas",
            "Rafael Varane", "Zinedine Zidane", "Menphis Depay", "Gerard Pique", "Victor Valdes",
            "David De Gea", "Mo Salah", "Ronaldinio", "Marco Rues", "Asencio",
            "Luis Figo", "Sergio Ramos", "Maldini", "Marcelo", "Karim Benzema", "Sir Alex Firguson"
        };

        final List<String> playersList = new ArrayList<>(Arrays.asList(footballPlayers));
        final ArrayAdapter<String> adapter = new ArrayAdapter<>(
            this, android.R.layout.simple_list_item_1, playersList
        );
        listView.setAdapter(adapter);

        btn.setOnClickListener(v -> listView.smoothScrollToPosition(22));
    }
}

Bước 4: Cấu hình AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
    package="app.com.sample">
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

Chạy ứng dụng

Kết nối thiết bị, nhấn Run. Danh sách 26 cầu thủ hiển thị. Nhấn nút "Cuộn đến vị trí 22" -> ListView cuộn mượt đến "Sir Alex Firguson" (index 22, item thứ 23).

Các phương thức cuộn ListView khác

Phương thứcHành vi
smoothScrollToPosition(position)Cuộn mượt đến vị trí (animation)
setSelection(position)Nhảy ngay lập tức đến vị trí (không animation)
smoothScrollToPositionFromTop(position, offset)Cuộn mượt, item đích cách top offset pixel
smoothScrollByOffset(offset)Cuộn mượt offset item từ vị trí hiện tại

Đối với RecyclerView (hiện đại hơn)

// Cuộn mượt đến vị trí
recyclerView.smoothScrollToPosition(position);

// Hoặc dùng LinearLayoutManager
LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
layoutManager.scrollToPositionWithOffset(position, offset);

Lưu ý

  • Vị trí (position) là index 0-based
  • Nếu position >= số lượng item, ListView cuộn đến cuối
  • smoothScrollToPosition() hoạt động bất đồng bộ, không block UI thread
  • Để cuộn đến item cụ thể theo dữ liệu (không phải index), cần tìm index trước: list.indexOf(item)