2011-10-11 28 views
14

Tôi đang sử dụng Thư viện với ImageAdapter để tải nó bằng ImageViews để kéo hình ảnh ra khỏi tài nguyên của tôi. Vấn đề của tôi là convertView được chuyển tới phương thức getView() trong bộ điều hợp của tôi luôn là null. Điều này có nghĩa là một ImageView mới được tạo ra và mỗi khi getView() được gọi. Điều này dẫn đến hiệu suất kinh khủng bởi vì GC liên tục chạy để xóa sạch tất cả những thứ này được tạo ra và không còn sử dụng ImageView nữa.Gallery ImageAdapter convertView luôn là số

Đây rõ ràng là lỗi đã biết: Gallery's view cache is broken; never converts views..

Hai giải pháp ưu tiên của tôi là 1. xử lý bộ nhớ cache của chế độ xem trong chính bộ điều hợp và quản lý tất cả logic cần thiết để sử dụng lại chúng đúng cách. hoặc 2. bao gồm một bản sao của tiện ích Thư viện của riêng tôi và cố gắng khắc phục nó để nó trả về các chế độ xem tái chế một cách chính xác.

Tôi đã bắt đầu triển khai tùy chọn nhưng tôi nhanh chóng nhận ra rằng tôi không biết chính xác cách tạo tất cả logic đằng sau thao tác đó. Tôi bắt đầu nghĩ rằng lựa chọn hai có thể dễ dàng hơn.

tôi đã tìm thấy mã cho widget Gallery ở đây: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.1_r2/android/widget/Gallery.java

tôi không hoàn toàn hiểu điều đó, nhưng tôi có thể thấy rằng nó đang kêu gọi

child = mAdapter.getView(position, null, this); 

on line 745. My (bắn trong bóng tối) đoán rằng đây là gốc rễ của vấn đề.

Có ai có kinh nghiệm về lỗi này không. Hoặc bất cứ ai có thể chỉ cho tôi đi đúng hướng để tìm ra cách tình hình tái chế hoạt động để tôi có thể tinh chỉnh widget này để hoạt động chính xác? Hoặc thậm chí đề xuất một số lựa chọn thay thế mà tôi có thể được nhìn ra.

EDIT: Giải pháp tốt nhất mà tôi từng tìm thấy là triển khai được gọi là EcoGallery. Nơi duy nhất tôi có thể tìm thấy tham chiếu đến nó online anymore is here. Để làm cho nó hoạt động, bạn phải đặt từng đoạn từ đó vào đúng vị trí trong dự án của bạn.

+0

Có thể giúp http://stackoverflow.com/questions/10769989/how-do-i-get-the-selected-item-from-a-gridview-with-imageadapter-android –

Trả lời

3

Không có kinh nghiệm với lỗi đó đặc biệt, nhưng tôi đã thực hiện bộ nhớ đệm tùy chỉnh trước đó với máy nhắn tin xem bên thứ 3 (trước lib hỗ trợ).

Thực sự không quá khó khăn một cách trung thực. Trong trường hợp của tôi, tôi biết sẽ có nhiều nhất một mục trên màn hình. Nhưng tôi cũng muốn các mục bên trái và bên phải để được tải trước (đây là những trang web xem xét kéo dữ liệu ra khỏi mạng). Vì vậy, tôi có một mảng đơn giản gồm 3 chế độ xem.

[V1, V2, V3] 

Bây giờ điều duy nhất bạn cần làm là tương quan vị trí trong bộ điều hợp với vị trí trong bộ nhớ cache của bạn. Có nhiều cách bạn có thể giải quyết vấn đề này. Khi tôi lần đầu tiên đẩy nó ra, tôi chỉ cần thực hiện bất cứ điều gì quan điểm hiện tại của tôi là V2 và xoay các mục của mảng xung quanh khi lật máy nhắn tin. Vì vậy, lật sang chế độ xem tiếp theo sẽ thay đổi mảng của tôi

[V2, V3, V1] 

Rất đơn giản để theo kịp. Hoặc bạn chỉ có thể làm toán và tính toán một vị trí đến vị trí tương đối của bộ nhớ cache.

Một cách tiếp cận khác là tạo hàng đợi trong, hàng đầu tiên. Tái chế các khung nhìn bằng cách đẩy chúng vào hàng đợi, và khi bạn cần một khung nhìn, chỉ cần bật một khung nhìn từ nó.

+0

