2012-03-31 28 views
10

Lớp bên trong là Bộ điều hợp, lớp bên trong bên trong là Trình nghe. Làm thế nào để truy cập (che khuất) Adapter thành viên/phương pháp từ người nghe?Hai lớp lồng nhau ẩn danh lồng nhau đôi. Làm cách nào để có được các thành viên cấp lớp ẩn danh cấp 1?

list.setAdapter(new Adapter() { 
    public View getView() { 
    // ... 
    button.setListener(new Listener() { 
     public void onClick() { 
     Adapter.this.remove(item); 
     } 
    ); 
    } 
}); 

Thông thường để truy cập các lớp học viên bên ngoài, bạn chỉ cần nói Outer.this.member, nhưng trong trường hợp này nó đã cho tôi những lỗi sau (bằng cách sử dụng lớp học thực tế):

error: not an enclosing class: ArrayAdapter 

Vậy làm thế nào bạn có phải truy cập vào một thành viên lớp bên trong từ một lớp bên trong bên trong không? Tôi không thích nhiều lớp ẩn danh lồng nhau, nhưng trong trường hợp này tôi đang học một API mới và không chắc chắn về một cách rõ ràng hơn. Tôi đã có một workaround nhưng muốn biết anyways. remove() không thực sự bị che khuất bởi lớp bên trong để chỉ định lớp không thực sự cần thiết trong trường hợp này, nhưng muốn làm cho nó rõ ràng trong mã chính xác nơi phương thức remove() này là. Tôi cũng muốn biết trong trường hợp nó bị che khuất. Tôi tin rằng việc sử dụng Outer.$6.remove() sẽ hiệu quả, nhưng tôi cũng không tin nó cũng như vậy.

Trả lời

12

Gán this cho một biến, sau đó truy cập rằng một trong những lớp trong cùng.

list.setAdapter(new Adapter() { 
    public View getView() { 
    final Adapter that = this; 
    button.setListener(new Listener() { 
     public void onClick() { 
     that.remove(item); 
     } 
    ); 
    } 
}); 

Tôi không chắc chắn điều gì sẽ là một tên tốt ở đây. Có lẽ adapter?

+0

Tôi hiểu. Tôi nghĩ rằng sẽ có một cú pháp ngôn ngữ để sử dụng để có được ở Adapter mà tôi không biết. BTW 'that' sẽ phải là cuối cùng. – Chloe

+1

Tôi thích phương pháp này vì nó dễ đọc và rõ ràng. – skrat

+0

Tôi nhận được một lỗi biên dịch trên dòng Adapter = Adapter.this; (Adapter không phải là một lớp kèm theo). Thay vào đó, bạn nên nói rằng cuối cùng Adapter rằng = này .. nếu ở tất cả .. – sethu

0

đơn giản như thế này của mình: cố gắng outer.remove mà không cần con trỏ lớp này

+0

Điều đó sẽ không hoạt động. remove() không phải là một phương thức của Outer. Nó là một phương pháp của Adapter. – Chloe

1

Chỉ cần gọi phương thức trên Adaptor trực tiếp:

list.setAdapter(new Adapter() { 
    public View getView() { 
    // ... 
    button.setListener(new Listener() { 
     public void onClick() { 
     remove(item); // <-- this will call Adapter's method of the anonymous class 
     } 
    ); 
    } 
}); 
+2

Tôi biết điều đó. Nhưng nếu Listener có phương thức remove(). Rồi sao? – Chloe

+1

Câu hỏi hay! Tôi sẽ xem xét nó tối nay. – Bohemian

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