Android 在ViewPager的多个选项卡中使用单个片段

Android 在ViewPager的多个选项卡中使用单个片段,android,tabs,android-viewpager,fragment,android-recyclerview,Android,Tabs,Android Viewpager,Fragment,Android Recyclerview,我正在使用ViewPager左右滑动,我还添加了选项卡,选项卡的数量取决于服务器数据,因此,我无法使选项卡的数量固定。为此,我只使用了一个片段和一个RecyclerView在RecyclerView中显示JSON数据。当第一个应用程序启动时,应显示在第二个选项卡中的数据将显示在第一个选项卡中。在我滑动到第三个选项卡并再次回到第一个选项卡后,数据显示正确 它和谷歌PlayStore一样。我认为只有一个片段,因为所有选项卡中的UI都是相同的 下面是向recyclerView添加片段和显示数据的代码

我正在使用ViewPager左右滑动,我还添加了选项卡,选项卡的数量取决于服务器数据,因此,我无法使选项卡的数量固定。为此,我只使用了一个片段和一个RecyclerView在RecyclerView中显示JSON数据。当第一个应用程序启动时,应显示在第二个选项卡中的数据将显示在第一个选项卡中。在我滑动到第三个选项卡并再次回到第一个选项卡后,数据显示正确

它和谷歌PlayStore一样。我认为只有一个片段,因为所有选项卡中的UI都是相同的

下面是向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;
    }
}
私有类PagerAdapter扩展了FragmentStatePagerAdapter{
国际货币基金组织;
列出数据;
公共页面RADAPTER(FragmentManager fm、int NumofTabs、列表数据){
超级(fm);
mNumOfTabs=NumofTabs;
这个数据=数据;
}
@凌驾
公共片段getItem(int位置){
/*ProductFragment pf=ProductFragment.newInstance(data.get(position),position);
返回pf*/
返回ProductFragment.newInstance(data.get(position),0);
}
@凌驾
public int getCount(){
返回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());
}
公共类ProductFragment扩展了片段{
私有静态最终字符串ARG_PRODUCTS=“PRODS”;
私有静态列表所有产品;
int位置=0;
回收视图产品列表;
公共静态ProductFragment newInstance(列出产品,int位置){
ProductFragment=新的ProductFragment();
Bundle args=新Bundle();
args.putParcelableArrayList(ARG_产品,(ArrayList)产品);
参数putInt(“键位置”,位置);
args.putInt(“KEY_ID”,ID);
fragment.setArguments(args);
返回片段;
}
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//如果(isVisibleToUser){
如果(getArguments()!=null){
allProducts=getArguments().getParcelableArrayList(ARG_PRODUCTS);
this.position=getArguments().getInt(“键位置”);
}
// }
}
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
//为该碎片膨胀布局
视图=充气机。充气(R.layout.fragment\u产品,容器,假);
prodList=(RecyclerView)view.findViewById(R.id.product\u列表);
返回视图;
}
@凌驾
已创建视图上的公共void(视图,捆绑保存状态){
setLayoutManager(新的LinearLayoutManager(getActivity());
setAdapter(新产品适配器(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) {

        }
    });

 }
onCreate(){
TabLayout TabLayout=(TabLayout)findViewById(R.id.tab_布局);
allProducts=new ArrayList();
对于(类别类别:catList){
tabLayout.addTab(tabLayout.newTab().setText(cat.getName());
tabLayout.setTabMode(tabLayout.MODE可滚动);
//tabLayout.setTabGravity(tabLayout.GRAVITY\u-FILL);
添加(cat.getProductsList());
}
viewPager=(viewPager)findViewById(R.id.pager);
适配器=新的PagerAdapter
(getSupportFragmentManager(),tabLayout.getTabCount(),allProducts);
viewPager.setOffscreenPageLimit(0);
viewPager.setAdapter(适配器);
viewPager.addOnPageChangeListener(新建TabLayout.TabLayoutOnPageChangeListener(TabLayout));
tabLayout.setOnTabSelectedListener(新的tabLayout.OnTabSelectedListener(){
@凌驾
已选择的公共选项卡(TabLayout.Tab){
Log.e(“ViewPager”、“getCurrentItem()”+ViewPager.getCurrentItem());
setCurrentItem(tab.getPosition());
}
@凌驾
已选择的公共选项卡(TabLayout.Tab){
}
@凌驾
已重新选择公共选项卡(TabLayout.Tab){
}
});
}
在此处输入图像描述


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

将此行改为: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;
        }

bcoz此静态方法从viewPager设置最新页面的数据。仅供参考,viewPager会提前将下一页加载到内存中。静态方法使其现在显示,而不是将来显示。

我有一个较小的问题,我使用的是具有多个表布局的单个片段。我一直在片段中得到错误的位置,这是最后一个位置n在列表中

问题是在静态变量中保存片段位置,或者在Bundle中保存最后创建的片段,并且ViewPager将在当前位置之前创建片段,这就是我们丢失当前位置的原因

所以我解决这个问题的方法是创建一个局部变量来保存所创建片段的制表符位置

Kotlin中的代码

class TabFragment : Fragment() {
private var tabPosition = 0

companion object {
    fun newInstance(tabPosition: Int): TabFragment {
        val tabFragment = TabFragment()
        tabFragment.tabPosition = tabPosition
        return tabFragment
     }
  }
}
Java中的代码

public class TabFragment extends Fragment {
private int tabPosition = 0;
static TabFragment newInstance(int tabPosition){
    TabFragment tabFragment = new TabFragment();
    tabFragment.tabPosition = tabPosition;
    return tabFragment;
  }
}

请添加您的活动代码和PagerAdapter代码。添加您的活动代码。请编辑check@Drv....更新的问题。请检查dude@Dharvikshah已编辑的dudeprodList.setAdapter(新产品适配器(getActivity(),allProducts));//setUserVisibleHintproductAdapter.notifyDataSetChanged()中的此行发生NullPointerException;//现在这里是NullPointerException请调试并尝试找出为什么它会提供nullpointer,并发布您的日志,以便我也能提供帮助。@Drv我使用相同的代码,但问题是我的上一个TableLayout滚动的recycler视图和上一个TableLayout滚动的recycler视图没有滚动。我将添加图像,它看起来如何确定。请添加。请检查图片,第一张是当应用程序启动并在Starr中显示鸡蛋项目时,第二张是当我滑动到end tab并再次通过滑动返回时,t
class TabFragment : Fragment() {
private var tabPosition = 0

companion object {
    fun newInstance(tabPosition: Int): TabFragment {
        val tabFragment = TabFragment()
        tabFragment.tabPosition = tabPosition
        return tabFragment
     }
  }
}
public class TabFragment extends Fragment {
private int tabPosition = 0;
static TabFragment newInstance(int tabPosition){
    TabFragment tabFragment = new TabFragment();
    tabFragment.tabPosition = tabPosition;
    return tabFragment;
  }
}