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