gpt4 book ai didi

java - 在操作栏上搜索 ListView 项目

转载 作者:搜寻专家 更新时间:2023-11-01 07:46:23 26 4
gpt4 key购买 nike

你好我是android studio的新手。我想在不使用数据库的情况下搜索操作栏上的 ListView 项目。目前我的代码只显示带有多行文本的ListView。你能帮助我使用搜索小部件而不是 editText 来实现这一点吗?

最佳答案

<强>1。添加搜索菜单

创建一个带有搜索菜单项的菜单资源文件(当点击搜索菜单项时,搜索小部件将出现在操作栏中)。
以下是我创建的示例菜单资源 (res/menu/search_menu.xml)

<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/search"
android:title="Search"
android:icon="@drawable/search"
android:showAsAction="collapseActionView|ifRoom"
android:actionViewClass="android.widget.SearchView" />
</menu>

在上面的菜单项中,collapseActionView 属性允许您的 SearchView 扩展以占据整个操作栏,并在不使用时折叠回正常的操作栏项

<强>2。创建 SearchableConfiguration

可搜索配置定义 SearchView 的行为方式
需要在 xml(res/xml/searchable.xml) 中定义它。以下是一个可搜索的配置文件示例

<?xml version="1.0" encoding="utf-8"?>
<searchable
xmlns:android="http://schemas.android.com/apk/res/android"
android:label="@string/app_name"
android:hint="Search friend">
</searchable>

然后将此元素添加到带有标签的相关 Activity 中

<activity
android:name=".ui.FriendListActivity"
android:screenOrientation="portrait"
android:configChanges="orientation"
android:theme="@style/Theme.Yello"
android:windowSoftInputMode="stateHidden"
android:launchMode="singleTask"
android:parentActivityName=".ui.SensorDetailsActivity">
<meta-data
android:name="android.app.searchable"
android:resource="@xml/searchable">
</meta-data>
</activity>

在我的场景中,我要将 SearchView 添加到 FriendListActivity

<强>3。添加菜单和 SearchableConfiguration 到 Activity

将可搜索配置与 Activity 类中的 SearchView 相关联

@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.search_menu, menu);

SearchManager searchManager = (SearchManager)
getSystemService(Context.SEARCH_SERVICE);
searchMenuItem = menu.findItem(R.id.search);
searchView = (SearchView) searchMenuItem.getActionView();

searchView.setSearchableInfo(searchManager.
getSearchableInfo(getComponentName()));
searchView.setSubmitButtonEnabled(true);
searchView.setOnQueryTextListener(this);

return true;
}

现在 SearchView 添加到 Activity 中。但搜索功能仍然不起作用

<强>4。添加搜索功能

在activity中实现SearchView.OnQueryTextListener,现在需要覆盖两个新方法

public boolean onQueryTextSubmit(String query)
public boolean onQueryTextChange(String newText)

该接口(interface)监听SearchView中的文本变化事件

@Override
public boolean onQueryTextSubmit(String query) {
return false;
}

@Override
public boolean onQueryTextChange(String newText) {
friendListAdapter.getFilter().filter(newText);

return true;
}

这里的 onQueryTextChange 函数使用列表适配器进行过滤,为了进行过滤,适配器需要实现 Filterable 接口(interface)

4.可过滤适配器

在我的场景中,我使用了 BaseAdapter 来实现 Filterable 接口(interface)
以下是我的适配器类(FriendListAdapter)的实现

import android.content.Context;
import android.graphics.Typeface;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.*;
import com.score.senzors.R;
import com.score.senzors.pojos.User;

import java.util.ArrayList;

/**
* Display friend list
*
*/
public class FriendListAdapter extends BaseAdapter implements Filterable {
private FriendListActivity activity;
private FriendFilter friendFilter;
private Typeface typeface;
private ArrayList<User> friendList;
private ArrayList<User> filteredList;

/**
* Initialize context variables
* @param activity friend list activity
* @param friendList friend list
*/
public FriendListAdapter(FriendListActivity activity, ArrayList<User> friendList) {
this.activity = activity;
this.friendList = friendList;
this.filteredList = friendList;
typeface = Typeface.createFromAsset(activity.getAssets(), "fonts/vegur_2.otf");

getFilter();
}

/**
* Get size of user list
* @return userList size
*/
@Override
public int getCount() {
return filteredList.size();
}

/**
* Get specific item from user list
* @param i item index
* @return list item
*/
@Override
public Object getItem(int i) {
return filteredList.get(i);
}

/**
* Get user list item id
* @param i item index
* @return current item id
*/
@Override
public long getItemId(int i) {
return i;
}

/**
* Create list row view
* @param position index
* @param view current list item view
* @param parent parent
* @return view
*/
@Override
public View getView(int position, View view, ViewGroup parent) {
// A ViewHolder keeps references to children views to avoid unnecessary calls
// to findViewById() on each row.
final ViewHolder holder;
final User user = (User) getItem(position);

if (view == null) {
LayoutInflater layoutInflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = layoutInflater.inflate(R.layout.friend_list_row_layout, parent, false);
holder = new ViewHolder();
holder.iconText = (TextView) view.findViewById(R.id.icon_text);
holder.name = (TextView) view.findViewById(R.id.friend_list_row_layout_name);
holder.iconText.setTypeface(typeface, Typeface.BOLD);
holder.iconText.setTextColor(activity.getResources().getColor(R.color.white));
holder.name.setTypeface(typeface, Typeface.NORMAL);

view.setTag(holder);
} else {
// get view holder back
holder = (ViewHolder) view.getTag();
}

// bind text with view holder content view for efficient use
holder.iconText.setText("#");
holder.name.setText(user.getEmail());
view.setBackgroundResource(R.drawable.friend_list_selector);

return view;
}

/**
* Get custom filter
* @return filter
*/
@Override
public Filter getFilter() {
if (friendFilter == null) {
friendFilter = new FriendFilter();
}

return friendFilter;
}

/**
* Keep reference to children view to avoid unnecessary calls
*/
static class ViewHolder {
TextView iconText;
TextView name;
}

/**
* Custom filter for friend list
* Filter content in friend list according to the search text
*/
private class FriendFilter extends Filter {

@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults filterResults = new FilterResults();
if (constraint!=null && constraint.length()>0) {
ArrayList<User> tempList = new ArrayList<User>();

// search content in friend list
for (User user : friendList) {
if (user.getEmail().toLowerCase().contains(constraint.toString().toLowerCase())) {
tempList.add(user);
}
}

filterResults.count = tempList.size();
filterResults.values = tempList;
} else {
filterResults.count = friendList.size();
filterResults.values = friendList;
}

return filterResults;
}

/**
* Notify about filtered list to ui
* @param constraint text
* @param results filtered result
*/
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
filteredList = (ArrayList<User>) results.values;
notifyDataSetChanged();
}
}

}

在这里我定义了自定义过滤器类 FriendFilter 来进行过滤,我根据在 SearchView 中输入的名称过滤列表

关于java - 在操作栏上搜索 ListView 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43426987/

26 4 0