Java 如何为自定义布局适配器android studio创建搜索过滤器

Java 如何为自定义布局适配器android studio创建搜索过滤器,java,android,Java,Android,我能够用单个输入为listview创建搜索过滤器,但无法为具有3个值的自定义布局创建搜索过滤器。使用我创建的过滤器时,所有文本都会从列表视图中消失。我想能够过滤任何输入,无论是名字,姓氏或最喜欢的食物 (ViewListContents.this).adapter.getFilter().filter(charSequence) 使用此代码无效 ViewListContents类: DatabaseHelper myDB; ArrayList<User> userList; List

我能够用单个输入为listview创建搜索过滤器,但无法为具有3个值的自定义布局创建搜索过滤器。使用我创建的过滤器时,所有文本都会从列表视图中消失。我想能够过滤任何输入,无论是名字,姓氏或最喜欢的食物

(ViewListContents.this).adapter.getFilter().filter(charSequence)

使用此代码无效

ViewListContents类:

DatabaseHelper myDB;
ArrayList<User> userList;
ListView listView;
User user;
ThreeColumn_ListAdapter adapter;

private List<User> userL = null;
private ArrayList<User> arraylist;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.viewcontents_layout);

    myDB = new DatabaseHelper(this);
    final EditText filter = (EditText) findViewById(R.id.searchFilter);

    userList = new ArrayList<>();
    Cursor data = myDB.getListContents();
    int numRows = data.getCount();
    if(numRows == 0){
        Toast.makeText(ViewListContents.this,"The Database is empty  :(.",Toast.LENGTH_LONG).show();
    }else{
        int i=0;
        while(data.moveToNext()){
            user = new User(data.getString(1),data.getString(2),data.getString(3));
            userList.add(i,user);
            System.out.println(data.getString(1)+" "+data.getString(2)+" "+data.getString(3));
            System.out.println(userList.get(i).getFirstName());
            i++;
        }
        adapter =  new ThreeColumn_ListAdapter(this,R.layout.list_adapter_view, userList);
        listView = (ListView) findViewById(R.id.listView);
        listView.setAdapter(adapter);
        //listView.setTextFilterEnabled(true);
    }
    filter.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

        }

        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
            (ViewListContents.this).adapter.getFilter().filter(charSequence);
        }

        @Override
        public void afterTextChanged(Editable editable) {

        }
    });


}
自定义适配器类:

private LayoutInflater mInflater;
private ArrayList<User> users;
private int mViewResourceId;

public ThreeColumn_ListAdapter(Context context, int textViewResourceId, ArrayList<User> users) {
    super(context, textViewResourceId, users);
    this.users = users;
    mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    mViewResourceId = textViewResourceId;
}

public View getView(int position, View convertView, ViewGroup parent) {
    convertView = mInflater.inflate(mViewResourceId, null);

    User user = users.get(position);

    if (user != null) {
        TextView firstName = (TextView) convertView.findViewById(R.id.textFirstName);
        TextView lastName = (TextView) convertView.findViewById(R.id.textLastName);
        TextView favFood = (TextView) convertView.findViewById(R.id.textFavFood);
        if (firstName != null) {
            firstName.setText(user.getFirstName());
        }
        if (lastName != null) {
            lastName.setText((user.getLastName()));
        }
        if (favFood != null) {
            favFood.setText((user.getFavFood()));
        }
    }

    return convertView;
}
private layoutiner mInflater;
私有ArrayList用户;
私有int-mViewResourceId;
public ThreeColumn_ListAdapter(上下文上下文、int textViewResourceId、ArrayList用户){
超级(上下文、textViewResourceId、用户);
this.users=用户;
mInflater=(LayoutInflater)context.getSystemService(context.LAYOUT\u充气机\u服务);
mViewResourceId=textViewResourceId;
}
公共视图getView(int位置、视图转换视图、视图组父视图){
convertView=mInflater.inflate(mViewResourceId,null);
User=users.get(位置);
如果(用户!=null){
TextView firstName=(TextView)convertView.findViewById(R.id.textFirstName);
TextView lastName=(TextView)convertView.findViewById(R.id.textLastName);
TextView favFood=(TextView)convertView.findViewById(R.id.textFavFood);
if(firstName!=null){
firstName.setText(user.getFirstName());
}
if(lastName!=null){
setText((user.getLastName());
}
如果(favFood!=null){
setText((user.getFavFood());
}
}
返回视图;
}

您有一个名为filter的方法(来自从BaseAdapter扩展而来的适配器类)。在这个方法中(返回void),当检查每个数据项时,不要检查“input text”的洞,而是通过一个简单的循环检查“input text”的每个部分。 按照这个顺序,您可以实现“逻辑或”检查每个部分是否存在。
当一个零件包含在数据项中时,您可以停止搜索(确定,此项为true以显示),然后

您没有显示要扩展的
适配器
类,但它可能是
阵列适配器
ArrayAdapter
内置的
Filter
在项目的
toString()返回上进行筛选。
User
类不重写
toString()
,因此它返回类似于
com.package.name的内容。User@1234abcd
。显然,这不太可能匹配您试图筛选的任何内容,这就是为什么所有内容都会消失的原因。如果您的意思是希望筛选文本与这三件事中的任何一件相匹配,那么简单、简单的解决方法是将
User
中的
toString()
覆盖到
return FirstName+“”+LastName+“”+FavFood
private LayoutInflater mInflater;
private ArrayList<User> users;
private int mViewResourceId;

public ThreeColumn_ListAdapter(Context context, int textViewResourceId, ArrayList<User> users) {
    super(context, textViewResourceId, users);
    this.users = users;
    mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    mViewResourceId = textViewResourceId;
}

public View getView(int position, View convertView, ViewGroup parent) {
    convertView = mInflater.inflate(mViewResourceId, null);

    User user = users.get(position);

    if (user != null) {
        TextView firstName = (TextView) convertView.findViewById(R.id.textFirstName);
        TextView lastName = (TextView) convertView.findViewById(R.id.textLastName);
        TextView favFood = (TextView) convertView.findViewById(R.id.textFavFood);
        if (firstName != null) {
            firstName.setText(user.getFirstName());
        }
        if (lastName != null) {
            lastName.setText((user.getLastName()));
        }
        if (favFood != null) {
            favFood.setText((user.getFavFood()));
        }
    }

    return convertView;
}