2

Я использую ViewPager для перемещения влево и вправо, я также добавил вкладки. Количество вкладок зависит от данных сервера. Поэтому я не могу сделать количество вкладок фиксированным , Для этого я использовал только Single Fragment и RecyclerView для отображения данных JSON в recyclerView. При первом запуске приложения данные, которые должны отображаться на 2-й вкладке, отображаются в первой вкладке. После того, как я перейду к третьей вкладке и снова вернусь к 1-й вкладке, данные отображаются правильно.Использование одного фрагмента в нескольких вкладках ViewPager

Он такой же, как GooglePlayStore. Я думаю, что есть только один фрагмент, потому что пользовательский интерфейс во всех вкладках одинаковый.

Вот код для добавления фрагмента и отображения данных в recyclerView.

PagerAdapter.java

private class PagerAdapter extends FragmentStatePagerAdapter { 
    int mNumOfTabs; 
    List<List<ProductInfo>> data; 



    public PagerAdapter(FragmentManager fm, int NumofTabs, List<List<ProductInfo>> data) { 
     super(fm); 
     mNumOfTabs = NumofTabs; 
     this.data = data; 
    } 

    @Override 
    public Fragment getItem(int position) { 
     /* ProductFragment pf = ProductFragment.newInstance(data.get(position),position); 
     return pf;*/ 

     return ProductFragment.newInstance(data.get(position),0); 
    } 



    @Override 
    public int getCount() { 
     return mNumOfTabs; 
    } 
} 

Fragment.java

public class ProductFragment extends Fragment { 
    private static final String ARG_PRODUCTS = "PRODS"; 
    private static List<ProductInfo> allProducts; 
    int position = 0; 
    RecyclerView prodList; 


public static ProductFragment newInstance(List<ProductInfo> products,int position) {   
    ProductFragment fragment = new ProductFragment(); 
    Bundle args = new Bundle(); 
    args.putParcelableArrayList(ARG_PRODUCTS, (ArrayList<ProductInfo>) products); 
    args.putInt("KEY_POSITION",position); 
    args.putInt("KEY_ID",id); 
    fragment.setArguments(args); 
    return fragment; 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    //if(isVisibleToUser){ 
     if (getArguments() != null) { 
      allProducts = getArguments().getParcelableArrayList(ARG_PRODUCTS); 
      this.position = getArguments().getInt("KEY_POSITION"); 
     } 
    // } 
} 


@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    View view = inflater.inflate(R.layout.fragment_product, container, false); 
    prodList = (RecyclerView) view.findViewById(R.id.product_list); 
    return view; 
} 



@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 

    prodList.setLayoutManager(new LinearLayoutManager(getActivity())); 
    prodList.setAdapter(new ProductAdapter(getActivity(), allProducts)); 
    Log.e("ProductFragment " ,"" + allProducts.get(position).getName()); 
} 

Редакцией: Activity.java

onCreate(){ 
TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout); 
    allProducts = new ArrayList<>(); 

    for (Category cat : catList) { 
     tabLayout.addTab(tabLayout.newTab().setText(cat.getName())); 
     tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE); 
     //tabLayout.setTabGravity(TabLayout.GRAVITY_FILL); 
     allProducts.add(cat.getProductsList()); 
    } 
viewPager = (ViewPager) findViewById(R.id.pager); 
    adapter = new PagerAdapter 
      (getSupportFragmentManager(), tabLayout.getTabCount(), allProducts); 
    viewPager.setOffscreenPageLimit(0); 
    viewPager.setAdapter(adapter); 

    viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); 
    tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { 
     @Override 
     public void onTabSelected(TabLayout.Tab tab) { 
      Log.e("ViewPager "," getCurrentItem() "+viewPager.getCurrentItem()); 
      viewPager.setCurrentItem(tab.getPosition()); 
     } 

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

     } 

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

     } 
    }); 

} 

введите описание изображения здесь

enter image description here

enter image description here

+0

Пожалуйста, добавьте свой код операции и код PagerAdapter. –

+0

Добавить свой код операции. – Drv

+0

Отредактировано .... Plz проверка –

ответ

0

В PagerAdapter редактирования, как показано ниже, это может помочь:

@Override 
public Fragment getItem(int position) { 
    /* ProductFragment pf = ProductFragment.newInstance(data.get(position),position); 
    return pf;*/ 

    return ProductFragment.newInstance(data.get(position),position); 
} 

А в вашем фрагменте внести изменения, как показано ниже:

public class ProductFragment extends Fragment { 
private static final String ARG_PRODUCTS = "PRODS"; 
private static List<ProductInfo> allProducts; 
int position = 0; 
RecyclerView prodList; 
ProductAdapter productAdapter=null; 


public static ProductFragment newInstance(List<ProductInfo> products,int position) {   
ProductFragment fragment = new ProductFragment(); 
Bundle args = new Bundle(); 
args.putParcelableArrayList(ARG_PRODUCTS, (ArrayList<ProductInfo>) products); 
args.putInt("KEY_POSITION",position); 
args.putInt("KEY_ID",id); 
fragment.setArguments(args); 
return fragment; 
} 

@Override 
public void setUserVisibleHint(boolean isVisibleToUser) { 
    super.setUserVisibleHint(isVisibleToUser); 
    if(isVisibleToUser){ 
     productAdapter.notifyDataSetChanged(); 
    } 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
//if(isVisibleToUser){ 
    if (getArguments() != null) { 
     allProducts = getArguments().getParcelableArrayList(ARG_PRODUCTS); 
     this.position = getArguments().getInt("KEY_POSITION"); 
    } 

//}}

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
        Bundle savedInstanceState) { 
// Inflate the layout for this fragment 
View view = inflater.inflate(R.layout.fragment_product, container, false); 
prodList = (RecyclerView) view.findViewById(R.id.product_list); 
prodList.setLayoutManager(new LinearLayoutManager(getActivity())); 
productAdapter= new ProductAdapter(getActivity(), allProducts) 
prodList.setAdapter(productAdapter); 
     return view; 
    } 
} 
+0

prodList.setAdapter (новый ProductAdapter (getActivity(), allProducts)); // NullPointerException происходит в этой строке в setUserVisibleHint –

+0

Пожалуйста, проверьте мой отредактированный код. – Drv

+0

productAdapter.notifyDataSetChanged(); // Теперь здесь NullPointerException –

0

изменить эту линию в: PagerAdapter.java

 @Override 
     public Fragment getItem(int position) { 
      ProductFragment fragment = new ProductFragment(); 
      Bundle args = new Bundle(); 
      args.putParcelableArrayList(ARG_PRODUCTS, (ArrayList<ProductInfo>) products); 
      args.putInt("KEY_POSITION",position); 
      args.putInt("KEY_ID",id); 
      fragment.setArguments(args); 
      return fragment; 
     } 

и удалить статический метод из фрагмента, как:

public static ProductFragment newInstance() 

bcoz статического метода установить данные последней страницы из ViewPager. и FYI viewPager загружает следующую страницу в память заранее. и статический метод заставляет его показывать сейчас, а затем показывать в будущем.

+0

это тоже не работает –

+1

Я буду добавлять изображения, как это выглядит –

+0

ya sure. пожалуйста, добавьте. –

Смежные вопросы