Cómo filtrar la vista de lista usando Searchview en una actividad cuando la vista de lista está en fragmentos

Quiero implementar la siguiente pantalla:

Como puede ver aquí, SearchView se encuentra en la actividad que contiene tres pestañas. Cada pestaña se implementa usando un fragmento que a su vez contiene listview. Tengo View Pager en la actividad que contiene la vista de búsqueda. View Pager se completa a través de fragmentos usando FragmentStatePagerAdapter.I desea filtrar la vista de lista de la pestaña activa mediante la vista de búsqueda.

Código de actividad que contiene SearchView:

   @Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater menuInflater = getMenuInflater();
    menuInflater.inflate(R.menu.menu_friend_list_activity, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.action_search:
            Toast.makeText(getApplicationContext(), "Search button clicked", Toast.LENGTH_SHORT).show();

            // Associate searchable configuration with the SearchView
            SearchManager searchManager = (SearchManager) FriendsListActivity.this.getSystemService(Context.SEARCH_SERVICE);
            if (item != null) {
                searchView = (SearchView) item.getActionView();
            }
            if (searchView != null) {
                searchView.setSearchableInfo(searchManager.getSearchableInfo(FriendsListActivity.this.getComponentName()));
            }
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }

}

menu_friend_list_activity.java

  <?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/action_search"
        android:icon="@drawable/search"
        android:orderInCategory="100"
        android:title="@string/action_search"
        app:actionViewClass="android.support.v7.widget.SearchView"
        app:showAsAction="always|collapseActionView" />
</menu>

Estoy usando el código mencionado anteriormente. Creo que estoy haciendo algo mal aquí. Por favor, ayúdenme a filtrar la vista de lista contenida en el fragmento usando searchview en la actividad.

Código de trabajo editado:

Después de mucha investigación, he logrado solucionar mi problema. Estoy agregando mi código para la referencia futura:

1. Código de actividad que contiene SearchView (FriendsListActivity.java en mi caso)

   @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_friend_list_activity, menu);
        SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
        if (null != searchView) {
            searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
            searchView.setIconifiedByDefault(false);
        }

        SearchView.OnQueryTextListener queryTextListener = new SearchView.OnQueryTextListener() {
            public boolean onQueryTextChange(String newText) {
                // this is your adapter that will be filtered
                Log.e("Text",newText);
                return false;
            }

            public boolean onQueryTextSubmit(String query) {
                //Here u can get the value "query" which is entered in the search box.

               // Log.e("Query",query);
                PagerAdapter pagerAdapter = (PagerAdapter) viewPager.getAdapter();
                for(int i = 0; i < pagerAdapter.getCount(); i++) {

                    Fragment viewPagerFragment = (Fragment) viewPager.getAdapter().instantiateItem(viewPager, i);
                    if(viewPagerFragment != null && viewPagerFragment.isAdded()) {

                        if (viewPagerFragment instanceof ChatFragment){
                            ChatFragment chatFragment = (ChatFragment) viewPagerFragment;
                            if (chatFragment != null){
                                chatFragment.beginSearch(query); // Calling the method beginSearch of ChatFragment
                            }
                        }else if (viewPagerFragment instanceof GroupsFragment){
                            GroupsFragment groupsFragment = (GroupsFragment) viewPagerFragment;
                            if (groupsFragment != null){
                                groupsFragment.beginSearch(query); // Calling the method beginSearch of GroupsFragment
                            }
                        }else if (viewPagerFragment instanceof ContactsFragment){
                            ContactsFragment contactsFragment = (ContactsFragment) viewPagerFragment;
                            if (contactsFragment != null){
                                contactsFragment.beginSearch(query); // Calling the method beginSearch of ContactsFragment
                            }
                        }
                    }
                }

                return false;

            }
        };
        searchView.setOnQueryTextListener(queryTextListener);

        return super.onCreateOptionsMenu(menu);
    }

He usadoesta enlace para encontrar el fragmento que se muestra actualmente en el buscapersonas.

