2012-11-22 40 views
22

Tôi chỉ cố gắng hiểu rõ hơn về mẫu sau tôi thường xuyên sử dụng để tối ưu hóa ListViewTại sao trong mẫu ViewHolder lớp ViewHolder nên tĩnh?

Chỉ đọc của tôi chỉ cho tôi biết lớp tĩnh bên trong được coi là lớp cấp cao nhất. Lợi ích của một điều như vậy so với một lớp thành viên (không tĩnh) là gì?

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    Comment comment = getItem(position); 
    ViewHolder holder; 
    if (convertView == null){ 
     holder = new ViewHolder(); 
     convertView = LayoutInflater.from(context).inflate(R.layout.mylayout, null); 
     holder.nickname = (TextView) ((ViewGroup) convertView).findViewById(R.id.nickname); 
     convertView.setTag(holder); 
    }else{ 
     holder = (ViewHolder) convertView.getTag(); 
    } 

    holder.nickname.setText(comment.getMember_nickname()); 
    CharSequence 
    return convertView; 
} 

public static class ViewHolder{ 
    TextView nickname; 
} 
+5

bởi vì nếu không, lớp học được liên kết với cá thể, điều này hoàn toàn không cần thiết. – njzk2

+0

@ njzk2: điều gì sẽ là nhược điểm? –

+0

@ Jan1337z nhược điểm là bạn có một thể hiện của đối tượng lớp cho mỗi trường hợp của bộ điều hợp của bạn nếu ViewHolder không phải là tĩnh. – njzk2

Trả lời

4

Một lợi ích của việc sử dụng lớp bên trong tĩnh, là lớp bên trong có thể được truy cập từ phương pháp tĩnh, không có trường hợp lớp ngoài.

Nếu lớp bên trong không tĩnh:

class MyOuter { 
    private int x = 7; 
    public void makeInner() { 
     MyInner in = new MyInner(); 
     in.seeOuter(); 
    } 
    class MyInner { 
     public void seeOuter() { 
      System.out.println("Outer x is " + x); 
     } 
    } 
} 

public static void main(String[] args) { 
    MyOuter mo = new MyOuter(); 
    MyOuter.MyInner inner = mo.new MyInner(); 
    inner.seeOuter(); 
} 

Nếu lớp bên trong là tĩnh:

class BigOuter { 
    static class Nest {void go() { System.out.println("hi"); } } 
} 

class Broom { 
    static class B2 {void goB2() { System.out.println("hi 2"); } } 
    public static void main(String[] args) { 
     BigOuter.Nest n = new BigOuter.Nest(); 
     n.go(); 
     B2 b2 = new B2(); 
     b2.goB2(); 
    } 
} 
+2

Tôi không chắc chắn nếu điều này hoàn toàn giải quyết các câu hỏi của mô hình ViewHolder ... –

+0

@ j0k NathanZ đã viết: "Bài đọc của tôi chỉ chỉ cho tôi thực tế là một lớp bên trong tĩnh được coi là lớp cấp cao nhất. lợi ích của một điều như vậy so với một lớp thành viên (không tĩnh)? " Câu trả lời của tôi không cần thiết ám chỉ đến mẫu ViewHolder, tôi vừa chỉ ra một trong những lợi ích của việc sử dụng lớp bên trong tĩnh trên không tĩnh. Theo như tôi có thể nói, câu hỏi được nhiều hơn về lợi ích của việc sử dụng các lớp bên trong tĩnh hơn là về mô hình ViewHolder. –

+0

@IllyesIstvan Tôi đoán bạn muốn trả lời Igor, không phải tôi :) – j0k

7

Ý kiến ​​của tôi là nó là tốt hơn để có lớp ViewHolder tĩnh như nó đã giành' t bị rò rỉ Adapter.

Nếu bộ điều hợp giữ lại một số Bộ sưu tập nặng hoặc thậm chí là Chế độ xem (tùy thuộc vào từng trường hợp cụ thể), sẽ tuyệt vời để kiểm soát đối tượng nào giữ lại Bộ điều hợp.

Có rất nhiều đối tượng của một lớp bên trong sẽ có các đối tượng đó tham chiếu đến Bộ điều hợp, do đó giữ lại nó. Bạn nên cẩn thận về cách các thẻ được quản lý (nếu các chế độ xem được xóa/xóa tự động thì không có vấn đề gì>).

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