Хобрук: Ваш путь к мастерству в программировании

Вызов адаптера из фрагментов в ViewPager

У меня есть Fragment, у которого есть searchview и viewpager. Мой просмотрщик имеет 3 фрагмента, и каждый фрагмент вызывает адаптер. Теперь, чтобы реализовать searchview, мне нужно вызвать адаптер видимого фрагмента в пейджере представления.

SlidingTab(фрагмент с searchview и ViewPager):

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/frame_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.RareMediaCompany.BDTrial.SlidingTab">

    <include
        android:id="@+id/toolbar1"
        layout="@layout/toolbar_job" />

    <com.RareMediaCompany.BDTrial.Utils.CustomTabLayout
        android:id="@+id/sliding_tabs"
        style="@style/CustomTabLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#eeeeee"
        app:tabIndicatorColor="#f39220"
        app:tabIndicatorHeight="3dp"
        app:tabMaxWidth="0dp"
        app:tabMode="fixed"
        app:tabPaddingEnd="0dp"
        app:tabPaddingStart="0dp"
        app:tabTextAppearance="@android:style/TextAppearance.Widget.TabWidget"
        app:tabSelectedTextColor="#808080" />

    <LinearLayout
        android:id="@+id/linear1"
        android:background="@android:color/white"
        android:layout_width="match_parent"
        android:layout_height="70dp"
        android:orientation="horizontal"
        android:weightSum="1">

        <android.support.v7.widget.SearchView
        android:layout_width="300dp"
        android:layout_height="45dp"
        android:id="@+id/searchView"
        android:layout_weight="0.9"
        android:layout_marginRight="5dp"
        android:layout_gravity="center"
        style="@style/CitySearchView"
        android:background="@drawable/searchview"
        android:layout_marginLeft="10dp"/>

        <LinearLayout
            android:id="@+id/list_linearlayout"
            android:layout_width="45dp"
            android:layout_height="45dp"
            android:layout_weight="0"
            android:layout_gravity="center"
            android:background="#f39220">
            <ImageView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dp"
                android:layout_weight="0.3"
                android:src="@drawable/list_icon_white"/>

        </LinearLayout>

        <LinearLayout
            android:layout_width="45dp"
            android:layout_height="45dp"
            android:layout_gravity="center"
            android:layout_weight="0"
            android:layout_marginRight="10dp"
            android:background="#75aadb">
            <ImageView
                android:layout_width="20dp"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dp"
                android:layout_marginRight="2dp"
                android:layout_weight="0.3"
                android:src="@drawable/mapmarker"/>

        </LinearLayout>


    </LinearLayout>
        <!--android:layout_width="320dp"-->
        <!--android:layout_height="wrap_content"-->
        <!--android:layout_marginLeft="10dp"-->
        <!--android:layout_marginTop="10dp"-->
        <!--android:id="@+id/searchview"/>-->

    <android.support.v4.view.ViewPager
        android:id="@+id/view_pager"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:background="@android:color/white" />

</LinearLayout>

SlidingTab.class (реализация SearchView)

public class SlidingTab extends Fragment {
    private static final String TAG = "TabLayout";
    private static String POSITION = "POSITION";
    private Context context;
    private SearchView searchview;
    private Toolbar toolbar ;


    /*searching/filteration query*/
    private SearchView.OnQueryTextListener OnQuerySearchView = new SearchView.OnQueryTextListener() {

        @Override
        public boolean onQueryTextSubmit(String arg0) {
            // TODO Auto-generated method stub
            return false;
        }

        @Override
        public boolean onQueryTextChange(String arg0) {
            // TODO Auto-generated method stub
//            if (searchCheck) {
            Log.i("Recycler query", arg0);

//            Fragment frag = new PageAdapter(getChildFragmentManager(),context).getItem(viewPager.getCurrentItem());
            PageAdapter adapter = ((PageAdapter) viewPager.getAdapter());
            Fragment fragment = adapter.getFragment(viewPager.getCurrentItem());
            return false;
        }
    };