Puede ver en el código mencionado anteriormente que estoy pasando la cadena de consulta de la vista de búsqueda de la actividad a fragmentar usando un nombre de método beginSearch () dentro de Fragment.

2. Método dentro del Fragmento (ContactsFragment.java en mi caso)

public void beginSearch(String query) {
    Log.e("QueryFragment", query);
    adapter_contacts.getFilter().filter(query);
}

Aquí adapter_contacts es el adaptador que llena la vista de lista de Fragment llamada ContactsFragment.

3.Código de adaptador (Adapter_Contacts.java en mi caso)

public class Adapter_Contacts extends BaseAdapter implements Filterable {
private Context context;
private List<Bean_Contacts> listContacts;
private LayoutInflater inflater;
private ApiConfiguration apiConfiguration;
List<Bean_Contacts> mStringFilterList;
ValueFilter valueFilter;


public Adapter_Contacts(Context context, List<Bean_Contacts> listContacts) {
    this.context = context;
    this.listContacts = listContacts;
    mStringFilterList = listContacts;
}


@Override
public int getCount() {
    return listContacts.size();
}

@Override
public Object getItem(int i) {
    return listContacts.get(i);
}

@Override
public long getItemId(int i) {
    return i;
}

@Override
public View getView(int i, View view, ViewGroup viewGroup) {
    if (inflater == null)
        inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    if (view == null)
        view = inflater.inflate(R.layout.feed_item_contact_list, null);

    //Getting views
    ImageView img = (ImageView) view.findViewById(R.id.imgContact);
    TextView txtName = (TextView) view.findViewById(R.id.txtNam);
    TextView txtStatus = (TextView) view.findViewById(R.id.stats);

    Bean_Contacts bean_contacts = listContacts.get(i);
    String name = bean_contacts.getName();
    Log.e("NameAdapter", name);
    String url = bean_contacts.getUrl();
    Log.e("URLAdapter", url);
    String extension = bean_contacts.getExtension();
    String status = bean_contacts.getStatus();

    apiConfiguration = new ApiConfiguration();
    String api = apiConfiguration.getApi();
    String absoluteURL = api + "/" + url + "." + extension;
    Log.e("AbsoluteURLAdapter", absoluteURL);

    Picasso.with(context).load(absoluteURL).error(R.drawable.default_avatar).into(img); //Loading image into the circular Image view using Picasso
    txtName.setText(name);
    txtStatus.setText(status);

    return view;
}

@Override
public Filter getFilter() {
    if (valueFilter == null) {
        valueFilter = new ValueFilter();
    }
    return valueFilter;
}

private class ValueFilter extends Filter {
    @Override
    protected FilterResults performFiltering(CharSequence constraint) {

        String str = constraint.toString().toUpperCase();
        Log.e("constraint", str);
        FilterResults results = new FilterResults();

        if (constraint != null && constraint.length() > 0) {
            ArrayList<Bean_Contacts> filterList = new ArrayList<Bean_Contacts>();
            for (int i = 0; i < mStringFilterList.size(); i++) {
                if ((mStringFilterList.get(i).getName().toUpperCase())
                        .contains(constraint.toString().toUpperCase())) {
                    Bean_Contacts bean_contacts = mStringFilterList.get(i);
                    filterList.add(bean_contacts);
                }
            }
            results.count = filterList.size();
            results.values = filterList;
        } else {
            results.count = mStringFilterList.size();
            results.values = mStringFilterList;
        }
        return results;

    }

    @Override
    protected void publishResults(CharSequence constraint, FilterResults results) {
        listContacts = (ArrayList<Bean_Contacts>) results.values;
        notifyDataSetChanged();
    }

}

}

Aquí estoy usando la interfaz Filtrable y la clase Filtro. Esto es lo que he hecho para implementar la búsqueda de contenido de fragmentos usando un único SearchView dentro de la Actividad. Tenga en cuenta que Mi Actividad contiene SearchView, 3 pestañas y ViewPager.ViewPager se rellena a través de fragmentos usando FragmentStatePagerAdapter.

Respuestas a la pregunta(0)

Su respuesta a la pregunta