簡體   English   中英

從ViewPager中的片段調用適配器

[英]Calling Adapter from Fragments in ViewPager

我有具有searchview和viewpager的片段。 我的viewpager有3個片段,每個片段都調用適配器。 現在要實現searchview,我需要在view pager中調用可見片段的適配器。

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


}

片段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中實現searchview。

借助上傳的代碼,我可以告訴我

片段中名為make的搜索方法,並調用適配器過濾器方法

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

您可以在此行之后檢查片段的實例並調用片段的搜索方法

 Fragment fragment = adapter.getFragment(viewPager.getCurrentItem());

我認為,為此的最佳設計是將“ Activity ”用作需要處理碎片的事件的中央“樞紐”。

所以這就是我要做的:

  • 首先從偵聽器界面開始。 可以將其聲明為Activity的內部接口:

     static interface QueryListener { void onQueryChange(String query); } 
  • Activity獲得用於保留偵聽器的屬性以及用於添加和刪除偵聽器的方法(聲明為同步狀態,以防止這些討厭的ConcurrentModificationException

     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); } 
  • Activity還獲得了可由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)之一在片段之間傳遞事件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM