使用FragmentStatePagerAdapter仅填充选定项来填充TabLayout

时间:2018-06-29 10:05:48

标签: android android-viewpager android-tablayout fragmentstatepageradapter

我正在使用Android TabLayout生成tabsFragmentStatePagerAdapter的{​​{1}}。现在,使用此代码,当我滚动它时,它会在每个adapter上生成items

tab给出SongManager.getAudioListFromResponse(result)个对象中的List个,每个对象都有一个Audio类,称为流派。例如,第一个音频具有摇滚风格,第二个音频具有布鲁斯风格。

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

此刻,此代码正在用相同的SongListFragment填充所有选项卡。选择哪个Fragments都没关系,它们都是一样的。

我的问题是..我怎样才能使它得到tab并进行相应的排序。

或者如何在Audio's genre Songmanager.getSonglist ...中捕捉到该标签已被交换以及该标签的标题是什么。

还有如何制作它,以便在选择时可以将歌曲添加到main activity选项卡。

这是我创建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

整个结果如下:

enter image description here

2 个答案:

答案 0 :(得分:2)

我将回答您的问题,即您想根据不同类型的流派显示不同的音频列表。

好的,所以我认为第一个问题是如何从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;
            }
        }

希望有帮助。
让我知道是否需要更多帮助。

答案 1 :(得分:1)

所以您的解决方案对您自己有好处。 我目前正在使用媒体播放器应用程序,因此,如果您要缓存songadapater或创建缓存文件来存储数组对象所需的任何内容。

此方法写入缓存文件。

void createdcachedreadfile(Context con, String filename) throws IOException {
    String tempfile = null;
    for (Songpojo file : songpojoList) {
        FileOutputStream fos = null;
        try {
            fos = con.openFileOutput(filename, Context.MODE_PRIVATE);
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            oos.writeObject(songpojoList);
            oos.close();
            fos.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

要检索

  public Object readCaheFile(Context context1, String filename) throws IOException, ClassNotFoundException {
    FileInputStream fis = context1.openFileInput(filename);
    ObjectInputStream ois = new ObjectInputStream(fis);
    Object object = ois.readObject();
    return object;
}

也许这仍然很有帮助

祝您编程愉快!!!!