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);
}
}
整个结果如下所示:
解决方法:
我将回答您的问题,即您想根据不同标签中的流派显示不同的音频列表.
好的,所以我认为第一个问题是如何从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