Android 如何在ListView中删除某些单元格

Android 如何在ListView中删除某些单元格,android,listview,baseadapter,Android,Listview,Baseadapter,我在BaseAdapter中使用上述代码来显示列表视图。 lvt是一种应用程序全局数据。 如果show为真,我想将单元格消失。 但不删除数据。 但我的方法不会显示数据,而是显示分隔线。 我怎么做 你不能做你要求的事。 如果BaseAdater.count()返回所有ITME的计数(即使是您不想显示的ITME),那么您就不能告诉getView()方法“忽略”某些逻辑项 我建议您做的是过滤您的数据列表(创建一个新的lvt),使其仅包含您希望listView显示的项目,并且只有这样,适配器才能使用这个

我在BaseAdapter中使用上述代码来显示列表视图。
lvt是一种应用程序全局数据。
如果show为真,我想将单元格消失。
但不删除数据。
但我的方法不会显示数据,而是显示分隔线。

我怎么做

你不能做你要求的事。
如果BaseAdater.count()返回所有ITME的计数(即使是您不想显示的ITME),那么您就不能告诉getView()方法“忽略”某些逻辑项

我建议您做的是过滤您的数据列表(创建一个新的lvt),使其仅包含您希望listView显示的项目,并且只有这样,适配器才能使用这个新的逻辑数据


在您的情况下,正如您所怀疑的,“lvt.getShowAt(position)=false”应该是您的筛选指示符

如果您想从列表视图中隐藏项目,我希望您使用单独的
lvt
(仅显示true),而不是试图操纵视图。

我修改getCount如下:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewTag viewTag;
    if(convertView == null) {
        convertView = myInflater.inflate(R.layout.row_item, null);
        viewTag = new ViewTag((LinearLayout)convertView.findViewById(R.id.row), (TextView)convertView.findViewById(R.id.tv));
        convertView.setTag(viewTag);
    }
    else {
        viewTag = (ViewTag) convertView.getTag();
    }

    viewTag.tv.setText(lvt.getTextAt(position));
    viewTag.tv.setVisibility(View.VISIBLE);

    boolean show = lvt.getShowAt(position);
    if(show) {
        viewTag.tv.setVisibility(View.GONE);
        viewTag.ll.setVisibility(View.GONE);
    }
    else {
        viewTag.ll.setVisibility(View.VISIBLE);
    }

    return convertView;
}
@Override
public int getCount() {
    int count = 0;
    int i;
    for(i = 0; i < lvt.sizeTestArray(); i++) {
        if(!lvt.getfiv1At(i)) {
            count++;
        }
    }
    return count;
}
@覆盖
public int getCount(){
整数计数=0;
int i;
对于(i=0;i
并在getView中更改位置,如下所示:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewTag viewTag;
    if(convertView == null) {
        convertView = myInflater.inflate(R.layout.row_item, null);
        viewTag = new ViewTag((LinearLayout)convertView.findViewById(R.id.row), (TextView)convertView.findViewById(R.id.tv));
        convertView.setTag(viewTag);
    }
    else {
        viewTag = (ViewTag) convertView.getTag();
    }

    viewTag.tv.setText(lvt.getTextAt(position));
    viewTag.tv.setVisibility(View.VISIBLE);

    boolean show = lvt.getShowAt(position);
    if(show) {
        viewTag.tv.setVisibility(View.GONE);
        viewTag.ll.setVisibility(View.GONE);
    }
    else {
        viewTag.ll.setVisibility(View.VISIBLE);
    }

    return convertView;
}
@Override
public int getCount() {
    int count = 0;
    int i;
    for(i = 0; i < lvt.sizeTestArray(); i++) {
        if(!lvt.getfiv1At(i)) {
            count++;
        }
    }
    return count;
}
inti;
整数计数=0;
对于(i=0;i
现在似乎做得不错。

但我不确定现在是否存在任何错误。

但此方法可能导致“Adapter.notifyDataSetChanged();”没用。@brian:您不需要调用listView.setAdapter()两次。只有在创建了新的filterd listI之后才调用它,这意味着如果原始数据发生更改,新数据将不会自动更新update@brian:但在相关活动上-您不希望显示原始数据,而只显示filterd数据。你的adaper需要处理这个新的filterd数据。我不太明白这到底有什么问题?@布莱恩:我想我已经抓住你了。如果由于某种原因,原始数据发生了更改,则必须在之后更新过滤器列表。。无法逃避。。。如果它太复杂以至于不能用这种方式工作,那么也许你应该考虑重构你的数据结构(LVT),使其更适合于这种状态。