如何隐藏 ListView 中的项目或至少将其高度设置为零?
我尝试将视图的可见性设置为 GONE,但它仍然保持项目的空间(高度)。
如何隐藏 ListView 中的项目或至少将其高度设置为零?
我尝试将视图的可见性设置为 GONE,但它仍然保持项目的空间(高度)。
解决一个老问题,但我刚刚遇到了这个问题,我想根据列表数据之外的标准临时隐藏列表项。我最终做的是在 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>
如果你想隐藏这样的项目:
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;
}
我们对item的View类型进行检查,如果满足隐藏检查,则返回1,否则返回0。ListView从getViewTypeCount知道会有2种View。现在,getView 将根据 hideStatusCheck 返回适当的视图。为了制作一个健壮的 ListView,我们想使用 ViewHolder 模式。隐藏时我们不需要使用 ViewHolder。我们只是膨胀 R.layout.row_null 并返回它。我们将为 R.layout.normal_item 使用 ViewHolder。假设隐藏检查不是静态的,这是棘手的部分。第一次检查rowView==null
是标准的。第二个检查rowView.getTag()==null
是查看视图是否从隐藏状态恢复正常。最后的第三次检查else
子句是检查标签中保留的ViewHolder是否是正确的ViewHolder。如果满足这些条件,我们总是会再次膨胀视图。是的,确实,ViewHolder 模式并未自始至终使用,但它用于某些扩展。总比没有好。
我从这里修改了一个拖放列表。当一个项目从列表中弹出以围绕它占用的单元格空间移动时,它的高度设置为 1px(参见第 238 行),因此它看起来“消失”。我找不到更好的方法来处理这个问题,因为将高度设置为 0 失败,可见性消失了。
就是说,如果您真的想暂时少删除一行,那么更改 the 的支持Adapter
并调用它可能是个好主意notifyDataSetChanged()
。
我看过源代码。并且只有一种方法可以隐藏没有notifyDataSetChanged()
. 您必须为所有内部视图设置可见性GONE
并删除项目视图的背景图像和填充。
注意:具有这种不可见元素的行将是可选的。
ExpandableListView
PS:如果您想自己隐藏组视图,这非常有用。
我认为我有一个更简单/更安全的解决方案:您只需将您的项目“嵌入”到布局中,并更改此父布局的可见性。
<?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;
}
这样你总是使用/重用同一个项目,只是隐藏/显示它。
添加到您的 ListView 对象: android:dividerHeight="0px" android:divider="#FFFFFF"
分隔线颜色无关紧要,仅设置 dividerHeight 不起作用
这确实删除了分隔线......
在 android 中从 listview 中隐藏整个原始数据:-
RelativeLayout parentLayout = (RelativeLayout) view.findViewById(R.id.relative);
if (productPojoList.get(position).getSERSERVICETYPE().toString().equals("Group|Promotional")){
view.setLayoutParams(new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,1));
view.setVisibility(View.GONE);
} else {
if(view.getVisibility() == View.GONE) {
view.setLayoutParams(new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, AbsListView.LayoutParams.WRAP_CONTENT));
view.setVisibility(View.VISIBLE);
}
}