【问题标题】:Refreshing Data in a fragment using FragmentPagerAdapter使用 FragmentPagerAdapter 刷新片段中的数据
【发布时间】:2018-12-11 21:07:44
【问题描述】:

我的寻呼机中有三个片段,我正在使用 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];
}


}

【问题讨论】:

    标签: android android-fragments android-viewpager fragmentpageradapter


    【解决方案1】:

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

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

    然后在你的监听器中调用刷新方法:

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

    【讨论】:

    • 嘿,我很抱歉再次问这个问题,但是我遇到了一个奇怪的问题,上面的解决方案在我单独刷新一个片段时对我有用,但是当我刷新三个片段时,它现在显示调用 refreshTab关于空对象引用错误。它实际上很奇怪,因为我以相同的方式刷新了另外两个片段,但它们没有显示任何此类错误,而只有一个片段。
    • 您是在批量更新 3 还是在检查您所在的选项卡?因为如果是批量,选项卡可能尚未初始化,或者它可能已被破坏。如果批量更新,请添加这样的空检查:public void refreshTab1(String skill) { if(fragment != null) { fragment.refreshSkill(skill); } }
    • 我之前尝试过同样的事情,但不知何故只有一个片段为空,其他片段工作正常
    猜你喜欢
    • 2013-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多