2011-06-22 42 views
30

Tôi có LinearLayout với hướng dọc là phụ huynh, tôi muốn thêm một số chế độ xem theo chương trình nhiều lần vào cha mẹ này. Ngay bây giờ tôi đang thổi phồng đứa trẻ mỗi khi nhận được các tham chiếu mới cho mọi phần tử giao diện người dùng trước khi thêm vào cha mẹ. Điều này dường như không hiệu quả lắm, có cách nào tốt hơn để làm điều này không.Cách thêm cùng một chế độ xem cho cha mẹ nhiều lần bằng cách tăng nó chỉ một lần

Mã hiện tại tôi đang sử dụng ở bên dưới, Nếu tôi chỉ thổi phồng một lần trước đó cho vòng lặp, tôi nhận được lỗi thời gian chạy ", anh ta đã chỉ định trẻ đã có cha/mẹ trước tiên bạn phải gọi removeView().

 LayoutInflater inflator = LayoutInflater.from(getBaseContext()); 
     LinearLayout parentPanel = findViewById(R.id.parent_pannel); 

     ArrayList<String> myList = getData(); 
     for(String data : myList) { 
      // inflate child 
      View item = inflator.inflate(R.layout.list_item, null); 
      // initialize review UI 
      TextView dataText = (TextView) item.findViewById(R.id.data); 
      // set data 
      dataText.setText(data); 
      // add child 
      parentPanel.addView(item); 
     } 
+0

Tôi đồng ý, sẽ thật ngọt ngào nếu có cách dễ dàng để "sao chép" lượt xem, nhưng tôi vẫn chưa tìm thấy. Thổi phồng hơn và hơn nó là. Tuy nhiên, tôi phải nói rằng từ đoạn mã của bạn, có vẻ như với tôi rằng bạn muốn sử dụng một 'ListView'. – dmon

+0

Tôi e rằng điều này là do thiết kế. Bạn không thể có nhiều cha mẹ cho một chế độ xem, cũng như thêm cùng một chế độ xem cho cha mẹ nhiều lần. Nó sẽ khá khó để viết mã lỗi cho ViewGroups (và kịch bản tương tự) nếu điều này không phải như vậy. – inazaruk

+0

@dmon Tôi không thiết kế bố cục của mình để sử dụng ListView vì nó sẽ làm cho mã phức tạp hơn vì cách tôi muốn mọi thứ được sắp xếp. Tôi đoán cho hiệu quả tôi phải di chuyển tất cả mọi thứ để ListView. – mkso

Trả lời

4

Tôi không chắc chắn những gì bạn xem là nhưng bạn đã tạo ra nó bằng tay qua lạm phát XML:

ArrayList<String> myList = getData(); 
    for(String data : myList) { 

     LinearLayout layout = new LinearLayout(this); 
     layout.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,    LayoutParams.WRAP_CONTENT)); 
     TextView textView = new TextView(this); 
     textView.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); 

     textView.setText(data); 

     layout.addChild(textView);   

     parentPanel.addView(layout); 
    } 

Nhưng yeah bạn cố gắng rõ ràng cái gì đó đã được thực hiện cho bạn với Simple ListView & API

28

Bạn có thực sự kiểm tra xem có tăng chậm không? Theo tôi biết, việc tăng lượt xem rất nhanh (gần như nhanh chóng bằng cách tạo chế độ xem theo cách thủ công).

Có thể bạn sẽ ngạc nhiên khi nghe nhưng thổi phồng trên thực tế không phân tích cú pháp XML. Các XML cho bố cục được phân tích cú pháp và xử lý trước tại thời gian biên dịch - chúng được lưu trữ dưới dạng nhị phân khiến cho lạm phát xem rất hiệu quả (đó là lý do tại sao bạn không thể tăng lượt xem từ XML được tạo ra khi chạy).

+1

ty thú vị! – Blundell

+3

https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/view/LayoutInflater.java dòng 424 – Teodor

+0

Tôi không đồng ý về điều đó, trong thời gian các hoạt động của tôi hoặc các sáng tạo mảnh vỡ, lạm phát XML luôn là thứ đòi hỏi thời gian dài nhất, đó là lý do tại sao tôi cố gắng giữ cấu trúc bố cục càng đơn giản càng tốt. –

4

Thổi phồng nhiều lần không thể thực hiện giống như cách thực hiện trong một lần chụp. Hy vọng tác phẩm này

LayoutInflater inflator = (LayoutInflater).getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    LinearLayout parentPanel = findViewById(R.id.parent_pannel); 

    ArrayList<String> myList = getData(); 
    for(String data : myList) { 
     // inflate child 
     View item = inflator.inflate(R.layout.list_item, null); 
     // initialize review UI 
     TextView dataText = (TextView) item.findViewById(R.id.data); 
     // set data 
     dataText.setText(data); 
     // add child 
     parentPanel.addView(item); 
    } 

này sẽ làm việc, tại ít nhất làm việc cho tôi

+0

Làm việc cho tôi cũng như với View v = inflater.inflate (R.layout.list_item, parent, false) theo sau bằng cách gọi addView (v). Hình như thổi phồng (...) có thể có một tối ưu hóa để không đính kèm nếu nó đã có. –

+0

bạn có thể gợi ý cho tôi điều gì đó không nếu tôi phải thêm tự động xem giống như ở trên bên trong hàng xem của người tái chế –

5

Bạn không thể, ngay cả khi bạn cố gắng để tạo ra một new view từ đối tượng cũ view đối tượng sẽ được thông qua tham khảo không phải là giá trị, và do đó bạn sẽ nhận được Ngoại lệchildAlreadyHasParent và do đó, cách duy nhất là đặt view vào số for loop với số lần bạn muốn tăng cao và vòng lặp này phải chứa tạo quy trình từ beginni ng không chỉ các dòng thổi phồng.

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