5

Tôi có một ứng dụng trên thị trường có lỗi mà tôi không thể giải quyết được. Hôm nay tôi đã theo dõi nó xuống phương pháp sau đây.ListView trống rỗng mặc dù các mục được thêm vào bộ điều hợp đôi khi khi tiếp tục ứng dụng

public void updateDealList(ArrayList<Deal> deals) { 
    // first call or showing bookmakrs (also gets called other times when adapter is null) 
    if (dealListAdapter == null || showingBookmarks || !dealListAdapter.moreDealsToDownload()) { 
     dealListAdapter = new EndlessDealListAdapter(getActivity(), 
       R.layout.deal_list_item, deals); 
     setListAdapter(dealListAdapter); 
     listView = getListView(); 
     if (getActivity().findViewById(R.id.right_fragment_container)!=null){ // if tablet 
      listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); 
      listView.setVerticalScrollbarPosition(View.SCROLLBAR_POSITION_LEFT); 
     } 
     showingBookmarks=false; 
     Log.d("UPDATE_DEAL_LIST", "Notified list created new" + dealListAdapter.getCount()); 
     return; //PROBLEM OCCURS WHEN APP COMES IN HERE AFTER RESUMING 
    } 
    dealListAdapter.getDealListAdapter().clear(); 
    for (Deal d: deals){ 
     dealListAdapter.getDealListAdapter().add(d); 
     Log.d("UPDATE_DEAL_LIST", "added " + d.title); 
    } 
    dealListAdapter.notifyDataSetChanged(); 
    Log.d("UPDATE_DEAL_LIST", "Notified list " + dealListAdapter.getCount()); 
} 

Phương thức này được chuyển qua danh sách mảng đối tượng được kéo xuống từ internet. Khi ứng dụng được mở lần đầu tiên, dữ liệu được lấy từ internet và phương thức trên được gọi là tạo ra một adapter mới được thiết lập cho ListFragment. Phương thức này cũng được gọi khi người dùng yêu cầu nhiều giao dịch hơn.

Sự cố mà tôi đang gặp phải là danh sách đôi khi cho rằng giá trị của nó có vẻ trống rỗng khi bộ điều hợp chứa giao dịch. Điều này dường như xảy ra khi một sử dụng tiếp tục ứng dụng khi thiết bị của họ là thấp trên bộ nhớ (tôi đoán một phần của ứng dụng đã được gỡ bỏ từ ram). Phương thức này được gọi và dealListAdapter là null nên một cái mới được tạo ra và các giao dịch được thêm vào. Mặc dù điều này xảy ra danh sách vẫn còn trống và người dùng phải buộc đóng ứng dụng để làm cho nó hoạt động trở lại.

Dòng bên dưới hiển thị hình khi phương thức được gọi là nó đi vào if và 21 giao dịch được thêm vào bộ điều hợp. Rất tiếc danh sách trống cho người dùng.

05-23 01:52:32.879: D/UPDATE_DEAL_LIST(3478): Notified list created new21 
+0

Hãy cho tôi biết nếu bất kỳ mã nào khác sẽ hữu ích. – bencallis

+0

Sau khi bạn tạo bộ điều hợp, bạn xóa nó và thêm tất cả các mục từ mảng giao dịch. Bạn lưu trữ mảng này như thế nào? Nếu nó là một biến thành viên của lớp, nó sẽ không được giữ lại nếu hoạt động của bạn bị hệ thống giết chết. Bạn có lưu trạng thái hoạt động khi nó bị tạm dừng hoặc dừng lại không? http://developer.android.com/guide/topics/fundamentals/activities.html#SavingActivityState –

+0

