Android 从ViewPager中的片段调用适配器

Android 从ViewPager中的片段调用适配器,android,android-fragments,android-viewpager,android-recyclerview,Android,Android Fragments,Android Viewpager,Android Recyclerview,我有一个带有searchview和viewpager的片段。我的viewpager有3个片段,每个片段调用适配器。现在要实现searchview,我需要调用视图页面中可见片段的适配器 滑动选项卡(带有searchview和ViewPager的片段): <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/re

我有一个带有searchview和viewpager的片段。我的viewpager有3个片段,每个片段调用适配器。现在要实现searchview,我需要调用视图页面中可见片段的适配器

滑动选项卡(带有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>
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;
    }


}
片段回收视图适配器(由视图寻呼机中的每个片段调用,并使用searchview筛选方法)

公共类JobAdapter扩展了RecyclerView.Adapter{
私有静态最终字符串TAG=“EMPLOYEE ADAPTER”;
私有静态最终int视图_NORMAL=0;
私有ArrayList数据集;
私有数组列表过滤器列表;
私有上下文mAct;
公共类ViewHolder扩展了RecyclerView.ViewHolder{
}
}
公共应用程序(ArrayList候选程序){
}
公共应用程序(){
}
PublicJobAdapter(ArrayList myDataset,上下文){
this.mDataset=myDataset;
this.mAct=上下文;
}
@凌驾
public ViewHolder onCreateViewHolder(视图组父级,int-viewType){
视图v=LayoutInflater.from(parent.getContext()).flate(R.layout.job\u card\u new,parent,false);
视窗支架fh=新视窗支架(v);
返回fh;
}
@凌驾
公共无效onBindViewHolder(最终视图持有人,最终整型位置){
//      }
**//*在列表中搜索/过滤*/**
公共空过滤器(字符串图表文本){
filterList.clear();
如果(ChartText.length()==0){
if(mDataset!=null){
filterList.addAll(mDataset);
}
}否则{
if(mDataset!=null){
对于(信息wp:mDataset){
如果(wp.jobNumber!=null){
if(Pattern.compile(Pattern.quote(charText),Pattern.CASE\u不区分大小写).matcher(wp.jobNumber.find()){
//if(wp.heading1.toLowerCase().contains(charText.toLowerCase())){
过滤器列表。添加(wp);
}}否则{
}
已删除此.notifyItemRange(0,filterList.size());
}
}
}
notifyDataSetChanged();
}
@凌驾
public int getItemCount(){
返回mDataset.size();
}
}
请帮助我在viewpager中实现searchview

借助上传的代码 我看得出来

在片段中创建名为search和 调用适配器筛选器方法

public void search(String text)
{
adapter.filter(text)
}
您可以检查fragment的实例,并在此行之后调用fragment的搜索方法

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

我认为最好的设计是使用
活动
作为需要处理片段的事件的中心“中心”

所以我会这样做:

  • 首先从侦听器接口开始。这可以声明为
    活动的内部接口

    static interface QueryListener {
    
        void onQueryChange(String query);
    }
    
  • Activity获取用于保存侦听器的属性以及用于添加和删除侦听器的方法(声明为已同步以防止那些讨厌的
    ConcurrentModificationException
    s:

    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);
    }
    
  • 现在,带有适配器的片段需要实现
    QueryListener
    并注册/注销它们自己:

    将此行添加到
    onCreate()
    中的某个位置:

    onDestroy()中注销

    添加QueryListener方法实现:

    @Override
    public void onQueryChange(String query) {
    
        // if (isVisible()) {      if desired
        mAdapter.filter(query);
    }
    
    注意:您不必让片段实现
    QueryListener
    ;您可以使用匿名类。但是您必须保留对它的引用,以便稍后可以使用它调用
    removeQueryListener()

  • 现在只需连接
    搜索视图

    public synchronized void changeQuery(String query) {
    
            for (QueryListener listener : mQueryListeners) {
                listener.onQueryChange(query);
            }
    }
    
    @Override
    public boolean onQueryTextChange(String query) {
    
        ((YourActivity) getActivity()).changeQuery(query);
    }
    
我使用的另一种模式是创建一个专用类来注册/通知侦听器。我创建了这个类的一个实例,并在活动上有一个方法来访问它:

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

        ...

        handler.changeQuery(query);

或者,您也可以使用许多开源事件总线包(如Otto)中的一个在片段之间传递事件。

我正是这样做的。公共布尔onQueryTextChange(最终字符串arg0){Log.i(“回收器查询”,arg0);int id=viewPager.getCurrentItem();PageAdapter=((PageAdapter)viewPager.getAdapter();Fragment Fragment=adapter.getFragment(viewPager.getCurrentItem());if(JobFragment的片段实例){((JobFragment)Fragment.RecycledAdapter.filter(arg0);}但是我得到了一个错误:在NULL对象上调用filter方法。没有仍然不起作用。我每次调用我的适配器时都会出现NULL。你能上传JobFragment类的代码吗?这样我就可以检查适配器出现NULL的原因了。我接受了你的答案,因为它真的很有帮助。非常感谢。另外,如果你对这个问题投赞成票,那就太好了。@yound_08随时可以帮助我p:)
    @Override
    public void onDestroy() {
        ((YourActivity) getActivity()).removeQueryListener(this);
        super.onDestroy();
    }
@Override
public void onQueryChange(String query) {

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

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

        ...

        handler.changeQuery(query);