Tôi đã thử một lúc với đối tượng Queue để giữ các khung nhìn cho tôi. Không bao giờ làm việc đó, nhưng tôi đồng ý rằng có thể thực hiện theo cách đó =) – FoamyGuy

+0

sử dụng mảng xem để lưu vào chế độ xem của bạn và 'cachePos = position% VIEW_CACHE_SIZE' – shaobin0604

1

Tôi không có kinh nghiệm với tiện ích Thư viện, nhưng tôi đang sử dụng nhiều ListView có hình ảnh.Theo vấn đề của bạn và liên kết tới vấn đề của Google, họ vẫn chưa khắc phục được sự cố này.

Vì vậy, có solutio với thư viện đẹp (và các ví dụ bên trong nó), giải quyết vấn đề bộ nhớ cache/ajax, và nhiều hơn nữa.

Liên kết đến library

hay, cụ thể hơn, liên kết đến hình ảnh examples

Nếu bạn tải về tấm gương đó, bạn sẽ tìm thấy cách họ thực hiện bộ sưu tập với widget Gallery, sử dụng lớp tiện ích AQuery của họ trong

com.androidquery.test.image.ImageLoadingGalleryActivity lớp học.

Snippet từ mã:

final List<Photo> entries;// here only to show what enteries are... 

    listAq = new AQuery(this); //define as Action class member, here only to show what it is 

    ArrayAdapter<Photo> aa = new ArrayAdapter<Photo>(this, R.layout.gallery_item, entries){ 

     public View getView(int position, View convertView, ViewGroup parent) { 

      if(convertView == null){ 
       convertView = getLayoutInflater().inflate(R.layout.gallery_item, parent, false); 
      } 

      Photo photo = getItem(position); 

      AQuery aq = listAq.recycle(convertView); 

      aq.id(R.id.name).text(photo.title); 

      String tbUrl = photo.tb; 

      if(!aq.shouldDelay(position, convertView, parent, tbUrl)){ 
       aq.id(R.id.tb).image(tbUrl); 
       aq.id(R.id.text).text(photo.title).gone(); 
      }else{ 
       aq.id(R.id.tb).clear(); 
       aq.id(R.id.text).text(photo.title).visible(); 
      } 


      return convertView; 

     } 


    }; 

    aq.id(R.id.gallery).adapter(aa); 

đâu Ảnh chỉ là POJO đối tượng (lấy từ xa):

class Photo { 
    String tb; 
    String url; 
    String title; 
    String author; 
} 

R.id.gallery đề cập đến

<Gallery 
     android:id="@+id/gallery" 
     android:layout_width="fill_parent" 
     android:layout_height="200dip" /> 

R.layout.gallery_item đề cập đến:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="100dip" 
     android:layout_height="75dip" > 

     <ProgressBar 
      android:id="@+id/progress" 
      android:layout_width="15dip" 
      android:layout_height="15dip" 
      android:layout_centerInParent="true" /> 

     <ImageView 
      android:id="@+id/tb" 
      style="@style/GalleryItem" 
      android:layout_width="100dip" 
      android:layout_height="75dip" /> 

     <TextView 
      android:id="@+id/text" 
      android:layout_width="100dip" 
      android:layout_height="75dip" 
      android:gravity="center" 
      android:maxLines="4" 
      android:padding="15dip" 
      android:text="Dummy TextDummy TextDummy TextDummy TextDummy Text" 
      android:textColor="#FFFFFFFF" 
      android:textSize="8sp" /> 

    </RelativeLayout> 

Hy vọng bạn sẽ thấy thư viện này hữu ích trong việc giải quyết vấn đề của mình.

0

Tôi đã giải quyết vấn đề này bằng cách sử dụng bộ nhớ cache tùy chỉnh như dskinner đề xuất.

Tôi tính trước (độ rộng màn hình/độ rộng của mục) tối đa # mục có thể hiển thị trong thư viện trên màn hình cùng một lúc và thêm một vài mục khác (thư viện sẽ cần thêm để hiển thị các mục ở bên trái và ngay khi bạn cuộn qua nó). Tôi tạo một mảng có kích thước này - các khung nhìn được tạo theo yêu cầu và được đặt trong bộ nhớ cache. Sử dụng vị trí% cachesize để tìm ra chế độ xem được lưu trong bộ nhớ cache nào cần trả về khi getView được gọi.

+0

mẫu mã nhỏ hoặc liên kết đến một số mã/gist giúp đỡ rất nhiều ở đây. – iwein

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