Как отфильтровать просмотр списка с помощью 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.