Android:如何隐藏ListView项目

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)

  • 为什么不返回一个新的View对象?这样你就不会增加膨胀视图的开销. (7认同)
  • @mdelolmo的方法有效.我刚测试它,它可以节省你额外的xml文件和通胀的需要.你甚至不需要设置布局参数,只需`返回新的视图(上下文);` (4认同)

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)


Win*_*tet 8

说到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模式并未在整个过程中使用,但它用于某些扩展.总比没有好.


jqp*_*liq 2

我从这里对拖放列表进行了一些修改。当一个项目从列表中弹出并在其占据的单元格空间周围移动时,其高度设置为 1px(参见第 238 行),因此它看起来“消失”了。我找不到更好的方法来处理这个问题,因为将高度设置为 0 会失败,可见性也会消失。

也就是说,如果您确实想暂时减少行的数量,那么更改 的支持Adapter并调用notifyDataSetChanged()它可能是一个好主意。