Câu trả lời:
Chúng xử lý trường hợp bạn muốn các kiểu xem khác nhau cho các hàng khác nhau. Chẳng hạn, trong một ứng dụng danh bạ, bạn có thể muốn các hàng chẵn có hình ảnh ở bên trái và các hàng lẻ có hình ảnh bên phải. Trong trường hợp đó, bạn sẽ sử dụng:
@Override
public int getViewTypeCount() {
return 2;
}
@Override
public int getItemViewType(int position) {
return position % 2;
}
Khung này sử dụng loại chế độ xem của bạn để quyết định chế độ xem nào sẽ trao cho bạn convertView
trong getView
phương thức của bạn . Nói cách khác, trong ví dụ trên, các hàng chẵn của bạn sẽ chỉ nhận được các chế độ xem được tái chế với các hình ảnh ở bên trái để sử dụng lại và các hàng lẻ sẽ chỉ nhận được các hàng có hình ảnh bên phải.
Nếu mỗi hàng trong danh sách của bạn có cùng bố cục, bạn không cần phải lo lắng về các kiểu xem. Trong thực tế, BaseAd Module.java cung cấp một hành vi mặc định cho tất cả các bộ điều hợp:
public int getItemViewType(int position) {
return 0;
}
public int getViewTypeCount() {
return 1;
}
Điều này thực sự cung cấp cho bạn cùng một kiểu xem cho mỗi hàng.
Chỉnh sửa - để phác thảo luồng chung:
AdapterView
bộ chuyển đổi của bạn .AdapterView
cố gắng để hiển thị các mục hiển thị cho người dùng.getItemViewType
cho hàng n
, hàng nó sắp hiển thị.n
. Nó không tìm thấy bất kỳ vì chưa có lượt xem nào được tái chế.getView
được gọi cho hàng n
.getItemViewType
cho hàng n
để xác định loại chế độ xem bạn nên sử dụng.getView
và chế độ xem hàng của bạn được hiển thị cho người dùng.Bây giờ, khi chế độ xem được tái chế bằng cách cuộn màn hình, nó sẽ đi vào nhóm chế độ xem được tái chế được quản lý bởi khung. Chúng chủ yếu được sắp xếp theo kiểu xem để chế độ xem đúng loại được cung cấp cho bạn theo convertView
tham số trong getView
phương thức của bạn :
getItemViewType
cho hàng nó muốn hiển thị.convertView
tham số cho getView
phương thức của bạn .Nếu chúng ta cần hiển thị loại chế độ xem khác nhau trong chế độ xem danh sách thì nên sử dụng getViewTypeCount()
và getItemViewType()
trong bộ điều hợp thay vì bật chế độ xem View.GONE
và View.VISIBLE
có thể rất tốn kém trong getView()
đó sẽ ảnh hưởng đến cuộn danh sách.
Vui lòng kiểm tra cái này để sử dụng getViewTypeCount()
và getItemViewType()
trong Adaptor.
Liên kết: việc sử dụng của getviewtypecount
Xem Outttt !!!!
Tôi đã phải đối mặt với một vấn đề khi thực hiện ListView
ngày hôm qua và đó là hai loại chế độ xem cho các hàng bị xáo trộn ngay sau khi tôi cuộn nó. Mặc dù câu trả lời được bình chọn hàng đầu trong chủ đề này đưa ra một lời giải thích chung chung, nó vẫn không nêu bật phần thông tin quan trọng nhất để ngăn chặn lỗi UI ở trên mà tôi đã đề cập.
Dưới đây là giải thích của tôi:
Cả hai getViewTypeCount()
và getItemViewType()
đang được sử dụng bởi BaseAdapter
's getView
phương pháp để tìm ra loại một cái nhìn nó nên được lấy, tái chế và trả lại. (như được giải thích trong câu trả lời hàng đầu trong chuỗi). Nhưng nếu bạn không triển khai hai phương pháp này theo trực giác theo API API của Android, thì bạn có thể gặp phải vấn đề tôi đã đề cập.
Tóm tắt Hướng dẫn cho việc thực hiện:
Thực hiện nhiều loại Views
cho ListView
hàng của chúng ta phải thực hiện về cơ bản, getItemViewType()
và getViewTypeCount()
phương pháp. Và getItemViewType()
tài liệu cung cấp cho chúng tôi một Lưu ý như sau:
Lưu ý: Số nguyên phải nằm trong phạm vi
0
đếngetViewTypeCount() - 1
.IGNORE_ITEM_VIEW_TYPE
cũng có thể được trả lại.
Vì vậy, trong bạn, getItemViewType()
bạn nên trả về các giá trị cho Kiểu xem, bắt đầu từ 0, đến loại cuối cùng là (số loại - 1). Ví dụ: giả sử bạn chỉ có ba loại chế độ xem? Vì vậy, tùy thuộc vào đối tượng dữ liệu cho chế độ xem, bạn chỉ có thể trả về 0 hoặc 1 hoặc 2 từ getItemViewType()
phương thức, giống như chỉ mục mảng dựa trên zero. Và khi bạn có ba loại khung nhìn được sử dụng, getViewTypeCount()
phương thức của bạn phải trả về 3.
Trong mọi trường hợp nếu bạn trả về bất kỳ giá trị số nguyên nào khác như 1, 2, 3 hoặc 111, 222, 333 cho phương pháp này, bạn chắc chắn có thể gặp phải lỗi UI ở trên mà bạn vừa đặt bằng cách không tuân theo API API của Android.
Nếu bạn không nhận được manh mối hoặc vẫn không thể giải quyết và cần thêm thông tin, vui lòng đọc câu trả lời chi tiết của tôi trong chuỗi Hỏi & Đáp về StackOverflow này .
Đọc Tài liệu dành cho nhà phát triển Android để biết thêm thông tin bạn có thể tìm thấy đầu mối trực tiếp.
Hy vọng câu trả lời này có thể hữu ích cho ai đó ngoài kia để tiết kiệm nhiều giờ !!!
Chúc mừng !!!
IGNORE_ITEM_VIEW_TYPE
tôi đã có một lỗi trên một trong ListView của tôi. Tôi đã sử dụng một ArrayAd CHƯƠNG để chèn một khung nhìn bao gồm 1 hình ảnh và 2 chế độ xem văn bản. Tôi chỉ có một kiểu xem. Tôi đã cố gắng không ghi đè phương thức getItemViewType hoặc ghi đè lên nó bằng cách trả về vị trí hoặc số nguyên được mã hóa cứng. Trong mọi trường hợp, tôi đã gặp phải sự trùng lặp trong danh sách của mình, với hành vi kỳ quặc khi cuộn (trùng lặp thay đổi). Trở lại IGNORE_ITEM_VIEW_TYPE
trong phương pháp đã khắc phục vấn đề. Cảm ơn.