2011-02-09 38 views
12

Hoạt động của tôi bao gồm GridView chứa hơn 40 thành phần. Sau khi bắt đầu hoạt động, người dùng có thể thấy tối đa 15 mục (3 hàng, 5 mục trong mỗi hàng). Tôi đã viết trong getView() cơ thể để vượt qua với số LogCat nhận xem:Nhiều cuộc gọi getView() trong GridView

Log.i("getView()", "GETTING VIEW_POSITION[" + String.valueOf(position) + "]" + (convertView != null?convertView.toString():"null")); 

Sau khi khởi chạy ứng dụng của tôi, tôi có được đăng nhập như:

02-09 14:34:56.900: INFO/getView()(388): GETTING VIEW_POSITION[0]null 
02-09 14:34:57.300: INFO/getView()(388): GETTING VIEW_POSITION[0][email protected] 
02-09 14:34:57.300: INFO/getView()(388): GETTING VIEW_POSITION[1]null 
02-09 14:34:57.400: INFO/getView()(388): GETTING VIEW_POSITION[2]null 
02-09 14:34:57.510: INFO/getView()(388): GETTING VIEW_POSITION[3]null 
02-09 14:34:57.620: INFO/getView()(388): GETTING VIEW_POSITION[4]null 
02-09 14:34:57.720: INFO/getView()(388): GETTING VIEW_POSITION[5]null 
02-09 14:34:57.840: INFO/getView()(388): GETTING VIEW_POSITION[6]null 
02-09 14:34:57.930: INFO/getView()(388): GETTING VIEW_POSITION[7]null 
02-09 14:34:58.273: DEBUG/dalvikvm(388): GC freed 3530 objects/322744 bytes in 270ms 
02-09 14:34:58.280: INFO/getView()(388): GETTING VIEW_POSITION[8]null 
02-09 14:34:58.300: INFO/getView()(388): GETTING VIEW_POSITION[9]null 
02-09 14:34:58.320: INFO/getView()(388): GETTING VIEW_POSITION[10]null 
02-09 14:34:58.340: INFO/getView()(388): GETTING VIEW_POSITION[11]null 
02-09 14:34:58.360: INFO/getView()(388): GETTING VIEW_POSITION[12]null 
02-09 14:34:58.380: INFO/getView()(388): GETTING VIEW_POSITION[13]null 
02-09 14:34:58.400: INFO/getView()(388): GETTING VIEW_POSITION[14]null 
02-09 14:34:59.220: INFO/getView()(388): GETTING VIEW_POSITION[0]null 
02-09 14:34:59.490: INFO/getView()(388): GETTING VIEW_POSITION[0][email protected] 

Tôi cũng đỏ this bài về loại đó của vấn đề . Nhưng chiều cao GridView của tôi trong mô tả XML thiết lập như điền mẹ:

<?xml version="1.0" encoding="utf-8"?> 

<GridView xmlns:android="http://schemas.android.com/apk/res/android" 
       android:id="@+id/grid" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent" 
       android:numColumns="auto_fit" 
       android:horizontalSpacing="10dp" 
       android:verticalSpacing="10dp" 
       android:columnWidth="140dp" 
       android:gravity="center" 
       android:scrollbars="none" 
       /> 

Và cuối cùng để loại bỏ tất cả những nghi ngờ, đây là mã Adaptor của tôi:

public class ImageAdapter extends BaseAdapter 
    { 
     private Activity activity; 
     private LayoutInflater inflater = null; 
     private ArrayList<Photo> photoes; 

     public ImageAdapter(Activity a, ArrayList<Photo> pictures) 
     { 
      photoes = pictures; 
      activity = a; 
      inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) 
     { 
      Log.i("getView()", "GETTING VIEW_POSITION[" + String.valueOf(position) + "]" + (convertView != null?convertView.toString():"null")); 
       View mViewSlice = convertView; 
       if(convertView == null) { 
        mViewSlice = inflater.inflate(R.layout.photo_preview, null); 
        ((TextView) mViewSlice.findViewById(R.id.name_of_photo)).setText(photoes.get(position).getName()); 

        mViewSlice.setPadding(5, 5, 5, 5); 
        mViewSlice.setLayoutParams(new GridView.LayoutParams(-2, -2)); 

       } 



       return mViewSlice; 
     } 

     @Override 
     public int getCount() { 
      return photoes.size(); 
     } 

     @Override 
     public Object getItem(int position) { 
      return photoes.get(position); 
     } 

     @Override 
     public long getItemId(int position) { 
      return position; 
     } 
    } 

