Android 自定义适配器的Listview Searchview工作不正常
我正在创建一个android应用程序。在应用程序中,我有一个登录页面。登录后,将显示用户列表。userlist活动是HomeActivity.java,它包含两个名为UserListFragment.java和ChatFragment.java的片段。userlist是从firebase显示的。java包含一个actionbar,它有一个搜索菜单和注销菜单 我在actionbar中使用searchview,它工作正常,即搜索内容。但我有两个问题 1) 如果我搜索不存在的东西。假设listview中有“Rider”,那么它将进行搜索,但如果我键入“Rids”,并且listview中不包含任何类似字母的用户,那么一旦我键入“s”,我的应用程序就会崩溃 2) 现在,我面临的下一个问题是。我有userlist,当我点击某个用户时,它会转到另一个片段,即ChatFragment。现在,如果我从ChatFragment返回到显示我的列表的UserFragment,则只显示我之前搜索过的用户名,而不是我的原始userlist 我正在发布与我的问题相关的代码。如果您需要任何其他代码,请告诉我 CustomAdapter.javaAndroid 自定义适配器的Listview Searchview工作不正常,android,listview,android-fragments,searchview,Android,Listview,Android Fragments,Searchview,我正在创建一个android应用程序。在应用程序中,我有一个登录页面。登录后,将显示用户列表。userlist活动是HomeActivity.java,它包含两个名为UserListFragment.java和ChatFragment.java的片段。userlist是从firebase显示的。java包含一个actionbar,它有一个搜索菜单和注销菜单 我在actionbar中使用searchview,它工作正常,即搜索内容。但我有两个问题 1) 如果我搜索不存在的东西。假设listview
@Override
public Filter getFilter() {
Filter filter = new Filter() {
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint,FilterResults results) {
if (results != 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();
// Log.i(TAG,mOriginalValues.toString());
for (int i = 0; i < mOriginalValues.size(); i++) {
String data = mOriginalValues.get(i).getName();
//String temp = mOriginalValues.add()
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;
}
@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;
}
});
SearchView.OnCloseListener closeListener = new SearchView.OnCloseListener(){
@Override
public boolean onClose() {
adapter.getFilter().filter("");
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);
}
}
日志
E/AndroidRuntime: FATAL EXCEPTION: main
Process: , PID: 21743
java.lang.NullPointerException: Attempt to invoke interface method 'java.lang.Object[] java.util.Collection.toArray()' on a null object reference
at java.util.ArrayList.addAll(ArrayList.java:188)
at android.widget.ArrayAdapter.addAll(ArrayAdapter.java:195)
at CustomAdapter$1.publishResults(CustomAdapter.java:135)
at android.widget.Filter$ResultsHandler.handleMessage(Filter.java:282)
at android.os.Handler.dispatchMessage(Handler.java:111)
at android.os.Looper.loop(Looper.java:194)
at android.app.ActivityThread.main(ActivityThread.java:5637)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:959)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:754)
D/Surface: Surface::setBuffersDimensions(this=0x7f8ea1b400,w=720,h=1280)
关于问题1,您得到了什么错误。请把你的书包寄出去trace@darwin添加了堆栈跟踪。我认为问题在于addAll((List)results.values);,可能是result.values为null。请确保result.values不为null。您能帮助我如何解决此问题吗。?如果名为的用户不在场,我可以告诉您我想做什么。如果没有结果,我想在我的listview中打印一条没有搜索结果的语句,这通常发生在应用程序中。请使用“if(results.values!=null)”而不是“if(results!=null)”,并检查崩溃是否仍然发生