使用FragmentPagerAdapter刷新片段中的数据

时间:2018-12-11 21:07:44

标签: android android-fragments android-viewpager fragmentpageradapter

我的寻呼机中有三个片段,我正在使用Bundle添加一些字符串  实例化适配器中的每个片段。我正在使用这些字符串来过滤掉我从数据库中获取的数据。我尝试了简单的notifydatasetchanged()方法,但是它不起作用,我还尝试在下面的querysubmit()方法中单独实例化适配器,但同样没有效果。我找不到任何解决方案,有人通过适配器将信息传递给片段以刷新它们。

所以基本上这就是我在做什么

public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
 // some code here basically variables 
// filterString is what i am passing to adapter to filter data 

pager = (ViewPager) view.findViewById(R.id.Projectviewpager);
adapter = new 
ProjectTabsAdapter(getChildFragmentManager(),filterString,getContext());
    pager.setAdapter(adapter);
    tabs.setupWithViewPager(pager);

// This is where i want to send string to refresh the fragment in pager.


searchView.setOnQueryTextListener(new 
MaterialSearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
        filterString = query;

        // i want to send the string to fragment here 
        }
    }

我的适配器

public class ProjectTabsAdapter extends FragmentPagerAdapter {

private Context mContext ;
private String mSkill;

private String tabTitles[] = new String[]{"tab1", "tab2
", "tab3"};
public ProjectTabsAdapter( FragmentManager fm,String skill,Context 
context) {
    super(fm);

    mSkill = skill;
    mContext= context;
}


@Override
public Fragment getItem(int position) {
    // sending bundle to each fragment

    if (position == 0) {

        Tab1 fragment = new Tab1();

        Toast.makeText(mContext, "Filter String"+ mSkill, 
        Toast.LENGTH_SHORT).show();
        Bundle bundle = new Bundle();

        bundle.putString("skill_set", mSkill);

        fragment.setArguments(bundle);
        return fragment;

    } else if (position == 1){
        return new tab2();
    } else if (position == 2){
        return new tab3();
    } else {
        return null;
    }
}



public int getCount() {
    return 3;
}

public CharSequence getPageTitle(int position) {
    return tabTitles[position];
}


}

1 个答案:

答案 0 :(得分:0)

您可以在适配器和选项卡中定义公共刷新方法:

public class ProjectTabsAdapter extends FragmentPagerAdapter {

private Context mContext ;
private String mSkill;
private Tab1 fragment;

private String tabTitles[] = new String[]{"tab1", "tab2
", "tab3"};
public ProjectTabsAdapter( FragmentManager fm,String skill,Context 
context) {
    super(fm);

    mSkill = skill;
    mContext= context;
}

public void refreshTab1(String skill) {
fragment.refreshSkill(skill); //define public void refreshSkill(String skill) in the Tab1 fragment
}


@Override
public Fragment getItem(int position) {
    // sending bundle to each fragment

    if (position == 0) {

        fragment = new Tab1();

        Toast.makeText(mContext, "Filter String"+ mSkill, 
        Toast.LENGTH_SHORT).show();
        Bundle bundle = new Bundle();

        bundle.putString("skill_set", mSkill);

        fragment.setArguments(bundle);
        return fragment;

    } else if (position == 1){
        return new tab2();
    } else if (position == 2){
        return new tab3();
    } else {
        return null;
    }
}



public int getCount() {
    return 3;
}

public CharSequence getPageTitle(int position) {
    return tabTitles[position];
}


}

然后在您的侦听器中调用refresh方法:

searchView.setOnQueryTextListener(new 
MaterialSearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
        filterString = query;

        // i want to send the string to fragment here 
        adapter.refreshTab1(filterString);
        }
    }