Как отфильтровать просмотр списка с помощью Searchview в действии, когда представление списка разбито на фрагменты

Я хочу реализовать следующий экран:

Как вы можете видеть здесь, SearchView находится в действии, которое содержит три вкладки. Каждая вкладка реализована с использованием фрагмента, который, в свою очередь, содержит listview. У меня есть View Pager в действии, содержащем представление поиска. View Pager заполняется через фрагменты с помощью FragmentStatePagerAdapter.I хотите отфильтровать представление списка активной вкладки с помощью представления поиска.

Код активности, содержащий 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>

Я использую вышеупомянутый код. Я думаю, что я делаю что-то не так. Пожалуйста, помогите мне отфильтровать просмотр списка, содержащийся во фрагменте, используя поиск в действии.

Отредактированный рабочий код:

После долгих исследований мне удалось исправить мою проблему. Я добавляю свой код для будущей ссылки:

1. Код активности, содержащий SearchView (FriendsListActivity.java в моем случае)

   @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);
    }

я использовалэтот ссылка, чтобы найти фрагмент, который в настоящее время отображается в пейджере просмотра.

В приведенном выше коде вы можете видеть, что я передаю строку запроса из searchview активности во фрагмент, используя имя метода beginSearch () внутри Fragment.

2. Метод внутри фрагмента (ContactsFragment.java в моем случае)

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

Здесь adapter_contacts - это адаптер, который заполняет представление списка фрагмента с именем ContactsFragment.

3. Код адаптера (Adapter_Contacts.java в моем случае)

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();
    }

}

}

Здесь я использую интерфейс Filterable и класс Filter. Это то, что я сделал для осуществления поиска содержимого фрагмента с помощью одного SearchView внутри Activity. Обратите внимание, что My Activity содержит SearchView, 3 вкладки и ViewPager.ViewPager заполняется фрагментами с использованием FragmentStatePagerAdapter.

Ответы на вопрос(0)

Ваш ответ на вопрос