300x250 AD TOP

Tìm kiếm Blog này

Thứ Hai, 30 tháng 6, 2014

Tag:

Cơ chế ScrapView trong ListView (getView()) !

Đây cũng là một thành phần UI được sử dụng trong rất nhiều những ứng của Android. Khi sử dụng UI này thì chúng ta sẽ cho dât hiển thị như một dạng List . Tuy nhiên với Android nếu không hiểu cơ chế làm việc của đối tượng này thì ứng dụng của bạn sẽ bị giật giật khi người dùng scoll-down or scroll-up dữ liệu trong Líst của bạn. Trong blog này mình sẽ giải thích cho các anh em quan tâm đến vấn đề này cơ chế làm việc của ListView và cách sử nó một cách an toàn và em ái .




ScrapView


Khi làm việc với ListView chúng ta thương quan tâm tới mỗi row trong Líst sẽ được hiển thị như thế nào, các đối tượng được đặt ở các vị trí ra sao. Trường hợp các row chỉ chứa data dạng Text thì hok có vấn đề để nói, tuy nhiên nếu mỗi row chứa hình ảnh, và trong ListView của bạn có thể chứa vài trăm row thì câu chuyện search google tìm cách giải quyết bắt đầu xảy ra. nó bị giật giật khi bạn scroll ListView của bạn .

Nguyên nhân vì sao :
Làm việc với ListView thì việc làm chủ được code trong phương thức getView là rất cần thiết, bởi phương thức này sẽ được gọi khi một row mới từ trạng thái invisiable tới visiable (trừ chỉ có khi khởi tạo ban đầu ) . Vậy câu hỏi đặt ra là khi số lượng View lớn như vậy mà trong mỗi row chúng ta lại có các đối tượng vậy việc khởi tạo nhiều như vậy có thể out of memory hay không, và chúng ta có phần phải cache mỗi View hay không . Ok, trả lời, bạn không cần phải cache mỗi View đó, vì Android sẽ cache cho bạn bởi đối tượng Recycler, nó sẽ làm điều đó cho bạn, còn đối với việc khởi tạo đối tượng liên tục thì sao nhỉ, chúng ta sẽ giải quyết nó như nhau, chung ta sẽ tạo một class tham chiếu tới các đối tượng trong mỗi row của bạn, và như vậy mỗi lần row đó ở trạng thái visiable chúng ta chỉ cần set lại data cho nó mà không cần khởi tạo mới, ok . Và đối tượng này tất nhiên sẽ tốt hơn nếu là static .


Điều quan trọng nữa mà chúng ta cần quan tâm tới đó là tính sử dụng lại mỗi row trong ListView, chẳng có lý do gì mà một ListView có vài nghàn row mà chúng ta lại phải quan tâm đến việc xử lý layout cho vài nghàn row đó cả, Android sẽ có cơ chế tái sử dụng các layout trong row . Sorry vì mình lười đăng hình minh họa, dạo này lười lắm ý . Để chi tiết vấn đề này mình có thể mô tả màn hình Android : Tớ có 100 rows trong ListView, và màn hình của tớ chỉ có thể hiển thị tối ta là 10 rows trên màn hình, và khi đó Android ban đầu sẽ gọi hàm getView 11 lần bởi khi bạn làm cho row 1 ẩn đi thì ban đầu cái bottom line của row 1 chưa biến mất mà cái row 11 đã hiển thị lên rồi do đó nó phải gọi 11 lần, và khi row 1 biến mất hẳn thì nó sẽ được tái sử dụng cho rows 12 . Ok, hy vọng mình giải thích dễ hiểu .

Và cũng chính vì cách gọi hàm getView liên tục theo cơ chế như vậy, mà một số bạn chưa có kinh nghiệm, hay chính mình ngày xưa khi viết app mà muốn có cái checkbox trong mỗi ListView, khi check vào nó xong kéo lên kéo xuống, tìm đến cái vừa check thì nó cứ reset lại lúc ban đầu nghĩa là chưa được check, vl thật . Bởi getView nó sẽ gán lại data cho row đó mà . Để giải quyết thì bần cần lưu trạng thái đó lại, và khi row đó ở trạng thái visiable thì bạn check điều kiện được check chưa và có cách giải quyết tương ứng . Ok

Bạn có thể sử dụng chia sẻ này để chia sẻ với các đồng chí khác . Rất vui vì được bạn dùng để chia sẻ .
Thân ái và quyết thắng

0 nhận xét:

Đăng nhận xét