Khi ở trong phần thân của phương thức, nó trả về ở cuối để bộ điều hợp không bị xóa ngay lập tức. Bộ điều hợp được lưu trữ như một biến cá thể trong lớp ListFragment. Bản thân ArrayList không được lưu trữ, vì nó thay đổi thường xuyên. Không có trạng thái nào hiện được lưu. Có vẻ như khi ứng dụng được khởi chạy lại sau khi bị giết, sự cố sẽ xảy ra. Android làm gì khác khi khởi chạy lại một ứng dụng sau khi nó bị hệ thống giết chết trái ngược với việc khởi động ứng dụng từ đầu? – bencallis

Trả lời

0

Một ý tưởng (khá dài bắn :)

Nếu ứng dụng riêng của mình không bị giết , chỉ là hoạt động, hệ thống sẽ cố gắng tạo lại trạng thái cuối cùng của hoạt động, gọi onRestoreInstanceState(). Phương pháp này sẽ không được gọi nếu ứng dụng bị giết - vì vậy đây là một trong những khác biệt lớn giữa hai.

ListActivity ghi đè onRestoreInstanceState(). Nó đảm bảo rằng Danh sách tồn tại, trước khi nó tiếp diễn. Nếu danh sách không tồn tại, nó sẽ thổi phồng nó từ vị trí mặc định.

Nếu bạn đang đặt contentView trong onResume() hãy thử di chuyển nó đến onCreate(), điều đó có thể giải quyết được sự cố.

Tôi có thể trợ giúp thêm, nếu tôi thấy mã của hoạt động.

0

Tôi thực sự không biết điều này có giúp ích hay không nhưng phương pháp sau đây có nghĩa vụ phải định lại kích thước danh sách của bạn dựa trên con của nó. Tôi không hiểu tại sao đôi khi notificationDataSetChanged() không hoạt động, danh sách đơn giản là không thay đổi, nhưng việc sử dụng nó thay vào đó đã giải quyết được vấn đề của tôi.

public static class Utility { 
    public static void setListViewHeightBasedOnChildren(ListView listView) { 
     ListAdapter listAdapter = listView.getAdapter(); 
     if (listAdapter == null) { 
      // pre-condition 
      return; 
     } 


     int totalHeight = 0; 
     int desiredWidth = MeasureSpec.makeMeasureSpec(listView.getWidth(), MeasureSpec.AT_MOST); 
     for (int i = 0; i < listAdapter.getCount(); i++) { 
      View listItem = listAdapter.getView(i, null, listView); 
      listItem.measure(desiredWidth, MeasureSpec.UNSPECIFIED); 
      totalHeight += listItem.getMeasuredHeight(); 
     } 

     ViewGroup.LayoutParams params = listView.getLayoutParams(); 
     int newHeight = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1)); 
     if (newHeight >= 100) 
      params.height = newHeight; 
     else 
      params.height = 100; 
     listView.setLayoutParams(params); 
     listView.requestLayout(); 
    } 
} 

Hy vọng điều đó sẽ hữu ích!

+0

Tôi sẽ dùng thử. Tôi có gọi nó thay vì notifydatasetchange không? – bencallis

+0

Vâng, đó là những gì tôi đã làm. Nó làm việc cho tôi. Tôi không thể tìm thấy nơi tôi đã lấy đoạn đó từ, nó không phải là công việc của tôi. Có một lời giải thích tốt ở đó. – caiocpricci2

+0

http://stackoverflow.com/questions/3495890/how-can-i-put-a-listview-into-a-scrollview-without-it-collapsing/3495908#3495908 Điều này có vẻ như vậy. Tôi thực sự không thể hiểu tại sao nó lại hoạt động vì tôi không cố gắng đặt chế độ xem danh sách trong chế độ xem cuộn. Dù sao tôi sẽ thử nó và báo cáo lại :) – bencallis

0

Bạn có thể thử một hoặc nhiều các tùy chọn sau

  • Thử gọi setListShown(false) ngay trước khi thiết lập các bộ chuyển đổi danh sách.

  • Nếu không, làm
    setListShown(false);
    setListAdapter(null);

  • Nếu không, làm requestLayout()

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