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ức | Hà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)