2010-04-14 379 views
20

如何隱藏ListView中的項目或至少將其高度設置爲零?Android:如何隱藏ListView項目

我已經嘗試設置視圖的可見性,但它仍然保持項目的空間(高度)。

+1

你肯定在View.GONE有何評論? – Samuh 2010-04-14 14:33:51

+0

查看http://stackoverflow.com/questions/5041499/how-to-hide-an-item-in-a-listview-in-android – mattlary 2012-02-03 05:28:00

回答

2

我做了一些修改,從here拖放列表。當一個項目從列表中移出時,它將被佔據的單元格空間移動,它的高度設置爲1px(請參見第238行),以便它看起來「消失」了。我無法找到一種方法來更好地處理這個問題,因爲將高度設置爲0會失敗,因爲能見度已經降低。

這就是說,如果你真的想暫時擺脫一排,最好改變Adapter的支持,並且打電話notifyDataSetChanged()就可以了。

0

添加到您的ListView對象: 機器人:dividerHeight = 「0像素」 機器人:分隔= 「#FFFFFF」

分頻器膚色並不重要 設置只dividerHeight不起作用

這雖然刪除分隔線...

2

我看看源代碼。沒有notifyDataSetChanged(),只有一種方法可以隱藏物品。您必須爲所有內部視圖設置可見性GONE,並刪除項目視圖的背景圖像和填充。

注意:具有這種不可見元素的行將是可選的。

P.S:這對ExpandableListView非常有用,如果你想隱藏自己的組視圖。

24

重新審視一個老問題,但我剛剛遇到了這個問題,我想根據列表數據之外的標準臨時隱藏列表項。我最終做的是在xml中創建一個「空項目」佈局,並根據我的標準返回,而不是getView()中的轉換視圖...

而不是返回convertView,我返回了我的null_item .. 。

return inflater.inflate(R.layout.null_item, null); 

null_item.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" > 

</LinearLayout> 
+7

爲什麼不只是返回一個新的視圖對象?這樣你就不會增加膨脹視圖的開銷。 – mdelolmo 2014-10-01 14:59:17

+0

@tawani沒有提出這個解決方案嗎?請將此標記爲答案。 – Sufian 2014-10-02 08:06:40

+4

@ mdelolmo的方法有效。我只是測試它,它爲您節省了額外的XML文件和通貨膨脹的需要。你甚至不需要設置佈局參數,只需'返回新的視圖(上下文);' – 2014-10-31 20:35:06

7

當涉及到的ListView,使之高效,我們使用ViewHolder模式。該方法使用下面的XML

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" > 
</LinearLayout> 

getViewTypeCount()getItemViewType(int position)如下使用的ViewHolder模式和R.layout.row_null。

@Override 
    public int getViewTypeCount() { 
     return 2; 
    } 

    @Override 
    public int getItemViewType(int position) { 
     return (hideStatusCheck(position)) ? 1 : 0; 
    } 

    @Override 
    public View getView(int pos, View convertView, ViewGroup parent) { 
     View rowView = convertView; 

     if (hideStatusCheck(pos)) { 
      if (rowView == null || rowView.getTag() != null) { 
       LayoutInflater inflater = mActivity.getLayoutInflater(); 
       rowView = inflater.inflate(R.layout.row_null, parent, false); 
      } 
     } else { 
      if (rowView == null) { 
       rowView = inflateNormalView(parent); 
      } else if (rowView.getTag() == null) { 
       rowView = inflateNormalView(parent); 
      } else { 
       ViewHolder holderToCheck = (ViewHolder) rowView.getTag(); 
       Integer storedPos = (Integer) holderToCheck.getTag(POSITION); 
       if (storedPos == null || storedPos != pos) 
        rowView = inflateNormalView(parent); 
      } 
      ViewHolder holder = (ViewHolder) rowView.getTag(); 
      holder.setTag(POSITION,pos); 
         /* 
         Populate data 
         */ 
      return rowView; 
    } 

    private View inflateNormalView(ViewGroup parent) { 
        View rowView; 
     LayoutInflater inflater = mActivity.getLayoutInflater(); 
     rowView = inflater.inflate(R.layout.normal_item, parent, false); 
     ViewHolder viewHolder = new ViewHolder(); 
     assert rowView != null; 
        /* Initiate normal findViewById thing*/ 
     rowView.setTag(viewHolder); 
     return rowView; 
    } 

我們做項目的查看類型的檢查,如果它符合隱藏檢查,它將返回1,否則爲0 ListView控件知道會有2種類型查看從getViewTypeCount的。現在,getView將根據hideStatusCheck返回適當的視圖。爲了建立一個健壯的ListView,我們想要使用ViewHolder模式。隱藏時,我們不需要使用ViewHolder。我們只需膨脹R.layout.row_null並將其返回。我們將使用ViewHolder作爲R.layout.normal_item。假設隱藏檢查不是靜態的,這是棘手的部分。 rowView==null的第一個檢查是標準的。rowView.getTag()==null的第二項檢查是查看視圖是否會從隱藏回到正常 。最後一個else子句中的第三個檢查是檢查標記中保留的ViewHolder是否是正確的ViewHolder。如果這些條件得到滿足,我們總是再次誇大觀點。是的,的確,ViewHolder模式並沒有在整個過程中使用,但它用於某些擴展。這總比沒有好。

0

我覺得我有一個更簡單/更安全的解決方案:您只需將項目「嵌入」到佈局中,並更改此父佈局的可見性。

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal" > 

    <!-- Embed ListView Item into a "parent" Layout --> 
    <LinearLayout 
     android:id="@+id/parentLayout" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal" > 

     <!-- This is the normal content of your ListView Item --> 
     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Hello" /> 
     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="World" /> 

    </LinearLayout> 
</LinearLayout> 
在你的代碼

然後就去做:

public View getView(int position, View view, ViewGroup parent) { 
    if (view == null) { 
     LayoutInflater li = mActivity.getLayoutInflater(); 
     view = li.inflate(R.layout.my_listview_item, null); 
    } 
    LinearLayout parentLayout = (LinearLayout) view.findViewById(R.id.parentLayout); 
    if (shouldDisplayItem(position)) { 
     parentLayout.setVisibility(View.VISIBLE); 
    } else { 
     parentLayout.setVisibility(View.GONE); 
    } 
    return view; 
} 

這樣,你總是使用/重複使用相同的項目,只是隱藏/顯示它。

+0

這是我準備寫的正確答案:) – 2014-09-03 16:09:50

11

,如果你想隱藏像這樣的項目:(-1,0)

convertView.setLayoutParams(new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,1)); 
convertView.setVisibility(View.GONE); 

不能AbsListView.LayoutParams;

如果convertview被重用,你應該添加此下方設置它的高度回:

if(convertView.getVisibility() == View.GONE) { 
    convertView.setLayoutParams(new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, AbsListView.LayoutParams.WRAP_CONTENT)); 
    convertView.setVisibility(View.VISIBLE); 
}