2014-10-18 37 views
0

我爲ListView創建了可展開的項目,並且視圖可以正確回收。 問題是當我展開其中一個項目時,一些隱藏的項目也被擴展了,這顯然是我不想要的。Android ListView已回收 - 可展開的項目

例如,如果我展開列表中第二個位置的項目,則第8個項目也展開。反之亦然。 這看起來是一個未正確摺疊的再循環視圖。

以下是展開/摺疊項目的一些快速屏幕。

enter image description here

enter image description here

這裏是我使用的代碼來創建這些項目:

LayoutInflater inflater = (LayoutInflater) fragment.getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    final MessageHolder holder; 
    if (convertView == null) 
    { 
     convertView = inflater.inflate(R.layout.test_message, parent, false); 
     holder = new MessageHolder(); 

     // Retrieve layout elements 
     holder.card = new WeakReference<ExpandableCardLayout>((ExpandableCardLayout) convertView.findViewById(R.id.card)); 
     holder.layout_comments = new WeakReference<LinearLayout>((LinearLayout) convertView.findViewById(R.id.layout_comments)); 
     holder.layout_loading = new WeakReference<LinearLayout>((LinearLayout) convertView.findViewById(R.id.layout_loading)); 
     holder.spinner_loading = new WeakReference<FlatLoadingSpinner>((FlatLoadingSpinner) convertView.findViewById(R.id.spinner_loading)); 

     // Attach holder 
     convertView.setTag(holder); 
    } 
    else 
    { 
     holder = (MessageHolder) convertView.getTag(); 
    } 

    // Attach listener 
    holder.card.get().setOnExpandListener(new OnExpandListener() { 
     @Override 
     public void onExpand() 
     { 
      handler.postDelayed(new Runnable() { 
       @Override 
       public void run() 
       { 
        // Hide loading 
        holder.layout_loading.get().setVisibility(View.GONE); 

        // Add comments 
        List<View> comments = buildComments(null); 
        for (int i=0; i<comments.size(); i++) holder.layout_comments.get().addView(comments.get(i)); 
       } 
      }, 1000); 
     } 

     @Override 
     public void onCollapse() 
     {    
      // Remove everything 
      while (holder.layout_comments.get().getChildCount() > 0) holder.layout_comments.get().removeViewAt(0); 

      // Show loading 
      holder.layout_loading.get().setVisibility(View.VISIBLE); 
     } 
    }); 

    return convertView; 

我的問題是:如何避免在回收元素被擴大了崩潰的看法?

回答

0

您必須手動刪除在onExpand()中添加的視圖。 ListView不知道有關擴展邏輯和緩存的任何信息,並且「按原樣」重用列表項視圖。

或者,您應該考慮使用ExpandableListView,因爲此組件專爲您的情況設計。

PS。我不明白你爲什麼在小時持有者對象中使用WeakReferences。

+0

你好,謝謝你的回答。我必須在哪裏做到這一點?我使用'WeakReference'來處理'ImageView'中的'Bitmap'。 – Manitoba 2014-10-18 17:00:18

+0

我自己做的。謝謝你的幫助 ! – Manitoba 2014-10-18 17:15:12

相關問題