Tôi có một ListView với một bộ điều hợp danh sách tùy chỉnh. Trong phương thức getView(), đang sử dụng mẫu 'ViewHolder' như được hiển thị trong Bản trình diễn API cho ListView14.java. Khi tôi lần đầu tiên hiển thị danh sách có vẻ như tải chính xác. Tuy nhiên, vấn đề tôi đang gặp phải là khi tôi cuộn danh sách, tôi thấy dữ liệu cho danh sách hiển thị trong hàng sai (tức là một TextView phải nằm trong hàng 10 sẽ hiển thị trong hàng 2 ví dụ). Tuy nhiên, khi tôi không sử dụng trình xem và thay vào đó gọi hàm findViewById() mỗi lần, thì chế độ xem danh sách sẽ hiển thị chính xác.android viewview viewholder. khi nào sử dụng và khi không đến
Trả lời
Tuy nhiên, vấn đề tôi đang chạy vào là rằng khi tôi di chuyển danh sách, tôi nhìn thấy những dữ liệu cho danh sách xuất hiện trong các hàng sai (tức là một TextView mà phải ở trong hàng 10 đang hiển thị trong hàng 2 chẳng hạn).
Rất có thể, bạn đang tái chế không đúng các hàng của mình, chẳng hạn như ViewHolders
bạn đang thao tác không phải là thứ phù hợp với hàng bạn đang quay trở lại.
Here is a free excerpt từ một trong những cuốn sách của tôi để tìm hiểu thêm về việc tái chế hàng - có lẽ nó sẽ giúp bạn xác định nơi mọi thứ đang diễn ra sai.
vì vậy tôi nghĩ rằng tôi đã phát hiện sự cố thực sự ở đây. khi bạn thiết lập các thông số bố trí trên bay cho mỗi hàng, bạn cần phải chắc chắn rằng bạn làm điều đó cho tất cả các điều kiện. vấn đề của tôi là nếu nó là hàng đầu tiên, tôi đặt một tham số layout (như padding hoặc margins etc), nhưng sau đó nếu nó là một hàng ở giữa, tôi đã không thiết lập rõ ràng các params nghĩ rằng nó sẽ chỉ sử dụng bởi inflater xem. Điều này giải thích tại sao nó hoạt động khi tôi tăng lượt xem mỗi lần. Đây là một trước & sau:
TRƯỚC:
if (position == 0) {
layoutParams.topMargin = uiHelper.getDip(15.0f);
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP,
RelativeLayout.TRUE);
holder.actionMenu.setLayoutParams(layoutParams);
holder.contentLayout.setBackgroundResource(R.drawable.top_row);
} else if (position == posts.size() - 1) {
holder.contentLayout
.setBackgroundResource(R.drawable.bottom_row);
holder.contentLayout.setPadding(holder.contentLayout
.getPaddingLeft(),
holder.contentLayout.getPaddingTop(),
holder.contentLayout.getPaddingRight(),
holder.contentLayout.getPaddingBottom() + uiHelper.getDip(10.0f));
} else {
holder.contentLayout
.setBackgroundResource(R.drawable.inner_row);
}
SAU: `
layoutParams.topMargin = uiHelper.getDip(10.0f);
holder.contentLayout.setPadding(holder.contentLayout
.getPaddingLeft(),
holder.contentLayout.getPaddingTop(),
holder.contentLayout.getPaddingRight(),
uiHelper.getDip(10.0f));
if (position == 0) {
layoutParams.topMargin = uiHelper.getDip(15.0f);
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP,
RelativeLayout.TRUE);
holder.contentLayout.setBackgroundResource(R.drawable.top_row);
} else if (position == posts.size() - 1) {
holder.contentLayout
.setBackgroundResource(R.drawable.bottom_row);
holder.contentLayout.setPadding(holder.contentLayout
.getPaddingLeft(),
holder.contentLayout.getPaddingTop(),
holder.contentLayout.getPaddingRight(),
uiHelper.getDip(20.0f));
} else {
holder.contentLayout
.setBackgroundResource(R.drawable.inner_row);
}
holder.actionMenu.setLayoutParams(layoutParams);
- tôi phải đối mặt với cùng một vấn đề
- Giải Quyết sử dụng dưới đây techninc
- Lý do: Adapter không Đã tải thường xuyên.
trong lớp Tuỳ chỉnh Adaptor của bạn thêm ViewHolder sử dụng Access Specifiers
private static class ViewHolder { protected TextView itemName; }
Trong Get Xem phương pháp
@Override
public View getView(int position, View view, ViewGroup viewGroup) {
// create a ViewHolder reference
ViewHolder holder;
//check to see if the reused view is null or not, if is not null then reuse it
if (view == null) {
holder = new ViewHolder();
view = mLayoutInflater.inflate(R.layout.list_item, null);
holder.itemName = (TextView) view.findViewById(R.id.list_item_text_view);
// the setTag is used to store the data within this view
view.setTag(holder);
} else {
// the getTag returns the viewHolder object set as a tag to the view
holder = (ViewHolder)view.getTag();
}
// now Use Holder object toget Idss
holder.itemName.setText(" sample text based on position ");
}
Chú ý: Và Chúng ta không nên đặt bất kỳ thẻ để xem đối tượng ngoại trừ Đối tượng trình xem
Cảm ơn bạn rất nhiều vì đoạn mã hữu ích này. – swiftBoy
- 1. ListView rất chậm khi cuộn (sử dụng ViewHolder/tái chế)
- 2. Android: Triển khai ViewHolder
- 3. Mục tiêu C khi nào sử dụng phân bổ và khi không đến
- 4. Khi nào sử dụng, không sử dụng, OneToOne và ManyToOne
- 5. Khi nào sử dụng "mới" và khi nào không sử dụng, trong C++?
- 6. Khi nào tôi sử dụng ByteString và khi nào tôi không sử dụng?
- 7. Khi nào sử dụng HTML5 trong android? khi không sử dụng?
- 8. android: khi nào sử dụng onStart(), onStop()?
- 9. Khi nào tôi sử dụng dấu ngoặc đơn và khi nào tôi không sử dụng?
- 10. Khi nào nên sử dụng và khi nào không sử dụng Try Catch Cuối cùng
- 11. Khi nào cần sử dụng Request.UrlReferrer và khi Request.ServerVariables ["HTTP_REFERER"]?
- 12. Khi nào sử dụng Soapobject và SoapPrimitive
- 13. Khi nào sử dụng undef_method, và khi nào cần sử dụng remove_method?
- 14. Khi nào nên sử dụng node.js và khi nào sử dụng ajax?
- 15. httpmodules httphandlers, sử dụng lý tưởng chúng là gì? khi nào nên sử dụng và khi nào không sử dụng?
- 16. Khi nào tôi nên sử dụng setUpClass và khi __init__?
- 17. Khi nào sử dụng/proc và khi/dev
- 18. Android - Khi sử dụng LocationManager.requestLocationUpdates, tôi có cần WakeLock không?
- 19. Khi nào sử dụng HtmlControls và WebControls
- 20. Khi nào sử dụng Runtime.maxMemory() và totalMemory()
- 21. Enums và Constants. Sử dụng khi nào?
- 22. BitmapCache? Khi nào và cách sử dụng?
- 23. Bash: Sử dụng trong khi hoặc cho đến khi chờ cho đến khi một PID không tồn tại
- 24. Khi nào sử dụng TaskEx.Run và TaskEx.RunEx
- 25. OpenGLES 2 - khi nào đến glBindTexture và khi nào đến glActiveTexture?
- 26. Khi nào cần sử dụng viewDidLoad và khi nào thì sử dụng awakeFromNib
- 27. Khi nào sử dụng các biến mẫu và khi nào sử dụng các thuộc tính
- 28. Khi nào sử dụng giữ lại và khi nào sử dụng bản sao
- 29. Khi nào cần sử dụng socket.io và khi nào thì sử dụng ajax
- 30. Khi nào sử dụng mảng và khi nào sử dụng mảng ô?
đó là một hướng dẫn thực sự tuyệt vời, cảm ơn bạn. – eric2323223