0

内部にViewPager(フラグメントあり)とTabLayoutがあり、RecyclerViewには最初のアイテムだけが表示され、他のアイテムは表示されません。ここでCardviewのrecyclerviewアイテム内のビューページ

Screenshot

ViewPagerAdapter次のとおりです。ここで

public class ViewPagerAdapter extends FragmentStatePagerAdapter { 

    int tabCount; 

    public ViewPagerAdapter(FragmentManager fm, int tabCount) { 
     super(fm); 
     this.tabCount= tabCount; 
    } 


    @Override 
    public Fragment getItem(int position) { 
     switch (position) { 
      case 0: 
       Tab1 tab1 = new Tab1(); 
       return tab1; 
      case 1: 
       Tab2 tab2 = new Tab2(); 
       return tab2; 
      default: 
       return null; 
     } 
    } 

    @Override 
    public Object instantiateItem(ViewGroup container, int position) { 
     return super.instantiateItem(container, position); 
    } 

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

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

は私TimeSheetAdapter次のとおりです。

public class TimeSheetAdapter extends RecyclerView.Adapter<TimeSheetAdapter.ViewHolder> { 

    Context context; 
    ArrayList<TimeSheet> timeSheetArrayList; 

    public TimeSheetAdapter(Context context, ArrayList<TimeSheet> timeSheetArrayList) { 
     this.context = context; 
     this.timeSheetArrayList = timeSheetArrayList; 
    } 

    public class ViewHolder extends RecyclerView.ViewHolder { 
     TabLayout tabLayout; 
     ViewPager viewPager; 
     ViewPagerAdapter viewPagerAdapter; 

     public ViewHolder(View itemView) { 
      super(itemView); 

      tabLayout = (TabLayout) itemView.findViewById(R.id.tabLayout); 
      viewPager = (ViewPager) itemView.findViewById(R.id.pager); 

      tabLayout.addTab(tabLayout.newTab().setText("Tab1")); 
      tabLayout.addTab(tabLayout.newTab().setText("Tab2")); 
      tabLayout.setTabGravity(TabLayout.GRAVITY_FILL); 
      tabLayout.setupWithViewPager(viewPager); 

      viewPager.setOffscreenPageLimit(2); 
      tabLayout.setupWithViewPager(viewPager); 

     } 
    } 

    public TimeSheetAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View viewHolder = LayoutInflater.from(parent.getContext()).inflate(R.layout.time_sheet_row, parent, false); 

     return new TimeSheetAdapter.ViewHolder(viewHolder); 
    } 

    @Override 
    public void onBindViewHolder(TimeSheetAdapter.ViewHolder holder, int position) { 

     ViewPagerAdapter adapter = new ViewPagerAdapter(((AppCompatActivity) context).getSupportFragmentManager(), holder.tabLayout.getTabCount()); 
     holder. viewPager.setAdapter(adapter); 

     if (holder.tabLayout != null) { 
      for (int i = 0; i < holder.tabLayout.getTabCount(); i++) { 
       TabLayout.Tab tab = holder.tabLayout.getTabAt(i); 
       if (tab != null) 
        tab.setText("Tab " + Integer.toString(i + 1)); 
      } 
     } 
     holder.viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(holder.tabLayout)); 
    } 

    @Override 
    public int getItemCount() { 
     return timeSheetArrayList.size(); 
    } 
} 
+0

あなたが何をしたいですか?それはそれがすると思われることをします。 –

+0

@Kingfisher Phuocそれは、最初のカードビューがOKであるだけのカードビュー内の他のビューページの断片を表示していません –

答えて

0

キーでも彼らは、setId()方法を使用して、各ViewPagerに固有のIDを割り当てることですRecyclerViewの内側の行。

更新ViewPagerAdapter次のように:

public class ViewPagerAdapter extends FragmentStatePagerAdapter { 

    private String[] tabTitles = new String[] {"Tab 1", "Tab 2"}; 

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

    @Override 
    public Fragment getItem(int position) { 
     switch (position) { 
      case 0: 
       Tab1 tab1 = new Tab1(); 
       return tab1; 
      case 1: 
       Tab2 tab2 = new Tab2(); 
       return tab2; 
      default: 
       return null; 
     } 
    } 

    @Override 
    public int getCount() { 
     return tabTitles.length; 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     return tabTitles[position]; 
    } 
} 

を更新TimeSheetAdapter次のように:

public class TimeSheetAdapter extends RecyclerView.Adapter<TimeSheetAdapter.ViewHolder> { 

    private Context context; 
    private ArrayList<TimeSheet> timeSheetArrayList; 

    public TimeSheetAdapter(Context context, ArrayList<TimeSheet> timeSheetArrayList) { 
     this.context = context; 
     this.timeSheetArrayList = timeSheetArrayList; 
    } 

    public TimeSheetAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View viewHolder = LayoutInflater.from(parent.getContext()).inflate(R.layout.time_sheet_row, parent, false); 
     return new TimeSheetAdapter.ViewHolder(viewHolder); 
    } 

    @Override 
    public void onBindViewHolder(TimeSheetAdapter.ViewHolder holder, int position) { 
     ViewPagerAdapter adapter = new ViewPagerAdapter(((AppCompatActivity) context).getSupportFragmentManager()); 
     holder.viewPager.setAdapter(adapter); 
     holder.tabLayout.setupWithViewPager(holder.viewPager); 
     holder.viewPager.setOffscreenPageLimit(2); 
    } 

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

    public class ViewHolder extends RecyclerView.ViewHolder { 
     TabLayout tabLayout; 
     ViewPager viewPager; 

     public ViewHolder(View itemView) { 
      super(itemView); 
      tabLayout = itemView.findViewById(R.id.tabLayout); 
      viewPager = itemView.findViewById(R.id.pager); 
      // Assign a unique id so that ViewPager is shown. 
      // Following method is an example and can be unreliable. 
      viewPager.setId((int) (Math.random() * 10000)); 
     } 
    } 
} 

そしてMainActivityを次のようにする必要があります:

public class MainActivity extends AppCompatActivity { 

    private RecyclerView recyclerView; 
    private ArrayList<TimeSheet> timeSheetArrayList = new ArrayList<>(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     recyclerView = (RecyclerView) findViewById(R.id.recyclerView); 
     LinearLayoutManager layoutManager = new LinearLayoutManager(this); 
     recyclerView.setLayoutManager(layoutManager); 
     TimeSheetAdapter adapter = new TimeSheetAdapter(this, timeSheetArrayList); 
     recyclerView.setAdapter(adapter); 

     fetchData(); // Populate timeSheetArrayList 
    } 

    ... 
} 
+0

あなたの返信のための@Mehmedありがとうございますが、残念ながらそれは動作しません。 –

+0

間違いはありますか?もしそうなら、関連するログを投稿できますか? – Mehmed

+0

私はドロップボックスにプロジェクトをアップロードしましたdropbox.com/s/lp6sr5whdtmzxrk/CardViewWithTabs.rar?dl=0あなたがそれをダウンロードでき、あなたがそれを修正できるかどうかを確認していただければ幸いです。たくさんありがとうございます –

関連する問題