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