Java 片段中的Searchview问题
我使用片段中的searchview在listview中进行搜索。我能够执行搜索,但我面临两个问题 1) 当列表中没有匹配的用户时,它会给出最后一次搜索的结果 我想要什么: 我想显示一条消息,说“没有搜索结果” 我尝试过的: 我用listview所在的xml和java文件中的textview创建了一个文本视图,在设置适配器值后,我使用了setEmptyView方法,但仍然没有得到想要的结果 XML代码Java 片段中的Searchview问题,java,android,listview,android-fragments,Java,Android,Listview,Android Fragments,我使用片段中的searchview在listview中进行搜索。我能够执行搜索,但我面临两个问题 1) 当列表中没有匹配的用户时,它会给出最后一次搜索的结果 我想要什么: 我想显示一条消息,说“没有搜索结果” 我尝试过的: 我用listview所在的xml和java文件中的textview创建了一个文本视图,在设置适配器值后,我使用了setEmptyView方法,但仍然没有得到想要的结果 XML代码 <LinearLayout xmlns:android="http://schemas.a
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
tools:context="com.rider.project.Fragments.UsersListFragment">
<ListView android:id="@android:id/list"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="visible"/>
<TextView android:id="@android:id/empty"
android:gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@android:color/black"
android:text="No search results"
android:visibility="gone"/>
</LinearLayout>
我尝试了各种解决方案,但仍然找不到结果。
2) 我在一个片段中有一个userlistUserListsFragment.java
,其中有我的searchview,如果我们搜索某个用户,列表会显示搜索结果。单击任何用户名,聊天屏幕将打开ChatFragment.java
。现在,当我在聊天屏幕上按下后退按钮时,列表中只有那些搜索到的用户可用,搜索菜单也会关闭
我想要什么:
单击“上一步”按钮,我希望完整的列表不仅显示以前搜索的用户
我所做的
listView = (ListView) view.findViewById(android.R.id.list);
adapter = new CustomAdapter(getActivity(),R.layout.program_list, users );
listView.setAdapter(adapter);
listView.setEmptyView(view.findViewById(android.R.id.empty));
UserListsFragment.java
@Override
public void onCreateOptionsMenu(Menu menu,MenuInflater inflater) {
inflater.inflate(R.menu.menu_userlist,menu);
MenuItem item = menu.findItem(R.id.menuSearch);
SearchView searchView = (SearchView)item.getActionView();
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
Log.i(TAG,newText);
adapter.getFilter().filter(newText);
return true;
}
});
super.onCreateOptionsMenu(menu,inflater);
}
private void logoutUser(){
Intent I = new Intent(getActivity(), LoginActivity.class);
startActivity(I);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menuSearch :
return true;
case R.id.menuLogout :
logoutUser();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
@Override
public Filter getFilter() {
Filter filter = new Filter() {
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint,FilterResults results) {
if (results.values != null) {
clear();
addAll((List<UserData>) results.values);
arrayList = (List<UserData>) results.values;
notifyDataSetChanged();
}
}
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults(); // Holds the results of a filtering operation in values
List<UserData> FilteredArrList = new ArrayList<UserData>();
if (mOriginalValues == null) {
mOriginalValues = new ArrayList<UserData>(arrayList); // saves the original data in mOriginalValues
}
if (constraint == null || constraint.length() == 0) {
// set the Original result to return
results.count = mOriginalValues.size();
results.values = mOriginalValues;
} else {
constraint = constraint.toString().toLowerCase();
for (int i = 0; i < mOriginalValues.size(); i++) {
String data = mOriginalValues.get(i).getName();
if (data.toLowerCase().contains(constraint.toString())) {
FilteredArrList.add(mOriginalValues.get(i));
results.count = FilteredArrList.size();
results.values = FilteredArrList;
}
}
// set the Filtered result to return
}
return results;
}
};
return filter;
}
}
CustomAdapter.java
@Override
public void onCreateOptionsMenu(Menu menu,MenuInflater inflater) {
inflater.inflate(R.menu.menu_userlist,menu);
MenuItem item = menu.findItem(R.id.menuSearch);
SearchView searchView = (SearchView)item.getActionView();
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
Log.i(TAG,newText);
adapter.getFilter().filter(newText);
return true;
}
});
super.onCreateOptionsMenu(menu,inflater);
}
private void logoutUser(){
Intent I = new Intent(getActivity(), LoginActivity.class);
startActivity(I);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menuSearch :
return true;
case R.id.menuLogout :
logoutUser();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
@Override
public Filter getFilter() {
Filter filter = new Filter() {
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint,FilterResults results) {
if (results.values != null) {
clear();
addAll((List<UserData>) results.values);
arrayList = (List<UserData>) results.values;
notifyDataSetChanged();
}
}
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults(); // Holds the results of a filtering operation in values
List<UserData> FilteredArrList = new ArrayList<UserData>();
if (mOriginalValues == null) {
mOriginalValues = new ArrayList<UserData>(arrayList); // saves the original data in mOriginalValues
}
if (constraint == null || constraint.length() == 0) {
// set the Original result to return
results.count = mOriginalValues.size();
results.values = mOriginalValues;
} else {
constraint = constraint.toString().toLowerCase();
for (int i = 0; i < mOriginalValues.size(); i++) {
String data = mOriginalValues.get(i).getName();
if (data.toLowerCase().contains(constraint.toString())) {
FilteredArrList.add(mOriginalValues.get(i));
results.count = FilteredArrList.size();
results.values = FilteredArrList;
}
}
// set the Filtered result to return
}
return results;
}
};
return filter;
}
}
@覆盖
公共过滤器getFilter(){
过滤器过滤器=新过滤器(){
@抑制警告(“未选中”)
@凌驾
受保护的void publishResults(CharSequence约束、FilterResults结果){
如果(results.values!=null){
清除();
addAll((列表)results.values);
arrayList=(列表)results.values;
notifyDataSetChanged();
}
}
@凌驾
受保护的筛选器结果性能筛选(CharSequence约束){
FilterResults results=new FilterResults();//以值的形式保存筛选操作的结果
List FilteredArrList=新建ArrayList();
if(mOriginalValues==null){
mOriginalValues=new ArrayList(ArrayList);//将原始数据保存在mOriginalValues中
}
if(constraint==null | | constraint.length()==0){
//将原始结果设置为return
results.count=mOriginalValues.size();
结果.值=mOriginalValues;
}否则{
constraint=constraint.toString().toLowerCase();
for(int i=0;i
当您搜索某个内容但没有找到任何内容时,请将空文本视图设置为“无搜索结果”
,然后再次将其设置为列表视图
,如下所示:
tv.setText("No search results");
listView.setEmptyView(tv);
您需要一些自定义适配器,如:
类适配器扩展
{…
并重写其onBind
和匹配方法我已经在扩展公共类CustomAdapter扩展ArrayAdapter实现Filterable
所以不要扩展ArrayAdapter,扩展MatchableArrayAdapter insteadIt给我一个错误“无法解析符号MatchableArrayAdapter你在我的第一个co中有一个链接。”梅门特