Android 从ViewPager中的片段调用适配器
我有一个带有searchview和viewpager的片段。我的viewpager有3个片段,每个片段调用适配器。现在要实现searchview,我需要调用视图页面中可见片段的适配器 滑动选项卡(带有searchview和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
<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获取用于保存侦听器的属性以及用于添加和删除侦听器的方法(声明为已同步以防止那些讨厌的
s: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); }
- 现在,带有适配器的片段需要实现
并注册/注销它们自己: 将此行添加到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);