BÀI 56 - LOAD THÊM DỮ LIỆU CHO LISTVIEW TRONG ANDROID
Chúng ta sẽ code như sau:
Nếu bạn thắc mắc thì mình giải thích ngắn gọn như này: Chúng ta sẽ tạo một class nhỏ dưới dạng Handler, nó được hiểu như là một người chủ vậy, và thằng chủ này sẽ ra lệnh cho một luồng dữ liệu mới chạy song song với luồng lấy dữ liệu từ CSDL. Nghĩa là, thằng chủ sẽ sao chép những gì dữ liệu đọc về chờ khi người dùng kéo đến dữ liệu cuối cùng thì thằng chủ sẽ ra lệnh nhả những gì nó có trong tay và hiển thị cho người dùng.
Tạo một class Handler như sau:
public class myHandler extends Handler{
@Override
public void handleMessage(@NonNull Message msg) {
switch (msg.what){
case 0:
listView.addFooterView(footerView);
break;
case 1:
getData(++page); // Lấy dữ liệu từ CSDL, có hướng dẫn rồi !
isEndData = false;
break;
}
super.handleMessage(msg);
}
}
public class ThreadData extends Thread{
@Override
public void run() {
myHandler.sendEmptyMessage(0); // Gửi lệnh yêu cầu bật listView
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Message message = myHandler.obtainMessage(1); // Tiếp tục trở lại handler nhận luồng dữ liệu mới
myHandler.sendMessage(message);
super.run();
}
}
Tạo các biến toàn cục sau
int page = 1;
boolean isEndData = false; // kiểm tra xem đến dữ liệu cuối cùng hiện có chưa
boolean limitData = false; // kiểm tra xem CSDL đã gửi hết dữ liệu chưa
myHandler myHandler; // Quản lý Thread cập nhật thay đổi khi scroll
Ánh xạ thuộc tính myHandler
myHandler = new myHandler();
Trong class chứa khuôn dữ liệu để đổ vào listView chỉnh sửa lại một chút
public class classSanPham implements Serializable {
// Thêm implements Serializable trước class để thực hiện phương thức truyền dữ liệu đa màn hình cho một arrayList
}
Bây giờ chỉ cần gọi sự kiện click và scrool listView nữa:
lvCoKhi.setOnItemClickListener((parent, view, position, id) -> {
Intent intent = new Intent(getApplicationContext(), Activity.class);
intent.putExtra("key", arrayList.get(position)); // Truyền arrayList sang màn hình khác
startActivity(intent);
});
lvCoKhi.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if (firstVisibleItem + visibleItemCount == totalItemCount
&& totalItemCount != 0 && !isEndData && !limitData){
isEndData = true;
ThreadData threadData = new ThreadData();
threadData.start();
}
}
});
Ngoài ra trong hàm getData() ngoài hàm if kiểm tra response != null thì cũng phải kiểm tra xem respose có rỗng hay không bằng cách ' && response != 2 ' (vì mạch định Json sẽ trả về 2 dấu [ ] nên nếu dữ liệu là rỗng thì response chỉ chứa 2 dấu ngoặc đó thôi). Ngược lại, ở hàm else sẽ trả kết quả là hết dữ liệu