2013-06-12 60 views
9

tôi đã cảnh báo sau đây:Tuỳ chỉnh xem là mất tích xây dựng được sử dụng bởi các công cụ để chuyển đổi

xem Tuỳ chỉnh com/example/xem/adapter/SomeAdapter thiếu constructor được sử dụng bởi các công cụ: (Bối cảnh) hoặc (Context , AttributeSet) hoặc (Context, AttributeSet, int)

trong SomeAdapter lớp học của tôi mà kéo dài một số BaseAdapter kéo dài ArrayAdapter

public class SomeAdapter extends BaseAdapter{} 
public abstract class BaseAdapter extends ArrayAdapter<SomeModel>{} 

Cảnh báo tồn tại trong bộ điều hợp cụ thể nhưng không có trong BaseAdapter trừu tượng. Có ai từng nghe về cảnh báo này trong ngữ cảnh đó không?

AFAIK Android kiểm tra các lớp học vì họ đang mở rộng quan điểm bằng cách kiểm tra tên của các lớp siêu qua ViewConstructorDetector:

private static boolean isViewClass(ClassContext context, ClassNode node) { 
    String superName = node.superName; 
    while (superName != null) { 
     if (superName.equals("android/view/View")    //$NON-NLS-1$ 
       || superName.equals("android/view/ViewGroup") //$NON-NLS-1$ 
       || superName.startsWith("android/widget/")  //$NON-NLS-1$ 
       && !((superName.endsWith("Adapter")    //$NON-NLS-1$ 
         || superName.endsWith("Controller")  //$NON-NLS-1$ 
         || superName.endsWith("Service")   //$NON-NLS-1$ 
         || superName.endsWith("Provider")  //$NON-NLS-1$ 
         || superName.endsWith("Filter")))) {  //$NON-NLS-1$ 
      return true; 
     } 

     superName = context.getDriver().getSuperClass(superName); 
    } 

    return false; 
} 

Theo như tôi có thể nhìn thấy tên lớp học của tôi không phù hợp với mô hình trên. Có ai có ý tưởng làm thế nào để sửa chữa hoặc ngăn chặn cảnh báo này?

getView() trong BaseAdapter:

@Override 
public final View getView(final int position, final View convertView, final ViewGroup parent) { 
    View view = convertView; 
    if (null == view) { 
     view = createNewView(parent, position); 
    } else { 
     reuseOldView(view, position); 
    } 
    return view; 
} 
+0

Điều gì sẽ thực hiện bộ điều hợp của bạn? Bạn có chế độ xem tùy chỉnh không? – Neil

+0

Không, tôi không thực hiện bất cứ điều gì. Chỉ cần mở rộng ArrayAdapter. – salcosand

+0

cho mục đích gì? Bộ điều hợp không thể tự hoạt động. Bạn muốn sử dụng nó để làm gì? – Neil

Trả lời

8

Trong lớp CustomView bạn thêm cấu trúc:

public CustomView(Context context) { 
    super(context); 
} 
public CustomView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 
+0

Tôi không có bất kỳ CusonView nào. Tôi chỉ có Adapters của tôi. Và ArrayAdapter không cung cấp các nhà xây dựng như vậy. – salcosand

+0

Bạn có thể đăng phương thức getView() từ bộ điều hợp của mình không? Cảm ơn – Jarvis

+0

Tôi không chắc chắn điều này tốt cho điều gì, nhưng ở đây bạn đi. GetView() được thực hiện trong BaseAdapter nhưng không được thực hiện trong SomeAdapter, nơi cảnh báo là. – salcosand

3

Một số công cụ bố trí (ví dụ như bố trí biên tập Android cho Eclipse) cần phải tìm một nhà xây dựng với một trong các chữ ký sau: * View(Context context) * View(Context context, AttributeSet attrs) * View(Context context, AttributeSet attrs, int defStyle)

Nếu bạn không sử dụng những thứ đó, và chỉ muốn thoát khỏi cảnh báo này cho tất cả các dự án của bạn chỉ cần vào:

Window -> Preferences -> Android -> Kiểm tra Lint Lỗi.

Tìm ViewConstructor từ danh sách và thiết lập các mức độ nghiêm trọng đến 'bỏ qua'.

+0

Điều này có ảnh hưởng đến trình chỉnh sửa bố cục không? Những gì tôi không hiểu là tại sao Lint nghĩ rằng bộ điều hợp của tôi là một cái nhìn. – salcosand