2011-01-24 31 views
13

tôi đang làm việc trên một ứng dụng Android, và khi tôi cố gắng để hiển thị một lượng lớn dữ liệu trong một listview, tôi nhận được lỗi sau:"Observer ... đã không được đăng ký" lỗi

01-24 18:06:32.214: 
INFO/System.out(9244): 
    EX:Observer [email protected] 
    was not registered. 
+1

Bất kỳ may mắn với điều này? Im có cùng một vấn đề. Tôi không chắc tại sao outis lại yêu cầu bạn chấp nhận bất kỳ câu trả lời nào ở đây khi không có câu trả lời: s – odiggity

Trả lời

13

i cũng có lỗi này.
trong trường hợp của tôi là ngoại lệ này (Observer * không được đăng ký.) Bị ném, vì tôi gọi

setAdapter(Adapter) 

nhiều lần.

ví dụ:

MyAdapter (extends BaseAdapter) vla; 
ListView lv; 

for (int i = 0; i < 2; i++) { 
    vla.clear(); 
    vla.add(tv); 
    lv.setAdapter(vla); 
} 

Việc sửa chữa ở đây là để đặt
v.setAdapter(vla);
bên ngoài vòng lặp, do đó tránh được nhiều cuộc gọi.

sau khi khắc phục không có ngoại lệ ném nữa.
Trân trọng, lũ lụt. (fldr atincircle mail dot ru)

+6

cách bạn khắc phục vấn đề này? –

1

Tôi đã gặp sự cố này nhiều lần khi xử lý danh sách xem. Nếu bạn đang sử dụng bộ điều hợp tùy chỉnh với văn bản chỉnh sửa có liên quan, bạn sẽ muốn thực hiện clearFocus() trước khi bạn làm mới bộ điều hợp. Observer không đăng ký là do listview xóa một đứa trẻ đã tập trung vào các hoạt động

Làm thế nào tôi làm điều đó: này là người giữ quan điểm cho bộ chuyển đổi tùy chỉnh của tôi

class viewHolder { 
    public viewHolder() { 
     views = new ArrayList<viewInfo>(); 
    } 

    public int position; 
    public ArrayList<viewInfo> views; 
    public View view; 
} 

Sau đó tôi gọi một unfocusAll () trong đó bao gồm:

public void unFocusAll() { 
    viewHolder holder = (viewHolder) v.getTag(); 
     if (holder != null) { 
      holder.view.clearFocus(); 
     } 
} 

Vì vậy, trước khi bạn gọi listview của bạn, bạn phải làm

CustomAdapter aa = new CustomAdapter(); 
if (aa != null) { 
    aa.unFocusAll(); 
} 
+0

Tôi e rằng các ví dụ mã của bạn không rõ ràng lắm. Trong hàm unFocusAll() của bạn, v là gì? Ngoài ra, là unFocusAll một phương pháp của CustomAdapter? Tại sao bạn thậm chí cần lớp viewHolder? –

0

Tôi đã có vấn đề này ngày hôm nay quá và câu trả lời của lũ đã giúp tôi giải quyết nó. Trong trường hợp của tôi, lỗi sẽ xuất hiện bất cứ khi nào tôi chuyển trở lại ứng dụng của mình từ một ứng dụng khác, do đó, phương thức setAdapter được gọi là allways được gọi hai lần.

này đã giúp tôi tránh nó:

if (pager.getAdapter() == null){ 
    pager.setAdapter(pagerAdapter); 
} 

Cảm ơn!

1

Tôi phải đối mặt với cùng một vấn đề và hóa ra đó là vấn đề về luồng. Nhiều chủ đề đang gọi setAdapter mà dường như không phải là chủ đề an toàn. Sau khi đảm bảo rằng tất cả các cuộc gọi setAdapter được thực hiện trên cùng một luồng, sự cố đã được giải quyết.

gì làm việc độc đáo đối với tôi, là để buộc mã của tôi để thay đổi nó chỉ trên thread UI:

runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       final RecyclerView recyclerView = (RecyclerView) findViewById(R.id.rc_view); 
       recyclerView.setAdapter(new MyAdapter(items)); 
      } 
     }); 
+0

Tôi cũng đã sửa nó bằng cách chạy trên chuỗi ui. Chỉ cần di chuyển mã của tôi bên trong hàm run() {} – lxknvlk

0

tại mảnh chứa ViewPager
@ Override
public void onDestroyView() {
siêu.onDestroyView();
viewDestroyed = true;
}

sau đó trước khi bạn đặt việc kiểm tra bộ chuyển đổi
if (viewDestroyed)
pager.setAdapter (adapter)

Trân

0

Đơn giản chỉ cần override trong adapter của bạn onGroupCollapsed.

Thêm vào bộ chuyển đổi của bạn:

@Override 
public void onGroupCollapsed(int groupPosition) { 

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