Listview Searchview自定义适配器无法正常工作

时间:2017-02-04 05:36:17

标签: android listview android-fragments searchview

我正在创建一个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)

0 个答案:

没有答案