android - 使用仅包含选定项目的 FragmentStatePagerAdapter 填充 TabLayout

标签 android android-viewpager android-tablayout fragmentstatepageradapter

我正在使用 Android TabLayout 生成 tabs 并使用 FragmentStatePagerAdapter 作为 adapter。现在有了这段代码,当我滚动它时,它会在每个 tab 上生成 items

SongManager.getAudioListFromResponse(result) 给出 Audio 对象的 List,每个对象都有一个名为 genre 的 String .例如,第一个音频具有摇滚风格,第二个音频具有布鲁斯风格。

SongListAdapter 中的 getItem() 创建一个使用一个 Audio 属性的新 Fragment,并将其添加到 recylerview 显示。 (如果需要,我可以添加 SongListFragment)。

目前这段代码正在用相同的Fragments 填充所有选项卡。无论我选择哪个 tab,它们都是一样的。

我的问题是..我怎样才能让它获得Audio's genre并相应地对其进行排序。

或者我如何在 main activity Songmanager.getSonglist... 中发现选项卡已被交换以及选项卡的标题是什么。

还有我怎样才能做到这一点,以便在我选择时可以将歌曲添加到 recommended 标签。

这是我创建 TabLayout 的代码:

SongManager.getSonglist(getApplicationContext(), new OkHttp3Connection.OkHttp3RequestCallback() {
        @Override
        public void onSuccess(String result, String user_tag) {

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

            SongListAdapter songListAdapter =
                    new SongListAdapter(getSupportFragmentManager(), getApplicationContext());
            songListAdapter.setAudioList(SongManager.getAudioListFromResponse(result));
            viewPager.setAdapter(songListAdapter);

            // Give the TabLayout the ViewPager
            TabLayout tabLayout = findViewById(R.id.tab_layout);
            tabLayout.setupWithViewPager(viewPager);

            songListAdapter.setItemListener(new SongListAdapter.SongListViewPagerListViewItemListener() {
                @Override
                public void onClick(Audio audio) {
                    goToCameraView();
                    songGraph.setAudio(audio);
                }
            });

            // Iterate over all tabs and set the custom view
            for (int i = 0; i < tabLayout.getTabCount(); i++) {

                TabLayout.Tab tab = tabLayout.getTabAt(i);

                if (tab != null) {
                    tab.setCustomView(songListAdapter.getTabView(i));
                }
            }
        }

        @Override
        public void onError(String error, String user_tag) {
            System.out.println("HTTP Error: " + error);
        }
    });

以及整个 SongListAdapter 类:

public class SongListAdapter extends FragmentStatePagerAdapter {

    String tabTitles[] = new String[]{"Recommended", "Popular", "Rock", "Pop", "Blues", "Chill"};
    Context context;



    private ArrayList<Audio> audioList;

    public SongListAdapter(FragmentManager fm, Context context) {
        super(fm);
        this.context = context;
    }

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

    @Override
    public SongListFragment getItem(int position) {
        SongListFragment slf = new SongListFragment();
        slf.setAudioList(getAudioList());
        slf.setItemOnClickListener(new SongListFragment.SongListItemOnClickListener() {
            @Override
            public void onClick(Audio audio) {
                System.out.println("asdfdas");
                itemListener.onClick(audio);
            }
        });
        return slf;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        // Generate title based on item position
        return tabTitles[position];
    }

    public View getTabView(int position) {
        View tab = LayoutInflater.from(context).inflate(R.layout.custom_tab, null);
        TextView tv = tab.findViewById(R.id.custom_text);
        tv.setText(tabTitles[position]);
        return tab;
    }

    public ArrayList<Audio> getAudioList() {
        return audioList;
    }

    public void setAudioList(ArrayList<Audio> audioList) {
        this.audioList = audioList;
    }

    SongListViewPagerListViewItemListener itemListener;

    public void setItemListener(SongListViewPagerListViewItemListener itemListener) {
        this.itemListener = itemListener;
    }

    public interface SongListViewPagerListViewItemListener {
        void onClick(Audio audio);
    }
}

整个结果是这样的:

enter image description here

最佳答案

我会根据您的问题来回答,即您想在不同的选项卡中根据流派显示不同的音频列表。

好的,所以我认为第一个问题是如何从 SongsListAdapter 的 getItem 方法返回 fragment 的实例,即

@Override
    public SongListFragment getItem(int position) {
        SongListFragment slf = new SongListFragment();
        slf.setAudioList(getAudioList());
        slf.setItemOnClickListener(new SongListFragment.SongListItemOnClickListener() {
            @Override
            public void onClick(Audio audio) {
                System.out.println("asdfdas");
                itemListener.onClick(audio);
            }
        });
        return slf;
    }

在这里,您应该返回 SongListFragment 的不同实例,这些实例已根据流派过滤了 AudioList。 所以这可能看起来像:

@Override
    public SongListFragment getItem(int position) {
        SongListFragment slf = new SongListFragment();
        slf.setAudioList(filterBasedOnGenre(getAudioList(), tabTitles[position]));
        slf.setItemOnClickListener(new SongListFragment.SongListItemOnClickListener() {
            @Override
            public void onClick(Audio audio) {
                System.out.println("asdfdas");
                itemListener.onClick(audio);
            }
        });
        return slf;
    }

public ArrayList<Audio> filterBasedOnGenre(ArrayList<Audio> audioList, String genreToFilter)
    {
        ArrayList<Audio> filteredAudioList = new ArrayList<>();

        for (Audio audio : audioList) {
            if (audio.getGenre().equalsIgnoreCase(genreToFilter)) {
                filteredAudioList.add(audio);
            }  
        }
        return filteredAudioList; 
    }

考虑音频看起来像这样:

    public class Audio {
           public Audio(String songName, String singer, String genre) {
                this.songName = songName;
                this.singer = singer;
                this.genre = genre;
            }

            private String songName;
            private String singer;
            private String genre;

            public String getSongName() {
                return songName;
            }

            public void setSongName(String songName) {
                this.songName = songName;
            }

            public String getSinger() {
                return singer;
            }

            public void setSinger(String singer) {
                this.singer = singer;
            }

            public String getGenre() {
                return genre;
            }

            public void setGenre(String genre) {
                this.genre = genre;
            }
        }

希望对您有所帮助。
如果您需要更多帮助,请告诉我。

关于android - 使用仅包含选定项目的 FragmentStatePagerAdapter 填充 TabLayout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51099268/

相关文章:

android - Retrofit + GET 方法 + Android 中的 www-form-urlencoded

android - Eclipse (Kepler) 使用 JUnit3 运行器而不是 Junit4 运行器运行每个新的 JUnit 测试

android - 水平 recylerview 的同步滚动与 viewpager 滚动

android - 选项卡式 ViewPager 预蜂窝

android - 没有找到类 "android.support.v7.internal.widget.TintManager"

android.support.v7.widget.AppCompatTextView 无法转换为 android.widget.ImageView

android - 设置选项卡选定的文本颜色不起作用

Android - 隐藏所有显示的 Toast 消息

java - android:创建新项目时可以选择目标sdk吗?

java - RecyclerView 根本不显示。我找不到错误。我该如何解决?