2010-05-26 33 views
9

Tôi đã triển khai Trình lập chỉ mục mục cho lớp Bộ điều hợp mở rộng BaseAdapter. Bây giờ cho lần ra mắt đầu tiên, Trình lập chỉ mục mục đang hiển thị lớp phủ chính xác. Nhưng khi nội dung của danh sách được cập nhật, phần Lớp phủ không được cập nhật và cung cấp cho ArrayOutOfBoundException. Đối với một sửa chữa những gì tôi đã làm là tôi đã thực hiện listview.setFastScrollEnabled (false); cập nhật nội dung bộ điều hợp; và sau đó listview.setFastScrollEnabled (true); Bây giờ điều gì xảy ra là lớp phủ được cập nhật nhưng Lớp phủ đang ở phía trên cùng bên trái của chế độ xem danh sách. Làm thế nào tôi có thể sửa lỗi này.Lớp chỉ mục mục không cập nhật khi thay đổi dữ liệu của bộ điều hợp

+0

Có cùng một vấn đề, chưa giải quyết được - Android 1.5 – tomash

+0

Tôi đã điền một lỗi 9054 http://code.google.com/p/android/issues/detail?id=9054 – tomash

Trả lời

1

một workaround nhỏ mà đã được đề xuất bởi lee.wilmot là

private void jiggleGrid() { 

      int newWidth = flag(FLAG_THUMB_PLUS) ? 
FrameLayout.LayoutParams.FILL_PARENT : 
        grid.getWidth() - 1; 

      FrameLayout.LayoutParams l = new FrameLayout.LayoutParams(
          newWidth, 
          FrameLayout.LayoutParams.FILL_PARENT 
     ); 

      grid.setLayoutParams(l); 

      toggleFlag(FLAG_THUMB_PLUS); 
    } 

cờ và toggleFlag là một số chức năng.

Gọi phương thức này sau khi đặt setFastScrollEnabled(true);. Nó làm việc cho tôi ....

+0

bạn có thể vui lòng cho biết bố cục như thế nào? Tôi có nghĩa là định nghĩa XML. Workaround không làm việc cho tôi. – tomash

+0

FLAG_THUMB_PLUS sẽ thực sự tuyệt vời khi biết – cV2

+0

Giải pháp này không hoạt động nếu chiều rộng được đặt thành FILL_PARENT. Nếu bạn thực hiện điều này, và sau đó nói, thay đổi hướng, chiều rộng được đặt không chính xác. –

8

nghĩ rằng tôi muốn chia sẻ một phiên bản làm sẵn của workaround trên cho một ListActivity:

private boolean FLAG_THUMB_PLUS = false; 
private void jiggleWidth() { 

    ListView view = getListView(); 
    if (view.getWidth() <= 0) 
     return; 

    int newWidth = FLAG_THUMB_PLUS ? view.getWidth() - 1 : view.getWidth() + 1; 
    ViewGroup.LayoutParams params = view.getLayoutParams(); 
    params.width = newWidth; 
    view.setLayoutParams(params); 

    FLAG_THUMB_PLUS = !FLAG_THUMB_PLUS; 
} 

trình cho tôi.

+0

CẢM ƠN CẢM ƠN THANKS CẢM ƠN :) – cV2

+0

Giải pháp này không hoạt động nếu chiều rộng được đặt thành FILL_PARENT. Nếu bạn thực hiện điều này, và sau đó nói, thay đổi hướng, chiều rộng được đặt không chính xác. –

+0

phao cứu sinh. cảm ơn – kevinl

0

Các giải pháp trên là ok trừ trường hợp khi chiều rộng được đặt thành FILL_PARENT. Để làm cho chúng hoạt động trong trường hợp này, bạn nên ghi đè lênSizeChanged như thế này

@Override 
protected void onSizeChanged (int w, int h, int oldw, int oldh) 
{ 
    super.onSizeChanged(w , h , oldw , oldh); 
    if (mInstance.getLayoutParams().width != FrameLayout.LayoutParams.FILL_PARENT) 
    { 
     mInstance.post(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       mInstance.setLayoutParams(new FrameLayout.LayoutParams(FrameLayout.LayoutParams.FILL_PARENT , FrameLayout.LayoutParams.FILL_PARENT)); 
      } 
     }); 
    } 
} 

Với kích thước sửa đổi này sẽ ổn sau khi thay đổi hướng màn hình.

5

Để làm cho nó hoạt động trong mọi trường hợp (đặc biệt với thay đổi định hướng và định hướng FILL_PARENT), thay vì sử dụng trực tiếp ListView, hãy sử dụng lớp này và gọi invalidateSectionIndexer() sau khi bạn đã thay đổi Bộ điều hợp.

class MyListView extends ListView { 
    public MyListView(Context context) { 
     super(context); 
    } 

    public void invalidateSectionIndexer() { 
     // 1. this invalidates the Section Indexer 
     super.setFastScrollEnabled(false); 
     // Your adapter might be wrapped, e.g. when adding headers/footers. 
     ListAdapter adapter = getAdapter(); 
     BaseAdapter baseAdapter = (adapter instanceof WrapperListAdapter) ? 
       (BaseAdapter) ((WrapperListAdapter) adapter).getWrappedAdapter() : 
       (BaseAdapter) adapter; 
     baseAdapter.notifyDataSetChanged(); 
     super.setFastScrollEnabled(true); 

     // 2. This fixes the android bug of section overlay not positioned correctly. 
     int width = getWidth(); 
     int height = getHeight(); 
     super.onSizeChanged(width, height, width, height); 
    } 
} 
0

Tôi gặp sự cố tương tự khi sử dụng ResourceCursorAdapter. Bộ chỉ mục phần không cập nhật sau khi bộ điều hợp mới được thiết lập cho danh sách hoặc phương thức swapCursor() để cập nhật con trỏ được gọi. Tôi đã thử tất cả các giải pháp được đăng trên StackOverflow mà không thành công. Chỉ workaround workaround mà tôi tìm thấy là bạn cần phải tách/đính kèm đoạn mà bạn muốn cập nhật (bạn cần kích hoạt onCreateView() phương thức phân đoạn nơi bạn xây dựng giao diện người dùng) sau khi cập nhật Cursor (không phải CursorAdapter .. bạn cần cập nhật/đặt bộ điều hợp trong onCreateView()). Điều này làm việc cho tôi. Đây là mã mà tôi sử dụng để gắn lại đoạn.

fragmentManager.beginTransaction().detach(frag).attach(frag).commitAllowingStateLoss(); 

Bạn cũng có thể thử xóa danh sách tương ứngXem từ bố cục và thêm nó vào bố cục lần nữa nhưng tôi gặp phải một số vấn đề khi sử dụng phương pháp này.

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