Taw*_*ani 21 android listview visibility listviewitem
如何隐藏ListView中的项目或至少将其高度设置为零?
我已经尝试将View的可见性设置为GONE,但它仍然保持项目的空间(高度).
Ton*_*thy 24
重新确定一个旧问题,但我刚才有这个问题,我想根据列表数据之外的标准临时隐藏列表项.我最终做的是在xml中创建一个"null item"布局,并根据我的标准而不是getView()中的convert视图返回...
而不是返回convertView,我返回了我的null_item ...
return inflater.inflate(R.layout.null_item, null);
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
tao*_*tao 13
如果你想隐藏这样的项目:
convertView.setLayoutParams(new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,1));
convertView.setVisibility(View.GONE);
Run Code Online (Sandbox Code Playgroud)
不能是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);
}
Run Code Online (Sandbox Code Playgroud)
说到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>
Run Code Online (Sandbox Code Playgroud)
是使用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;
}
Run Code Online (Sandbox Code Playgroud)
我们检查项目的视图类型,如果它遇到隐藏检查,它将返回1,否则为0. ListView知道getViewTypeCount将有两种类型的View.现在,getView将返回approriate视图,具体取决于hideStatusCheck.为了制作健壮的ListView,我们想要使用ViewHolder模式.隐藏时我们不需要使用ViewHolder.我们只是给R.layout.row_null充气并返回它.我们将使用ViewHolder作为R.layout.normal_item.假设隐藏检查不是静态的,这是一个棘手的部分.第一次检查rowView==null是标准的.第二个检查rowView.getTag()==null是查看View是否从隐藏中恢复正常.最后else一句中的第三项检查是检查标记中保留的ViewHolder是否是正确的ViewHolder.如果满足这些条件,我们总是再次膨胀视图.是的,确实,ViewHolder模式并未在整个过程中使用,但它用于某些扩展.总比没有好.
| 归档时间: |
|
| 查看次数: |
31081 次 |
| 最近记录: |