Android列表-在备份数组中隐藏项

Android列表-在备份数组中隐藏项,android,arrays,listview,android-recyclerview,Android,Arrays,Listview,Android Recyclerview,我想我有点知道答案(这是不可能的),但如果有人遇到这样的事情,我仍然希望听到SO社区的声音: 我有一个要在列表/回收器视图中显示的项目列表。所以我有一个适配器读取这个备份阵列。现在,我想根据数组中项目的某些属性隐藏一些项目。如何设置适配器以跳过此阵列中的某些项 我尝试从保持架中引用父视图,并设置其可见性。这会使视图不可见,但列表仍显示空行。要这样做,您需要在适配器中覆盖getItemViewType 你的Pojo Hello.java { boolean needHide =false; }

我想我有点知道答案(这是不可能的),但如果有人遇到这样的事情,我仍然希望听到SO社区的声音:

我有一个要在列表/回收器视图中显示的项目列表。所以我有一个适配器读取这个备份阵列。现在,我想根据数组中项目的某些属性隐藏一些项目。如何设置适配器以跳过此阵列中的某些项


我尝试从保持架中引用父视图,并设置其可见性。这会使视图不可见,但列表仍显示空行。

要这样做,您需要在适配器中覆盖getItemViewType

你的Pojo

Hello.java
{
  boolean needHide =false;
}
适配器:

int ITEM_TYPE_USER_HIDE =0;
int ITEM_TYPE_USER_UNHIDE=1;

 @Override
    public int getItemViewType(int position) {
        return mList.get(position).needHide? ITEM_TYPE_USER_HIDE : ITEM_TYPE_UNHIDE;
    }
 @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if (viewType == ITEM_TYPE_UNHIDE) {
            View view = LayoutInflater.from(mContext).inflate(R.layout.layout_not_hide, parent, false);
            return new NotHideHolder(view);
        } else {
            View view = LayoutInflater.from(mContext).inflate(R.layout.layout_hide_type, parent, false);
            return new HideViewHolder(view);
        }
    }

不幸的是,正如@Ben Trengrove所建议的,将可见性设置为View.GONE不适用于ListView,因为它仍然将列表中的空间作为一个空行

但我在做一个项目,遇到了类似的问题,幸运的是我终于找到了解决办法。 我使用ListView和ArrayAdapter。我的策略是,每当我们想要隐藏一个视图时,我们都会返回一个视图,而不会从ArrayAdapter的getView()方法中膨胀它。 以下是我的ArrayAdapter的完整工作代码:

public class CustomArrayAdapter extends ArrayAdapter<String> {

private Context context;
private Typeface typeface;
private ArrayList<String> list;
private LayoutInflater layoutInflater;


public CustomArrayAdapter(@NonNull Context context, ArrayList<String> list) {
    super(context, R.layout.simple_list_view_1, list);
    this.context = context;
    this.list = list;
    typeface  = Typeface.createFromAsset(context.getAssets(), "krdv010.ttf");
    layoutInflater = (LayoutInflater)
            context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

@NonNull
@Override
/*Every time ListView needs to show a new row on screen, it will call
 this getView() method.*/
public View getView(final int position, @Nullable View convertView, @NonNull ViewGroup parent) {

    ViewHolder viewHolder = null;

    //Hide some views here...
    //Use position or whatever for the condition.
    //Provide a new View and return it without inflating it.
    //but still set a ViewHolder tag to it.
    if (position ==0 || position == 6 || position ==26){
        viewHolder = new ViewHolder();
        viewHolder.isEmpty = true;
        convertView = new View(context);
        convertView.setTag(viewHolder);
        return convertView;
    }

    //ListView is not asking you to recycle a view - normal workout
    if(convertView == null){
        convertView = layoutInflater.inflate(R.layout.simple_list_view_1, null);

        viewHolder = new ViewHolder();
        viewHolder.textView = (TextView)convertView.findViewById(R.id.text1);
        viewHolder.isEmpty = false;
        convertView.setTag(viewHolder);
    }

    //Here ListView is asking you to recycle the row layout.
    //But there may be the one which was not inflated.
    //So we will check for it and do what is required.
    else{
        viewHolder = (ViewHolder)convertView.getTag();
        if(viewHolder.isEmpty){
            //This is the one which wasn't inflated.
            convertView = layoutInflater.inflate(R.layout.simple_list_view_1, null);
            viewHolder.textView = (TextView)convertView.findViewById(R.id.text1);
            viewHolder.isEmpty = false;
            convertView.setTag(viewHolder);
        }
    }




    //Your normal business here
    String string = list.get(position);

    viewHolder.textView.setText(string);
    viewHolder.textView.setTypeface(typeface);
    viewHolder.textView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(context, "Position: " + position, Toast.LENGTH_SHORT).show();
        }
    });

    return convertView;
}

