5

Ben bir çözüm ile piyasada bir uygulama var Ben çözemiyorum görünebilir bir hata ile. Bugün bunu aşağıdaki yönteme kadar takip ettim.ListView boş uygulama devam ederken bağdaştırıcıya eklenen rağmen rağmen

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()); 
} 

Bu yöntem, Internet'ten indirilen anlaşma nesnelerinin bir arraylistinden geçirilir. Uygulama ilk açıldığında internetten veri çekilir ve ListFragment için ayarlanmış yeni bir adaptör oluşturan yukarıdaki yöntem çağrılır. Bu yöntem, kullanıcı daha fazla fırsat istediğinde de çağrılır.

Sahip olduğum sorun, listenin bazen boş olan bağlantıyı içeren bir anlaşma olduğunu düşünüyor. Bu, bir aygıt belleğinde düşük olduğunda uygulamayı kullanmaya devam ettiğinde ortaya çıkar (uygulamanın bir kısmının ram'dan kaldırıldığını varsayıyorum). Bu yöntem denir ve dealListAdapter boştur, böylece yeni bir tane oluşturulur ve fırsatlar eklenir. Buna rağmen, liste boş kalır ve kullanıcı tekrar çalışmaya başlamak için uygulamayı kapatmak zorunda kalmalıdır.

Aşağıdaki çizgi, yöntemin çağrılması durumunda, takıma if ve 21 anlaşmaların eklendiğinde tat gösterir. Ne yazık ki liste kullanıcıya boş.

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

Başka bir kodun yararlı olup olmayacağını bana bildirin. – bencallis

+0

Bağdaştırıcıyı oluşturduktan sonra temizler ve tüm girişleri fırsatlar dizisinden ekleyin. Bu diziyi nasıl saklıyorsunuz? Sınıfın bir üye değişkeni ise, etkinliğiniz sistem tarafından öldürülürse korunmaz. Duraklatıldığında veya durdurulduğunda etkinlik durumunu kaydediyor musunuz? http://developer.android.com/guide/topics/fundamentals/activities.html#SavingActivityState –

+0

Yöntemdeki gövdede, sonuçta geri döndüğünde, adaptör anında temizlenmez. Bağdaştırıcı, ListFragment sınıfında örnek değişken olarak saklanır. ArrayList'in kendisi sık sık değiştiği için depolanmaz. Şu anda bir durum kaydedilmedi. Görünüşe göre uygulama tekrar başlatıldığında sorun ortaya çıktığında ortaya çıkıyor. Bir uygulamayı sıfırdan başlattıktan sonra sistem tarafından öldürüldükten sonra bir uygulamayı yeniden başlatırken Android ne yapar? – bencallis

cevap

0

Bir fikir yapın Aksi


  • setListShown(false);
    setListAdapter(null); do Sadece aktivite, sistem aktivitenin son halini yeniden yaratmaya çalışır. onRestoreInstanceState(). Uygulama öldürülürse bu yöntem çağrılmaz - bu ikisi arasındaki büyük farklardan biridir.

    ListActivity, onRestoreInstanceState() öğesini geçersiz kılar. Listenin devam etmesini sağlar, devam etmeden önce. Liste mevcut değilse, varsayılan yerden onu şişirir.

    contentView öğesini onResume() içinde ayarlıyorsanız, onCreate() öğesine taşımaya çalışın, bu sorunu çözebilir.

    Etkinliğin kodunu görüyorsam daha fazla yardımcı olabilirim.

  • 0

    bu ya da değil yardım edecek ama bu şu yöntem de çocuk için geçerli listenizi yeniden boyutlandırmak gerekiyordu eğer gerçekten bilmiyorum. Neden bazen dataDataSetChanged() neden çalışmaz anlamıyorum, liste sadece değişmez, ancak bunun yerine benim sorunumu çözmüştür.

    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(); 
        } 
    } 
    

    Umut eder!

    +0

    Bunu deneyeceğim. Bunu bildirmek yerine sadece bunu mu çağırıyorum? – bencallis

    +0

    Evet, yaptığım buydu. Benim için çalıştı. Bu parçayı nereden aldığımı bulamıyorum, bu benim işim değil. Orada iyi bir açıklama vardı. – caiocpricci2

    +0

    http://stackoverflow.com/questions/3495890/how-can-i-put-a-listview-into-a-scrollview-without-it-collapsing/3495908#3495908 Bu böyle görünüyor. Kaydırma görünümünde liste görünümü oluşturmaya çalışmadığımdan neden işe yarayacağını gerçekten göremiyorum. Her neyse, bunu deneyeceğim ve geri bildireceğim :) – bencallis

    0

    sadece liste adaptörünü ayarlamadan önce

    • setListShown(false) aramayı deneyin aşağıdaki seçeneklerden birini veya birkaçını deneyebilirsiniz. Uygulamanın kendisi öldürülmedi Eğer Aksi

    • , (oldukça uzun atış :)

      requestLayout()

    İlgili konular