Android:如何隐藏ListView项目

如何隐藏ListView中的项目或至less将其高度设置为零?

我试图设置视图的可见性去,但它仍然保持项目的空间(高度)。

Related of "Android:如何隐藏ListView项目"

重新回顾一个老问题,但是我只是想根据列表数据之外的标准暂时隐藏列表项。 我最终做的是在xml中创build一个“空项目”布局,并根据我的标准而不是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> 

如果你想隐藏这样的项目:

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

不能是AbsListView.LayoutParams(-1,0);

如果convertview被重用,你应该在下面添加它来设置它的高度:

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

当涉及到ListView,为了使其效率,我们使用ViewHolder模式。 使用以下xml的ViewHolder Pattern和R.layout.row_null的方法

 <?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)一起使用 ,如下所示。

  @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; } 

我们检查项目的视图types,如果它符合隐藏检查,它将返回1,否则0. ListView知道将有2种types的View从getViewTypeCount。 现在,getView将根据hideStatusCheck返回相应的视图。 为了使一个健壮的ListView,我们想要使用ViewHolder模式。 隐藏时,我们不需要使用ViewHolder。 我们简单地膨胀R.layout.row_null并返回它。 我们将使用ViewHolder作为R.layout.normal_item。 假设隐藏检查不是静态的,这是棘手的部分。 rowView==null的第一个检查是标准的。 rowView.getTag()==null的第二个检查是查看View是否从隐藏恢复正常。 最后一个else子句中的第三个检查是检查标记中保留的ViewHolder是否是正确的ViewHolder。 如果满足这些条件,我们总是再次夸大观点。 是的,的确,ViewHolder模式并没有在整个过程中使用,而是用于某些扩展。 总比没有好。

我做了一些修改,从这里拖放列表。 当一个项目从列表中移出时,它被占据的单元格空间被移动,高度被设置为1px(见第238行),所以它看起来“消失”了。 我无法find一个办法来处理这个更好的设置高度为0失败,因为能见度。

也就是说,如果你真的想暂时减less一行,那么改变Adapter的后台并调用notifyDataSetChanged()就可能是一个好主意。

我看看源代码。 只有一种方法可以在不notifyDataSetChanged()情况下隐藏项目。 您必须为所有内部视图设置可见性GONE ,并删除项目视图的背景图像和填充。

注:具有这种不可见元素的行将是可选的。

PS:这对于ExpandableListView非常有用,如果你想隐藏自己的组视图。

添加到你的ListView对象:android:dividerHeight =“0px”android:divider =“#FFFFFF”

分频器的颜色无关紧要,只要设置dividerHeight不起作用

这确实删除了分隔线,但…

我觉得我有一个更简单/更安全的解决scheme:你只需要“embedded”你的项目在一个布局,并改变这个父布局的可见性。

 <?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; } 

这样你总是使用/重复使用相同的项目,只是隐藏/显示它。