2013-04-25 22 views
9

Tôi đang tạo một ứng dụng danh sách liên lạc bằng Fragments trong đó một frag là danh sách các tên trong danh sách liên lạc và phần còn lại là các chi tiết còn lại.Refreshing ArrayAdapter onResume [notifyDataSetChanged() không hoạt động]

Đây là lớp học mà sẽ hiển thị danh sách các tên

public class MyListFragment extends ListFragment { 

private ContactStorage contactStorage = new ContactStorage(); 

public final static String TAG = "FRAGMENTS"; 
private MainActivity parent; 
ArrayAdapter<String> adapter; 

ArrayList<String> entries = new ArrayList<String>(); 

String array[]; 

public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 

    View v = inflater.inflate(R.layout.list_layout, null); 
    parent = (MainActivity) getActivity(); 
    entries = contactStorage.getContactListNames(); 

    adapter = new ArrayAdapter<String>(getActivity().getApplicationContext(), 
      android.R.layout.simple_list_item_1, entries); 

    setListAdapter(adapter); 
    Log.d(TAG, "Adapter created"); 
    array = contactStorage.getContactDetails(); 
    return v; 

} 

@Override 
public void onResume() { 

    super.onResume(); 
    entries = contactStorage.getContactListNames(); 
    adapter.notifyDataSetChanged(); 
    Log.d(TAG, "List Frag Resumed"); 

} 
} 

Vấn đề tôi đang gặp là ArrayAdapter không làm mới trên sơ yếu lý lịch.

Khi màn hình được xoay, tiền phạt của nó như onCreateView() được chạy lại, nhưng tôi cần nó để làm mới trênResume. Tôi đã nhìn qua trang web này tải và tìm thấy gì, nhưng "sử dụng notifyDataSetChanged()" mà không hoạt động.

+0

Vâng, những gì bạn mong đợi? Bạn đang truy xuất 'mục' nhưng không tạo lại' bộ điều hợp' của mình.Di chuyển hai dòng 'entires =' và 'adapter =' từ 'onCreate()' sang 'onResume()' (bạn chỉ nên làm điều đó một lần), quên về 'entries =' và 'notify' trong' onResume() ' và bạn sẽ ổn thôi. –

+0

@ClassStacker - Vẫn còn vấn đề tương tự. Không làm mới danh sách cho đến khi màn hình được xoay. – RockJake28

+0

Umm có xin lỗi, bạn cũng sẽ phải làm setListAdapter() ở đó. –

Trả lời

29

sự cố bạn gặp phải là bạn đang ghi đè tham chiếu mục nhập và nó không bị thay đổi trên bộ điều hợp. Đây là cách bạn có thể khắc phục điều này

@Override 
public void onResume() { 

    super.onResume(); 
    entries.clear(); 
    entries.addAll(contactStorage.getContactListNames()); 
    adapter.notifyDataSetChanged(); 
    Log.d(TAG, "List Frag Resumed"); 

} 

đây là một lỗi phổ biến để thực hiện, nó gây ra bởi vì khi bạn lần đầu tiên tạo ra một danh sách (trong bộ nhớ) và entries điểm lĩnh vực của bạn vào đó, sau đó bạn nói với adapter nhìn vị trí bộ nhớ khi bạn tạo nó, nhưng onResume bạn tạo danh sách mới trong bộ nhớ (khi bạn lấy lại tên danh sách liên hệ) và bạn yêu cầu các mục trỏ đến danh sách mới đó trong bộ nhớ, những gì bạn cần làm là thay thế các mục nhập trong danh sách gốc với các mục nhập trong danh sách mới, theo cách đó, adapter sẽ vẫn tham chiếu cùng một danh sách.

+0

Hoàn hảo! Tôi biết có một cái gì đó để làm với '.add()' nhưng tôi không thể có được một câu trả lời rõ ràng về chủ đề này. Cảm ơn nhiều! – RockJake28

+1

Tôi cũng đã thêm giải thích tốt hơn về vấn đề này. một cách khác bạn có thể làm điều đó với ArrayAdapter của bạn là tiếp tục 'adapter.clear();' sau đó 'adapter.addAll (contactStorage.getContactListNames());' và quên trường nhập tất cả cùng nhau. – Eluvatar

+0

cảm ơn bạn đời, addAll đã làm phép thuật;) – Salmaan

4

thông báoDataSetChanged() sẽ không hoạt động cho bạn. Lý do tại sao

Bộ điều hợp của bạn mất tham chiếu đến danh sách của bạn. Khi bạn lần đầu tiên khởi tạo bộ điều hợp, nó lấy một tham chiếu đến arrayList của bạn và chuyển tới lớp cha của nó. Nhưng nếu bạn reinitialize ArrayList hiện tại của bạn nó losts các tài liệu tham khảo do đó các kênh thông tin liên lạc với Adaptor :(

Luôn tạo và thêm một danh sách mới để Adapter Làm như thế này:..

  1. Khởi tạo ArrayList
  2. Thêm danh sách vào bộ điều hợp trực tiếp với chức năng kiểm tra rỗng và rỗng . Đặt bộ điều hợp trực tiếp vào danh sách (không kiểm tra bất kỳ điều kiện nào ). thay đổi dữ liệu của arrayList nó sẽ chăm sóc, nhưng không bao giờ rời tham chiếu .
  3. Thêm dữ liệu vào arrayList Mỗi lần (nếu dữ liệu của bạn hoàn toàn mới hơn bạn có thể gọi adapter.clear() và arrayList.clear() trước thực sự thêm dữ liệu vào danh sách) nhưng không đặt bộ chuyển đổi Nếu các dữ liệu mới được phổ biến trong ArrayList hơn là chỉ adapter.notifyDataSetChanged()

Giữ niềm tin để Tài liệu tham

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