    public SlidingTab() {
    }
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.sliding_tab, container, false);
         viewPager = (ViewPager) v.findViewById(R.id.view_pager);
        viewPager.setOffscreenPageLimit(2);
        viewPager.setAdapter(new PageAdapter(getChildFragmentManager(), context));
        slidingTab = (TabLayout) v.findViewById(R.id.sliding_tabs);
        searchview = (SearchView)v.findViewById(R.id.searchView);
        searchview.setOnQueryTextListener(OnQuerySearchView);
        return v;
    }

PageAdapter.class

public class PageAdapter extends FragmentStatePagerAdapter {
    private static final String TAG = "PageAdapter";
    final int PAGE_COUNT = 3;
    private String tabTitles[] = new String[]{"New", "In Progress", "Completed"};
    private Context context;

    public PageAdapter(FragmentManager fm, Context context) {
        super(fm);
        this.context = context;
    }


    @Override
    public Fragment getItem(int position) {
        Log.d(TAG, "New Instance Created :" + position);
        switch (position) {
            case 0:
                return new JobFragment();

            case 1:
                return new InProgressJobFragment();
            case 2:
                return new CompletedJobFragment();
        }
        return null;
    }


    @Override
    public CharSequence getPageTitle(int position) {
        return tabTitles[position];
    }
    @Override
    public int getCount() {
        return PAGE_COUNT;
    }


}

Адаптер Fragment RecyclerView (вызывается каждым фрагментом в пейджере представления и имеет метод фильтрации searchview)

public class JobAdapter extends RecyclerView.Adapter<JobAdapter.ViewHolder> {
    private static final String TAG = "EMPLOYEE ADAPTER";
    private static final int VIEW_NORMAL = 0;
    private ArrayList<Info> mDataset;
    private ArrayList<Info> filterList;
    private Context mAct;

    public class ViewHolder extends RecyclerView.ViewHolder {

        }
    }

    public void addApplications(ArrayList<Info> candidates) {
      }

    public void clearApplications() {
     }

    public JobAdapter(ArrayList<Info> myDataset, Context context) {
        this.mDataset = myDataset;
        this.mAct = context;
    }



    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.job_card_new, parent, false);
        ViewHolder fh = new ViewHolder(v);
        return fh;
    }

    @Override
    public void onBindViewHolder(final ViewHolder holder, final int position) {

//      }



**//    *searching/filtration on List*/**
    public void filter(String charText) {
        filterList.clear();
        if (charText.length() == 0) {
            if(mDataset != null) {
                filterList.addAll(mDataset);
            }
        } else {
            if (mDataset != null){
                for (Info wp : mDataset) {
                    if(wp.jobNumber !=null){
                        if(Pattern.compile(Pattern.quote(charText), Pattern.CASE_INSENSITIVE).matcher(wp.jobNumber).find()){
//                    if (wp.heading1.toLowerCase().contains(charText.toLowerCase())) {
                            filterList.add(wp);
                        }}else{

                    }

                    this.notifyItemRangeRemoved(0, filterList.size());

                }
            }
        }
        notifyDataSetChanged();
    }


    @Override
    public int getItemCount() {
        return mDataset.size();
    }
}

Пожалуйста, помогите мне реализовать поиск в viewpager.


Ответы:


1

С помощью загруженного кода я могу сказать, что

make метод в ваших фрагментах с именем search and call adapter filter method

public void search(String text)
{
adapter.filter(text)
}

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

 Fragment fragment = adapter.getFragment(viewPager.getCurrentItem());
