我正在使用 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);
}
}
整个结果是这样的:
最佳答案
我会根据您的问题来回答,即您想在不同的选项卡中根据流派显示不同的音频列表。
好的,所以我认为第一个问题是如何从 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/