//The View Holder Class
private static class ViewHolder{
    TextView textView;
    Boolean isEmpty;
}
}
公共类CustomArrayAdapter扩展了ArrayAdapter{
私人语境;
私人字体;
私有数组列表;
私人停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场;
公共CustomArrayAdapter(@NonNull上下文,ArrayList列表){
超级(上下文、右布局、简单列表、视图、列表);
this.context=上下文;
this.list=列表;
typeface=typeface.createFromAsset(context.getAssets(),“krdv010.ttf”);
layoutInflater=(layoutInflater)
getSystemService(context.LAYOUT\u充气机\u服务);
}
@非空
@凌驾
/*每次ListView需要在屏幕上显示新行时,它都会调用
这是一个getView()方法*/
公共视图getView(最终整数位置,@Nullable View convertView,@NonNull ViewGroup父级){
ViewHolder ViewHolder=null;
//在这里隐藏一些视图。。。
//使用位置或任何条件。
//提供一个新视图,并返回它而不使其膨胀。
//但仍然为其设置了ViewHolder标记。
如果(位置==0 | |位置==6 | |位置==26){
viewHolder=新的viewHolder();
viewHolder.isEmpty=true;
convertView=新视图(上下文);
convertView.setTag(viewHolder);
返回视图;
}
//ListView不要求您循环使用view-normal训练
if(convertView==null){
convertView=LayoutFlater.充气(R.layout.simple\u list\u view\u 1,空);
viewHolder=新的viewHolder();
viewHolder.textView=(textView)convertView.findViewById(R.id.text1);
viewHolder.isEmpty=false;
convertView.setTag(viewHolder);
}
//这里ListView要求您回收行布局。
//但可能有一个是没有膨胀的。
//因此,我们将检查它并执行所需的操作。
否则{
viewHolder=(viewHolder)convertView.getTag();
if(viewHolder.isEmpty){
//这是一个没有充气的。
convertView=LayoutFlater.充气(R.layout.simple\u list\u view\u 1,空);
viewHolder.textView=(textView)convertView.findViewById(R.id.text1);
viewHolder.isEmpty=false;
convertView.setTag(viewHolder);
}
}
//你在这里的正常业务
String=list.get(位置);
viewHolder.textView.setText(字符串);
viewHolder.textView.setTypeface(字体);
viewHolder.textView.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
Toast.makeText(上下文,“Position:+Position,Toast.LENGTH_SHORT).show();
}
});
返回视图;
}
//视图持有者类
私有静态类视图持有者{
文本视图文本视图;
布尔等空;
}
}
这是屏幕截图,请注意@0和@6位置没有空行,它们已成功隐藏:


将其设置为“消失”而不是“不可见”难道不可以创建一个单独的数组来存储过滤后的结果,然后从该数组中读取数据吗?为什么需要使用数组项的属性来告诉适配器跳过这些项?这似乎是不必要的复杂性。@BenTrengrove,这是我尝试的第一件事。@TrevorHart是的,这是我的备份计划,但由于我的阵列在后台更改,因此每次更改我都必须创建一个新列表。我想避免这么多工作。谢谢!这是一个有趣的解决方案,它满足了我的需要。我使用的布局文件是这样的:
正好证明了这句格言——只要是软件,任何事情都是可能的!谢谢这仍然会在布局中创建空行@阿杰的建议成功了。哦!但是我今天早上刚刚测试了它,请分享你的代码,让我看看…谢谢你的回答(我认为它很有用)。我确信它适用于listview。我在回收站,不创建/设置视图似乎不起作用。@GreenBee谢谢dev