24.05.2016
  • я именно так и делаю. public boolean onQueryTextChange (final String arg0) { Log.i (запрос Recycler, arg0); int id = viewPager.getCurrentItem(); Адаптер PageAdapter = ((PageAdapter) viewPager.getAdapter()); Фрагмент фрагмента = adapter.getFragment(viewPager.getCurrentItem()); if(фрагмент экземпляра JobFragment){ ((JobFragment) фрагмент).recycleAdapter.filter(arg0); } Но я получаю сообщение об ошибке: вызов метода фильтра для объекта NULL. 24.05.2016
  • нет еще не работает. Мой адаптер обнуляется каждый раз, когда я звоню. 24.05.2016
  • Вы можете загрузить код класса JobFragment? поэтому я могу проверить, почему адаптер становится нулевым 24.05.2016
  • Я принял ваш ответ, так как он действительно помог. Большое спасибо. Кроме того, было бы здорово, если бы вы проголосовали за вопрос. 26.05.2016
  • @yound_08 В любое время, чтобы помочь :) 27.05.2016

  • 2

    Я думаю, что лучший дизайн для этого — использовать Activity в качестве центрального «концентратора» для событий, которые должны пройти фрагменты.

    Вот как бы я это сделал:

    • Сначала начните с интерфейса слушателя. Это можно объявить как внутренний интерфейс Activity:

      static interface QueryListener {
      
          void onQueryChange(String query);
      }
      
    • Активность получает свойства для удержания слушателей и методы для добавления и удаления слушателей (объявлены синхронизированными, чтобы предотвратить эти надоедливые ConcurrentModificationExceptions:

      private List<QueryListener> mQueryListeners = new ArrayList<>();
      
      public synchronized void addQueryListener(@NonNull QueryListener listener) {
      
         // check if the listener was already added
         // you could also use a Set instead of a List for this
         if (mQueryListeners.contains(listener)) return;   
      
         mQueryListeners.add(listener);
      }
      
      public synchronized void removeQueryListener(@NonNull QueryListener listener) {
          mQueryListeners.remove(listener);
      }
      
    • Активность также получает метод, который может быть вызван фрагментом с SearchView:

      public synchronized void changeQuery(String query) {
      
              for (QueryListener listener : mQueryListeners) {
                  listener.onQueryChange(query);
              }
      }
      
    • Теперь ваши фрагменты с адаптерами должны реализовать QueryListener и зарегистрировать/отменить регистрацию:

      Добавьте эту строку где-нибудь в onCreate():

              ((YourActivity) getActivity()).addQueryListener(this);
      

      Отменить регистрацию в onDestroy():

          @Override
          public void onDestroy() {
              ((YourActivity) getActivity()).removeQueryListener(this);
              super.onDestroy();
          }
      

      добавьте реализацию метода QueryListener:

      @Override
      public void onQueryChange(String query) {
      
          // if (isVisible()) {      if desired
          mAdapter.filter(query);
      }
      

      Примечание. Вам не обязательно реализовывать фрагмент QueryListener; вы можете использовать анонимный класс. Но вам придется сохранить ссылку на него, чтобы вы могли вызвать removeQueryListener() позже.

    • Теперь просто подключите SearchView:

      @Override
      public boolean onQueryTextChange(String query) {
      
          ((YourActivity) getActivity()).changeQuery(query);
      }
      

    Другой шаблон, который я использовал, — это создание специального класса для регистрации/уведомления слушателей. Я создаю один экземпляр этого класса и имею метод Activity для доступа к нему:

            QueryHandler handler = ((YourActivity) getActivity()).getQueryHandler();
            // QueryHandler has all the listener properties and methods shown for the Activity
    
            ...
    
            handler.changeQuery(query);
    

    В качестве альтернативы вы также можете использовать один из многих пакетов шины событий с открытым исходным кодом, таких как Otto, для передачи событий между вашими фрагментами.

    24.05.2016
    Новые материалы

    Решения DBA Metrix
    DBA Metrix Solutions предоставляет удаленного администратора базы данных (DBA), который несет ответственность за внедрение, обслуживание, настройку, восстановление базы данных, а также другие..

    Начало работы с Блум
    Обзор и Codelab для генерации текста с помощью Bloom Оглавление Что такое Блум? Некоторые предостережения Настройка среды Скачивание предварительно обученного токенизатора и модели..

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

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

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