如何在Android中的列表视图中隐藏项目

Tim*_*ima 23 android listview android-listview

我知道,之前曾问过这个问题,但我没有看到它的工作答案.

有没有办法在ListView不更改源数据的情况下隐藏某些项目?

我试图将项目视图的可见性设置为已消失,它将不再显示,但为此项目保留的位置仍然存在.

我还设置:

android:dividerHeight="0dp"
android:divider="#FFFFFF"
Run Code Online (Sandbox Code Playgroud)

没有成功.

Car*_*ten 22

您可以编写自己的,也可以创建ListAdapter现有的子类.

在你的ListAdapter,你只会过滤掉你不想要返回修改后的值显示的项目getCount(),getItem()getItemId()在适当.

  • 修改了getCount(),getItem()和notifyDataSetChanged()是解决方案.谢谢 (7认同)
  • 任何例子?你应该在getItem()中为不可见的行返回什么?空值? (2认同)

tao*_*tao 13

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

convertView.setLayoutParams(new AbsListView.LayoutParams(-1,1));
convertView.setVisibility(View.GONE);
Run Code Online (Sandbox Code Playgroud)

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

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

if(convertView.getVisibility() == View.GONE) {
            convertView.setVisibility(View.VISIBLE);
            convertView.setLayoutParams(new AbsListView.LayoutParams(-1,-2));
        }
Run Code Online (Sandbox Code Playgroud)


Moh*_*hin 11

我尝试了几种解决方案,包括setVisibitlity(View.GONE)和膨胀默认null视图,但所有这些都有一个共同的问题,即隐藏项目之间的分隔线被堆叠起来,并在大型列表中形成一个糟糕的可见灰色空间.

如果你ListView有一个支持,CursorAdapter那么最好的解决方案是用一个包裹它CursorWrapper.

所以我的解决方案(基于@RomanUsachev 在这里回答)是这样的:

FilterCursorWrapper

   public class FilterCursorWrapper extends CursorWrapper {
    private int[] index;
    private int count = 0;
    private int pos = 0;

    public boolean isHidden(String path) {

      // the logic to check where this item should be hidden

      //   if (some condintion)
      //      return false;
      //    else {
      //       return true; 
      //   }

       return false;

    }

    public FilterCursorWrapper(Cursor cursor, boolean doFilter, int column) {
        super(cursor);
        if (doFilter) {
            this.count = super.getCount();
            this.index = new int[this.count];
            for (int i = 0; i < this.count; i++) {
                super.moveToPosition(i);
                if (!isHidden(this.getString(column)))
                    this.index[this.pos++] = i;
            }
            this.count = this.pos;
            this.pos = 0;
            super.moveToFirst();
        } else {
            this.count = super.getCount();
            this.index = new int[this.count];
            for (int i = 0; i < this.count; i++) {
                this.index[i] = i;
            }
        }
    }

    @Override
    public boolean move(int offset) {
        return this.moveToPosition(this.pos + offset);
    }

    @Override
    public boolean moveToNext() {
        return this.moveToPosition(this.pos + 1);
    }

    @Override
    public boolean moveToPrevious() {
        return this.moveToPosition(this.pos - 1);
    }

    @Override
    public boolean moveToFirst() {
        return this.moveToPosition(0);
    }

    @Override
    public boolean moveToLast() {
        return this.moveToPosition(this.count - 1);
    }

    @Override
    public boolean moveToPosition(int position) {
        if (position >= this.count || position < 0)
            return false;
        return super.moveToPosition(this.index[position]);
    }

    @Override
    public int getCount() {
        return this.count;
    }

    @Override
    public int getPosition() {
        return this.pos;
    }
}
Run Code Online (Sandbox Code Playgroud)

当您Cursor准备就绪时,请FilterCursorWrapper使用您想要的列索引

FilterCursorWrapper filterCursorWrapper = new FilterCursorWrapper(cursor, true,DATA_COLUMN_INDEX);

dataAdapter.changeCursor(filterCursorWrapper);
Run Code Online (Sandbox Code Playgroud)

如果你进行过滤和排序,不要忘记在FilterCursorWrapper任何地方使用:

    dataAdapter.setFilterQueryProvider(new FilterQueryProvider() {
        @Override
        public Cursor runQuery(CharSequence constraint) {
            String selection = MediaStore.Video.Media.DATA + " LIKE '%" + constraint.toString().toLowerCase() + "%'";
            return new FilterCursorWrapper(context.getContentResolver().query(videoMediaUri, columns, selection, null, null), true, DATA_COLUMN_INDEX);
        }
    });
Run Code Online (Sandbox Code Playgroud)

并且为了刷新列表,这足以使用空过滤器进行查询:

dataAdapter.getFilter().filter("");
Run Code Online (Sandbox Code Playgroud)

而且你完成了,只需改变isHidden方法的逻辑,你就可以控制显示或隐藏隐藏的项目.而且好处是你没有看到不受欢迎的分隔线堆积起来.:-)


Tob*_*iug 5

在某些情况下,您有一个简单的解决方案:

我必须在列表视图中隐藏视图,因为填充视图的项目无效,所以我不想看到该视图:

在我的列表适配器中:

public class PlanListAdapter extends BaseAdapter{

//some code here : constructor ......

    // my code that create the view from the item list (one view by item ...)
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {


        LayoutInflater inflater = (LayoutInflater) this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        convertView = inflater.inflate(R.layout.my_layout, null);

        if(my_data_are_not_valid) {
             //just create an empty view     
             convertView = new Space(context);  
        }
        else {
             //populate the view with data here     
             populate(convertView);
        }

        return convertView;
}

//some code here to populate the view ...


}
Run Code Online (Sandbox Code Playgroud)