2015-08-05 5 views
1

У меня есть TabLayout в mainActivity с некоторыми вкладками, вкладки - Фрагменты.
И на каждом фрагменте у меня есть ReclerView.
Из основной деятельности я хочу позвонить notifyDatasetChange() на моем адаптере в своем фрагменте для обновления пользовательского интерфейса.
Но как уведомить об этом?Как уведомить адаптер в фрагменте из активности?

myMainActivity:

 final ViewPager viewPager = (ViewPager) findViewById(R.id.viewPager); 


    TabLayout  tabLayout = (TabLayout) findViewById(R.id.tabLayout); 
    tabLayout.addTab(tabLayout.newTab().setText("Tab1")); 
    tabLayout.addTab(tabLayout.newTab().setText("Tab2")); 


    final PagerAdapter adapter = new PagerAdapter 
      (getSupportFragmentManager(), tabLayout.getTabCount()); 
    viewPager.setAdapter(adapter); 
    viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); 
    tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { 
     @Override 
     public void onTabSelected(TabLayout.Tab tab) { 
      viewPager.setCurrentItem(tab.getPosition()); 
     } 

     @Override 
     public void onTabUnselected(TabLayout.Tab tab) { 

     } 

     @Override 
     public void onTabReselected(TabLayout.Tab tab) { 

     } 
    }); 

Один из myTabFragment:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    RecyclerView v = (RecyclerView) inflater.inflate(R.layout.tab_fragment_1, container, false); 
    SetupRecycleView(v); 
    return v; 
} 


void SetupRecycleView(RecyclerView recList) { 
    recList.setHasFixedSize(true); 
    LinearLayoutManager llm = new LinearLayoutManager(G.context); 
    llm.setOrientation(LinearLayoutManager.VERTICAL); 
    //recList.setLayoutManager(new GridLayoutManager(G.context, 2)); 
    recList.setLayoutManager(llm); 
    List<StructGhaza> ghazas = StructGhaza.getAllGhaza("2"); 
    CardAdapter adapter = new CardAdapter(ghazas); 
    recList.setAdapter(adapter); 
} 

CardAdapter:

public class CardAdapter extends  RecyclerView.Adapter<CardAdapter.GhazaViewHolder> { 

private List<StructGhaza> ghazas; 

public CardAdapter(List<StructGhaza> ghazaList) { 
    this.ghazas = ghazaList; 
} 

@Override 
public int getItemCount() { 
    return ghazas.size(); 
} 

@Override 
public void onBindViewHolder(GhazaViewHolder ghazaViewHolder, int position) { 

    StructGhaza ghaza = ghazas.get(position); 
    ghazaViewHolder.vTitle.setText(ghaza.Name); 
    //----Load Image 
    Glide.with(G.context) 
      .load(ghaza.Aks) 
      .placeholder(R.drawable.loading_spinner) 
      .crossFade() 
      .into(ghazaViewHolder.itemImg); 
    //--------------- 
    ghazaViewHolder.Rate.setRating(ghaza.Star); 
    ghazaViewHolder.sampleLayout.setHoverView(ghazaViewHolder.hover); 
    ghazaViewHolder.sampleLayout.addChildAppearAnimator(ghazaViewHolder.hover, R.id.tvHover, Techniques.FlipInX); 
    ghazaViewHolder.sampleLayout.addChildDisappearAnimator(ghazaViewHolder.hover, R.id.tvHover, Techniques.FlipOutX); 
} 

@Override 
public GhazaViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 
    View itemView = LayoutInflater. 
      from(viewGroup.getContext()). 
      inflate(R.layout.fragment_carditem, viewGroup, false); 

    return new GhazaViewHolder(itemView); 
} 

public static class GhazaViewHolder extends RecyclerView.ViewHolder { 
    protected TextView vTitle; 
    protected BlurLayout sampleLayout; 
    protected View hover; 
    protected ImageView itemImg; 
    protected RatingBar Rate; 

    public GhazaViewHolder(View v) { 
     super(v); 
     sampleLayout = (BlurLayout) v.findViewById(R.id.sample); 
     itemImg = (ImageView) v.findViewById(R.id.item_img); 
     hover = LayoutInflater.from(G.context).inflate(R.layout.fragment_hover, null); 
     vTitle = (TextView) v.findViewById(R.id.titleTv); 
     Rate = (RatingBar) v.findViewById(R.id.rating); 
    } 
} 
} 
+0

'Activity' должен знать * * все о любом' Fragments' прикрепленным к нему (обратное не верно, однако). Просто создайте 'public' метод в своем' Fragment' и вызовите его из 'Activity'. – Squonk

+0

что-то вроде метода public void refreshData() { adapter.notifydatasetchanged(); } в вашем фрагменте. Сначала найдите свой фрагмент по имени тега, а затем вызовите эту функцию –

ответ

5

Я бы рекомендовал поставить публичный метод в Fragment и затем вызвать из Activity , См «Доставить сообщение для фрагмента» здесь:

http://developer.android.com/training/basics/fragments/communicating.html

В вашем Activity, просто сделайте следующее, чтобы убедиться, метод Fragment можно назвать:

TabFragment tabFragment = (TabFragment) getSupportFragmentManager().findFragmentByTag(TAB_FRAGMENT_TAG); 

     // Check if the tab fragment is available 
     if (tabFragment != null) { 

      // Call your method in the TabFragment 
      articleFrag.yourMethod(); 
    } 

А потом в Fragment , имеют следующий метод:

public void yourMethod() { 
     recyclerViewAdapter.notifyDataSetChanged(); 
    } 
1

Вы создаете updateListview() в своем фрагменте, таком как

public void updateListView() { 
    yourAdapter.notifyDataSetChanged(); 
} 

и updateListview() в деятельности, как

updateListView(); 
Смежные вопросы