Hello.

I am trying to implement a search using ListView as a fragment. In the MainActivity toolbar .

The code for the ListView itself:

 public class ListViewFragment extends Fragment { ArrayList<Contact> contacts; private ContactAdapter contactAdapter; private DbWorker db; private ListView listView; private String orderBy; private SearchView.OnQueryTextListener queryTextListener; private SearchView searchView; private static final String TAG = "MainActivity class"; private static final String SORT_BY = "sortBy" ; private final static String SORT_BY_NAME = "name"; private final static String SORT_BY_CATEGORY = "category"; public ListViewFragment(){} public static ListViewFragment newInstanceLvFragment(final String typeOfSort) { final ListViewFragment listViewFragment = new ListViewFragment(); final Bundle args = new Bundle(1); args.putString(SORT_BY, typeOfSort); listViewFragment.setArguments(args); return listViewFragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); final Bundle arguments = getArguments(); if (arguments == null || !arguments.containsKey(SORT_BY)) { orderBy = null; } else { orderBy = arguments.getString(SORT_BY); } } @Override public void onResume() { super.onResume(); setHasOptionsMenu(true); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.listviewfragment, container, false); listView = (ListView) v.findViewById(R.id.listview); new DbAsyncTask(v.getContext()).execute(); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { FragmentTransaction fTrans = getFragmentManager().beginTransaction(); Contact contact = contactAdapter.getContact(position); ChangeContactFragment changeContactFragment = ChangeContactFragment .newInstanceChangeFragment(contact.getContactId(), contact.getContactName() ,contact.getContactPhone(), contact.getContactCategory() ,contact.getContactOrgName(), contact.getDate()); fTrans.setCustomAnimations(R.animator.slide_in_left, R.animator.slide_in_right); fTrans.replace(R.id.fragContainer, changeContactFragment) .addToBackStack(null) .commit(); } }); FloatingActionButton fab = (FloatingActionButton) v.findViewById(R.id.fabAdd); fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Fragment addContactFragment = new AddContactFragment(); FragmentTransaction fTrans = getFragmentManager().beginTransaction(); fTrans.setCustomAnimations(R.animator.slide_in_left, R.animator.slide_in_right); fTrans.replace(R.id.fragContainer, addContactFragment) .addToBackStack(null) .commit(); } }); return v; } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.menu_main, menu); MenuItem searchItem = menu.findItem(R.id.action_search); searchView = (SearchView) MenuItemCompat.getActionView(searchItem); queryTextListener = new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { return false; } @Override public boolean onQueryTextChange(String newText) { contactAdapter.getFilter().filter(newText); return true; } }; searchView.setOnQueryTextListener(queryTextListener); } @Override public boolean onOptionsItemSelected(MenuItem item) { //убрал код, здесь сортировки, работают без проблем.} private class DbAsyncTask extends AsyncTask<Void, Void, ArrayList<Contact>> { private Context ctx; public DbAsyncTask(Context ctx) { this.ctx = ctx; } @Override protected ArrayList<Contact> doInBackground(Void... params) { try { db = new DbWorker(ctx); contacts = (ArrayList<Contact>) db.selectAllContacts(orderBy); } catch (Exception e) { Log.e(TAG, "Exception in AsyncTask.doInBackground"); } return contacts; } @Override protected void onPostExecute(ArrayList<Contact> contacts) { contactAdapter = new ContactAdapter(ctx, contacts); listView.setAdapter(contactAdapter); } } } 

Adapter code:

 public class ContactAdapter extends BaseAdapter implements Filterable{ private Context ctx; private LayoutInflater lInflater; private ArrayList<Contact> contactList; private ArrayList<Contact> filteredContactList; private ContactFilter contactFilter; public ContactAdapter(Context context, ArrayList<Contact> contacts) { this.ctx = context; this.contactList = contacts; this.filteredContactList = contacts; this.lInflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE); getFilter(); } @Override public int getCount() { return contactList.size(); } @Override public Object getItem(int position) { return contactList.get(position); } @Override public long getItemId(int position) { return position; } public Contact getContact(int position) { return ((Contact) getItem(position)); } @Override public View getView(int position, View convertView, final ViewGroup parent) { //нет проблем } @Override public Filter getFilter() { if (contactFilter == null) { contactFilter = new ContactFilter(); } return contactFilter; } private class ContactFilter extends Filter { @Override protected FilterResults performFiltering(CharSequence constraint) { FilterResults filterResults = new FilterResults(); if (constraint !=null && constraint.length() > 0) { ArrayList<Contact> tempList = new ArrayList<>(); for (Contact contact : contactList) { if (contact.getContactName().toLowerCase().contains(constraint.toString().toLowerCase())) { tempList.add(contact); } } filterResults.count = tempList.size(); filterResults.values = tempList; } else { filterResults.count = contactList.size(); filterResults.values = contactList; } return filterResults; } @Override protected void publishResults(CharSequence constraint, FilterResults results) { filteredContactList = (ArrayList<Contact>) results.values; notifyDataSetChanged(); } } 

As a result, the search does not work. I enter the data for the search in the field, nothing happens. Please help me find out where the error is.

  • Your filtered list is filteredContactList , and getItem and so on. do by contactList . - Yura Ivanov
  • @Yura Ivanov, thanks. You are right, there is confusion. - Krabs

1 answer 1

Required in getCount () methods; and getItem (int position); replace contactList with filteredContactList