我正在创建一个Android应用程序。在应用程序中,我有一个登录页面。登录后,将显示用户列表。用户列表活动是HomeActivity.java,其中包含两个名为UserListFragment.java和ChatFragment.java的片段。用户列表将从firebase显示。 UserListFragment.java包含一个操作栏,其中包含搜索菜单和注销菜单。
我在actionbar中使用searchview并且工作正常,即搜索内容。但我有两个问题。
1)如果我搜索不存在的东西。假设列表视图中有“Rider”,所以它会搜索但是如果我输入“Rids”并且listview不包含任何具有相似字母的用户,那么只要我输入“s”我的应用就会崩溃。
2)现在,我面临的下一个问题是。我有用户列表,当我点击某个用户时,它转到另一个片段,即ChatFragment。现在,如果我从ChatFragment返回到显示我的列表的UserFragment,则只显示我之前搜索过的名称的用户,而不是我原来的用户列表。
我发布的代码与我的问题相关。如果您需要任何其他代码,请告诉我。
CustomAdapter.java
@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;
}
UserListFragment.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;
}
});
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)