如何使用 ViewPager 在 TabLayout 的选项卡上设置页面标题

Posted

技术标签:

【中文标题】如何使用 ViewPager 在 TabLayout 的选项卡上设置页面标题【英文标题】:How to set page title on TabLayout's tabs with ViewPager 【发布时间】:2020-10-16 13:44:39 【问题描述】:

我正在尝试从模型类中动态设置选项卡的标题。为此,我重写了 getPageTitle(int position) 方法,然后返回字符序列。然而,由于标题来自模型字段,我得到了重复。我怎样才能只返回唯一的字段名称作为页面标题?或者实现这一目标的最佳方法是什么。

例如,我想将某个作者的所有书籍归为一个标签。

嗯,这就是我的适配器的样子,很简单:

 public class BooksListsAdapter extends FragmentPagerAdapter 
    private ArrayList<Books> listOfBooks= new ArrayList<>();

    public BooksListsAdapter (FragmentManager fragmentManager, ArrayList<Books> listOfBooks) 
        super(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
        this.listOfBooks= listOfBooks;
    

    @Override
    public int getCount() 
        return listOfBooks.size();
    

    @NonNull
    @Override
    public Fragment getItem(int position) 
        return BooksListFragment.newInstance(listOfBooks.get(position).getAuthor(), listOfBooks);
    

    @Override
    public CharSequence getPageTitle(int position)
        return listOfBooks.get(position).getAuthor();// Would like this returns only individual author regardless how many books they have
    

这工作正常,除了标签是用重复的标题创建的,因此重复的内容。但是,我已经将内容分组在相应的片段中。我只想删除重复的选项卡(重复相同作者姓名的选项卡)。

感谢您的宝贵时间。

【问题讨论】:

【参考方案1】:

您可以根据您拥有的作者总数创建ViewPager。并且对于每一页,您都将显示该作者的所有书籍。

public class BooksListsAdapter extends FragmentPagerAdapter 
    private List<String> authors = new ArrayList<>();
    private HashMap<String, List<Books>> booksMap = new HashMap<>(); // author is key, list of book of this author is value

    public BooksListsAdapter(FragmentManager fragmentManager, ArrayList<Books> listOfBooks) 
        super(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);

        setBooksWithAuthor(listOfBooks);
        // LOGIC to order tab go here. Tab order <=> authors list order
        // Example: Order tab by author name: Collections.sort(authors);
    

    private void setBooksWithAuthor(ArrayList<Books> books) 
        for (Books book : books) 
            if (booksMap.containsKey(book.getAuthor())) 
                booksMap.get(book.getAuthor()).add(book);
             else 
                booksMap.put(book.getAuthor(), new ArrayList<Books>() 
                    add(book);
                );
                authors.add(book.getAuthor());
            
        
    

    @Override
    public int getCount() 
        return authors.size(); // total page = total author
    

    @NonNull
    @Override
    public Fragment getItem(int position) 
        String author = authors.get(position);
        return BooksListFragment.newInstance(author, booksMap.get(author));
    

    @Override
    public CharSequence getPageTitle(int position) 
        return authors.get(position);
    

希望对你有帮助

【讨论】:

感谢您的快速回答。我要测试一下,然后我会回来找你的。 你好,你能帮我解决这个问题吗? ***.com/questions/62587076/…好吗? newInstance 方法需要一个 ArrayList,我应该将 List 转换为 ArrayList 吗? 你应该改变你的 BooksListFragment,用 List 替换 ArrayList @esQmo_更新了答案,请看BooksListsAdapter构造函数里面,希望你能明白

以上是关于如何使用 ViewPager 在 TabLayout 的选项卡上设置页面标题的主要内容,如果未能解决你的问题,请参考以下文章

如何在viewPager的视图顶部使用nestedScrollView中的viewpager

如何使用导航抽屉和viewpager/viewpager2在java中制作android应用程序

如何在 ViewPager 中使用 cursorLoader?

如何在 ViewPager 中使用 Fragments

如何在 viewPager 中使用按钮更改页面?

如何在 Android 中使用 TabLayout 和 ViewPager2