Tôi hy vọng ai đó sẽ trả lời tại vấn đề của tôi và sẽ giúp tôi giải quyết nó.

Đang chờ đề xuất của bạn. Alex.

+1

Câu hỏi của bạn là gì? –

Trả lời

10

Câu trả lời vào liên kết đó nếu khá rõ ràng tôi nghĩ

Có hoàn toàn không có sự bảo đảm về số lần getView() sẽ được gọi cho bất kỳ vị trí nhất định

Bây giờ này nhận xét cũng ngụ ý bạn không nên sử dụng wrap_content

thường xảy ra với danh sách và lưới có chiều cao được đặt thành wrap_content

Nhưng điều đó không có nghĩa là nó sẽ không xảy ra cho các tình huống khác. Lỗi đã được đóng thành "WorkingAsIntended", vì vậy tôi không nghĩ rằng bạn có thể làm quá nhiều. Nó chỉ là một cái gì đó có thể xảy ra.

+1

Romain nói cho bất kỳ vị trí cụ thể nào. Nhưng tôi chắc chắn, rằng tôi không phải là người đầu tiên tìm thấy vấn đề này chỉ áp dụng cho vị trí đầu tiên trong GridView. Và tôi lặp lại một lần nữa, như bạn có thể thấy từ XML của tôi, tôi không sử dụng wrap_content. – teoREtik

+0

Những gì tôi có nghĩa là để nói là mặc dù có đề cập đến wrap_content, không có đề cập đến một cái gì đó như thế ** không bao giờ ** xảy ra với fill_parent. Vì vậy, không cần phải lặp lại những gì bạn nói, tôi đã có bạn lần đầu tiên. Tôi chỉ không đồng ý rằng nó quan trọng: D. Bây giờ tại sao nó chỉ là vị trí đầu tiên tôi không biết, nhưng vị trí đầu tiên là một phần của "bất kỳ vị trí nhất định nào". Vì vậy, khi tôi đọc câu trả lời, hành vi của nó vẫn như mong đợi. – Nanne

+0

Bạn có thể giải thích, ý của bạn là gì khi nói, vị trí đầu tiên là một phần của bất kỳ vị trí cụ thể nào? – teoREtik

-6

tôi đã cùng một vấn đề, giải pháp của tôi là tạo ra một danh sách bên ngoài Adapter, sau đó cung cấp danh sách để Adapter, một cái gì đó như thế:

class MyAdapter extends BaseAdapter{ 

    List<View> views; 

    public MyAdapter(List<View> views){ 
     this.views = views; 
    } 

    ... 

    public View getView(int position, View convertView, ViewGroup parent){ 
     return views.get(position);  // now your safe even if element[0] is called n times 
    } 
} 

class MyActivity extends Activity{ 

    GridView grid; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     List<View> views = create_your_views(): 

     MyAdapter adapter = new MyAdapter(views); 

     grid.setAdapter(adapter);   
    } 
} 
+1

Đây chỉ là cách thông thường bạn đặt dữ liệu trong bộ điều hợp và không có bất kỳ mối quan hệ nào với vấn đề được mô tả. – Ixx

6

Đối với tôi, nó thậm chí còn tồi tệ hơn: vị trí 0 là thường được gọi là 10 lần. Và nó được gọi ngay cả khi tôi ở cuối danh sách, không có vị trí 0 trên màn hình.

Giải pháp của tôi là một ArrayList tĩnh của các mục hiện đang được xử lý để hiển thị và tôi bỏ qua các cuộc gọi kép đó. Nó không phải là giải pháp tốt nhất mặc dù nó vẫn sử dụng tài nguyên để có được vị trí 0 trong khi nó thậm chí không có trên màn hình.

Vì nó có vẻ như một lỗi, tôi nghĩ rằng tôi sẽ lưu trữ một chế độ xem cho vị trí 0 để nó có được giá trị trả về nhanh và thích hợp ngay cả khi vị trí không có trên màn hình.

Android 4.2.2.

+0

Sau đó, bạn may mắn, trong trường hợp của tôi được gọi là 33 lần cho vị trí 0. Tôi sẽ thực hiện bộ nhớ cache cho xem 0, như bạn đã nói. – Corbella

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