2016-09-28 46 views
2

你好我正在實現一個動態TabLayout使用一個片段,我已經設法到目前爲止創建的標籤,但有一個問題,使用單個片段。當更改選項卡時,片段視圖不會重複更新,儘管根據選項卡選擇更新片段的onCreateView方法中的數據。我在該片段中有一個recyclerview,它應該根據選項卡選項進行更改。任何人都可以幫助我,或者有沒有人有更好的方法?更新片段查看選項卡更改

TabView的活動

public class SubCategory extends AppCompatActivity { 

private Toolbar toolbar; 
private TabLayout tabLayout; 
private ViewPager viewPager; 
Activity a; 
String url; 
List<CategoryEncapsulation> categories = new ArrayList<>(); 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_sub_category); 
    a=this; 
    toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    viewPager = (ViewPager) findViewById(R.id.viewpager); 
    tabLayout = (TabLayout) findViewById(R.id.tabs); 
    categories=((MyshinzGlobal)getApplicationContext()).getCategoryList(); 
    setupViewPager(viewPager); 
    ((MyshinzGlobal)getApplicationContext()).setCategory_id(categories.get(0).getCategory_id()); 
} 

private void setupViewPager(ViewPager viewPager) { 
    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager()); 
    try { 

     for (int i = 0; i < categories.size(); i++) { 
      try { 
       adapter.addFragment(new ListFragment(), categories.get(i).getCategory_name()); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }catch (Exception e) { 
     e.printStackTrace(); 
    } 
    viewPager.setAdapter(adapter); 
    tabLayout.setupWithViewPager(viewPager); 
    viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { 
     @Override 
     public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 

     } 

     @Override 
     public void onPageSelected(int position) { 
     ((MyshinzGlobal)getApplicationContext()).setCategory_id(categories.get(position).getCategory_id()); 
     } 

     @Override 
     public void onPageScrollStateChanged(int state) { 

     } 
    }); 

} 


class ViewPagerAdapter extends FragmentPagerAdapter { 
    private final List<Fragment> mFragmentList = new ArrayList<>(); 
    private final List<String> mFragmentTitleList = new ArrayList<>(); 

    public ViewPagerAdapter(FragmentManager manager) { 
     super(manager); 
    } 


    @Override 
    public Fragment getItem(int position) { 
     return mFragmentList.get(position); 
    } 

    @Override 
    public int getCount() { 
     return mFragmentList.size(); 
    } 

    public void addFragment(Fragment fragment, String title) { 
     mFragmentList.add(fragment); 
     mFragmentTitleList.add(title); 
    } 

    @Override 
    public int getItemPosition(Object object) { 
     return super.getItemPosition(object); 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     return mFragmentTitleList.get(position); 
    } 
} 
} 

片段類

public class ListFragment extends Fragment{ 

String category_id; 
Activity a; 
RecyclerView rv; 
SubCategoryAdapter sca; 
List<ParentListItem> parentListItems; 
List<CategoryEncapsulation> categories = new ArrayList<>(); 


@Override 
public void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
} 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    View view =inflater.inflate(R.layout.sub_category_fragment, container, false); 
    a=getActivity(); 
    categories=((MyshinzGlobal)a.getApplicationContext()).getCategoryList(); 
    category_id=((MyshinzGlobal)a.getApplicationContext()).getCategory_id(); 
    parentListItems= new ArrayList<>(); 
    Toast.makeText(getActivity(), String.valueOf(category_id), Toast.LENGTH_SHORT).show(); 
    rv= (RecyclerView) view.findViewById(R.id.recycler_view); 

    for (int i=0; i<categories.size();i++){ 
     if(categories.get(i).getCategory_id().equals(category_id)){ 
      parentListItems=categories.get(i).getParentListItems(); 
     } 
    } 
    sca=new SubCategoryAdapter(a,parentListItems); 
    rv.setAdapter(sca); 
    rv.setLayoutManager(new LinearLayoutManager(a)); 
    //new GetAllSubCategoryTask(a,url,"1001").execute(); 
    return view; 
} 


} 

回答

2

首先,當您使用ViewPager時,只有在調用FragmentPagerAdapter的getItem()時,纔會調用片段的onCreateView()。

如果需要在Fragment中創建一個方法,該方法將調用RecyclerView.notifyDataSetChanged()

退房更新的代碼爲兩個類

TabView的活動

public class SubCategory extends AppCompatActivity { 

    //.... 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     //... 
    } 

    private void setupViewPager(ViewPager viewPager) { 
     //... 
     viewPager.setAdapter(adapter); 
     tabLayout.setupWithViewPager(viewPager); 
     viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { 
      @Override 
      public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 

      } 

      @Override 
      public void onPageSelected(int position) { 
      ((MyshinzGlobal)getApplicationContext()).setCategory_id(categories.get(position).getCategory_id()); 
      adapter.getItem(position).listUpdated(); 
      } 

      @Override 
      public void onPageScrollStateChanged(int state) { 

      } 
     }); 

    } 


    class ViewPagerAdapter extends FragmentPagerAdapter { 
     private final List<ListFragment> mFragmentList = new ArrayList<>(); 
     private final List<String> mFragmentTitleList = new ArrayList<>(); 

     public ViewPagerAdapter(FragmentManager manager) { 
      super(manager); 
     } 


     @Override 
     public ListFragment getItem(int position) { 
      return mFragmentList.get(position); 
     } 
     //... 
    } 
} 

片段類

public class ListFragment extends Fragment { 

     //... 

     public void listUpdated() { 
      for (int i = 0; i < categories.size(); i++) { 
       if (categories.get(i).getCategory_id().equals(category_id)) { 
        parentListItems.clear(); 
        parentListItems.addAll(categories.get(i).getParentListItems()); 
       } 
      } 
      sca.notifyDataSetChanged(); 
     } 
    } 
+0

viewPager無法從onPageSelected方法中調用,因爲它表示從內部類中訪問變量'viewpager',需要聲明final 。 – Arpan

+0

declare viewpager final –

+0

不是它說不能解決方法'getItem()' – Arpan

1

我對這種兩種溶液。

1)使您的查看尋呼機偏移限制。其中默認。如果您正在切換不在偏移量中的另一個片段,則會重新創建該片段。

viewPager.setOffscreenPageLimit(0); 

2)告訴您的適配器,片段已被更改。所以你的適配器會重新創建它的視圖。

rv.notifyDataSetChanged(); 

我希望這些能夠解決您的問題。

+0

好吧,讓我第一次嘗試了這一點。 – Arpan

+0

請參閱[鏈接](https://stackoverflow.com/a/46896579/1823043) –

相關問題