其他分享
首页 > 其他分享> > Android-使用FragmentStatePagerAdapter仅填充选定项的TabLayout

Android-使用FragmentStatePagerAdapter仅填充选定项的TabLayout

作者:互联网

我正在使用Android TabLayout生成带有FragmentStatePagerAdapter作为适配器的标签.现在,使用此代码,当我滚动它时,它将在每个选项卡上生成项目.

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

SongListAdapter中的getItem()生成一个新的Fragment,该片段使用一个Audio的属性并将其添加到recylerview中以进行显示. (如果需要,我可以添加SongListFragment).

目前,此代码将所有选项卡填充为相同的片段.选择哪个选项卡都没关系,它们都是一样的.

我的问题是..我怎样才能使它成为音频的流派并进行相应的分类.

或者如何在主要活动Songmanager.getSonglist …中捕捉到该选项卡已被交换以及该选项卡的标题是什么.

还有如何制作它,以便在选择时可以将歌曲添加到“推荐”选项卡.

这是我创建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 one rror(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方法返回片段的实例,即

@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;
    }

在这里,您应该返回基于流派过滤了AudioList的SongListFragment的不同实例.
所以这看起来像:

@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-tablayout,fragmentstatepageradapter,android-viewpager,android
来源: https://codeday.me/bug/20191108/2010191.html