So filtern Sie die Listenansicht mithilfe der Suchansicht in einer Aktivität, wenn die Listenansicht fragmentiert ist

Ich möchte den folgenden Bildschirm implementieren:

Wie Sie hier sehen können, befindet sich SearchView in der Aktivität, die drei Registerkarten enthält. Jede Registerkarte wird mithilfe eines Fragments implementiert, das wiederum eine Listenansicht enthält. In der Aktivität, die die Suchansicht enthält, ist View Pager mit Fragmenten gefüllt, indem FragmentStatePagerAdapter verwendet wird. Ich möchte die Listenansicht der aktiven Registerkarte mithilfe der Suchansicht filtern.

Code der Aktivität, die SearchView enthält:

   @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>

Ich verwende den oben genannten Code. Ich glaube, ich mache hier etwas falsch. Bitte helfen Sie mir, die in einem Fragment enthaltene Listenansicht mithilfe der Suchansicht in der Aktivität zu filtern.

Bearbeiteter Arbeitscode:

Nach vielen Recherchen konnte ich mein Problem beheben. Ich füge meinen Code für die zukünftige Referenz hinzu:

1. Aktivitätscode mit SearchView (FriendsListActivity.java in meinem Fall)

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

Ich habe benutztDie link, um das Fragment zu finden, das derzeit im View-Pager angezeigt wird.

Sie können im oben genannten Code sehen, dass ich die Abfragezeichenfolge von der Suchansicht der Aktivität an das Fragment übergebe, indem ich den Methodennamen beginSearch () in Fragment verwende.

2.Methode in Fragment (ContactsFragment.java in meinem Fall)

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

Hier ist adapter_contacts der Adapter, der die Listenansicht des Fragments ContactsFragment auffüllt.

3.Code des Adapters (Adapter_Contacts.java in meinem Fall)

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

}

}

Hier verwende ich Filterable-Schnittstelle und Filter-Klasse. Dies ist, was ich getan habe, um Suchinhalte des Fragments mit einem einzelnen SearchView innerhalb der Aktivität zu implementieren. Merken Sie bitte, dass meine Aktivität SearchView, 3 Vorsprünge enthält und ViewPager.ViewPager durch Fragmente mit FragmentStatePagerAdapter gefüllt wird .

Antworten auf die Frage(0)

Ihre Antwort auf die Frage