gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 13:41:29 24 4
gpt4 key购买 nike

我正在使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com