2010-08-04 11 views
5

Tôi có một listview với một mảng tùy chỉnh xử lý khoảng 15 chuỗi. Kiểu của mỗi hàng thay thế (giữa các nhãn và giá trị cho các nhãn đó - ví dụ hàng 1 có thể là "địa chỉ email" và hàng 2 sẽ là địa chỉ email thực tế). Tôi đang thay đổi phong cách của mỗi hàng để thay thế như thế này trong phương thức getView() của arrayadapter. Vì vậy, nếu mục ở vị trí hiện tại là một nhãn, tôi sẽ thay đổi kiểu dáng từ kiểu hàng mặc định (đó là những gì các giá trị đã áp dụng cho chúng). Khi listview tải lần đầu tiên, kiểu dáng hoàn hảo và chỉ là cách tôi muốn. Nếu tôi cuộn danh sách từ từ lên hoặc xuống, nó vẫn như vậy. Tuy nhiên, nếu tôi cuộn danh sách nhanh lên và xuống, kiểu dáng của các hàng giá trị bắt đầu thay đổi thành kiểu của các nhãn giá trị cho đến khi tất cả các hàng có kiểu dáng của hàng nhãn. Có ai biết tại sao điều này sẽ xảy ra? Tôi đã sử dụng bộ điều hợp tùy chỉnh trên các danh sách xem khác trong ứng dụng mà không gặp vấn đề gì như thế này.Khi tôi cuộn chế độ xem danh sách bằng bộ điều hợp tùy chỉnh quá nhanh lên và xuống, getView() bắt đầu hoạt động một cách kỳ lạ. Tại sao?

Chỉnh sửa: Phát hiện ra rằng nó cũng thay đổi tất cả các hàng thành kiểu nhãn trên các thay đổi hướng dọc-> chiều ngang. Không làm điều này trên phong cảnh-> thay đổi chân dung. Dưới đây là bộ điều hợp tôi đang sử dụng. Tui bỏ lỡ điều gì vậy?

public class DetailsAdapter extends ArrayAdapter<String> { 

private TextView text = null; 
private String item = null; 

public DetailsAdapter(Context context, int resource, int textViewResourceId, String[] objects) { 
    super(context, resource, textViewResourceId, objects); 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    text = (TextView) super.getView(position, convertView, parent); 
    item = getItem(position); 
    if (item.equals("Name") || item.equals("Mobile") || item.equals("Home") || item.equals("Email") || item.equals("Address")) { 
     text.setBackgroundColor(0xFF575757); 
     text.setTextSize(15); 
     text.setTypeface(null, Typeface.BOLD); 
     text.setPadding(8, 5, 0, 5); 
    } else { 
     text.setPadding(15, 15, 0, 15); 
    } 
    return text; 
} 

@Override 
public boolean isEnabled(int position) { 
    item = getItem(position); 
    if (item.equals("Name") || item.equals("Mobile") || item.equals("Home") || item.equals("Email") || item.equals("Address")) { 
     return false; 
    } else { 
     return true; 
    } 
} 
} 
+0

Bạn có thể hiển thị mã getView của mình không? –

+0

Ban đầu có bao nhiêu hàng sẽ được hiển thị khi xem danh sách được tải. Tạo một khung nhìn cho một hàng bằng cách sử dụng phương thức getview của customadapter có nhiệm vụ tốn nhiều bộ nhớ cao. Đây là lý do khiến cho các nhãn của bạn bị xáo trộn. Viết cái nhìn thoáng qua về mã của bạn .. Có thể bạn sẽ nhận được giải pháp –

Trả lời

7

Android reuses quan điểm khá tích cực, và nó có thể là hơi một cái nhìn đã được sử dụng như một dòng địa chỉ email được tái sử dụng trên một hàng đó là nghĩa vụ để hiển thị một nhãn, và ngược lại.

Kết quả là bạn không thể dựa vào các giá trị "mặc định". Đặt padding, kiểu chữ, kích thước văn bản và màu nền của bạn trong mọi trường hợp:

if (item.equals("Name") || item.equals("Mobile") || item.equals("Home") || item.equals("Email") || item.equals("Address")) { 
    text.setBackgroundColor(0xFF575757); 
    text.setTextSize(15); 
    text.setTypeface(null, Typeface.BOLD); 
    text.setPadding(8, 5, 0, 5); 
} else { 
    text.setBackgroundColor(DEFAULT_BACKGROUND); 
    text.setTextSize(DEFAULT_TEXT_SIZE); 
    text.setTypeface(null, DEFAULT_TYPEFACE); 
    text.setPadding(15, 15, 0, 15); 
} 
+0

Điều đó có hiệu quả - cảm ơn. Không biết tại sao tôi không thử điều đó ... – oliverwhite

+0

"Hăng hái" là một thuật ngữ chính xác, tôi muốn nói! Gần đây tôi đã bị cắn bởi lỗi này - mà tôi sẽ gọi nó, trong Android. Có ý nghĩa khi họ sử dụng lại Chế độ xem ngoài màn hình dưới dạng Chế độ xem sắp xuất hiện trên màn hình, nhưng nhà phát triển đã định dạng lại các hàng trong getView() không thể dự kiến ​​sẽ biết điều này! Tuy nhiên, có lẽ ArrayAdapter hoặc SimpleAdapter không có ý nghĩa cho điều đó. – electromaggot

+1

Vì vậy, +1 trên bình luận của Marius! Một điều tôi sẽ đề nghị là để làm cho "saveFormat()" và "restoreFormat()" phương pháp để giữ lại các giá trị ban đầu của hàng ("mặc định" mà Marius đề cập đến). Điều này sẽ dễ dàng bảo trì trong tương lai, vì định dạng hàng sẽ luôn luôn mặc định ở một nơi trong XML. – electromaggot

4

Không cần làm gì cả. Tôi quá phải đối mặt với cùng một vấn đề và giải quyết nó như thế này:

Chỉ cần bên trong phương pháp getView thêm một dòng đầu tiên

convertView=null; 

It wont vẽ lại quan điểm ngay lập tức bị phá hủy nhưng thay vào đó sẽ tạo ra những cái mới mỗi lần dựa trên của bạn logic (thậm chí là lẻ hoặc bất kỳ điều gì)

+0

Điều này giải quyết vấn đề cho tôi nhưng làm cho listview cực kỳ laggy. –

+0

Dường như với tôi đây phải là câu trả lời đúng. Tôi đã không tụt hậu (nó không thực sự phức tạp, mặc dù). –

Các vấn đề liên quan