Android 使用FragmentStatePagerAdapter仅使用选定项填充表格布局
我正在使用Android 使用FragmentStatePagerAdapter仅使用选定项填充表格布局,android,android-viewpager,android-tablayout,fragmentstatepageradapter,Android,Android Viewpager,Android Tablayout,Fragmentstatepageradapter,我正在使用Android TabLayout以FragmentStatePagerAdapter作为适配器生成选项卡。现在有了这段代码,当我滚动它时,它会在每个选项卡上生成项 SongManager.getAudioListFromResponse(result)给出了音频对象的列表,每个对象都有一个称为流派的字符串。例如,第一个音频有摇滚风格,第二个有布鲁斯风格 SongListAdapter中的getItem()生成一个新片段,该片段使用一个Audio的属性,并将其添加到要显示的recyle
Android TabLayout
以FragmentStatePagerAdapter
作为适配器生成选项卡
。现在有了这段代码,当我滚动它时,它会在每个选项卡上生成项
SongManager.getAudioListFromResponse(result)
给出了音频对象的列表
,每个对象都有一个称为流派的字符串。例如,第一个音频有摇滚风格,第二个有布鲁斯风格
SongListAdapter
中的getItem()
生成一个新片段,该片段使用一个Audio
的属性,并将其添加到要显示的recylerview
。(如果需要,我可以添加SongListFragment
)
目前,此代码正在用相同的片段填充所有选项卡。无论我选择哪个选项卡
,它们都是一样的
我的问题是。。我怎样才能使它获得音频的类型
,并对其进行相应的排序
或者我如何在主要活动中捕捉歌曲管理器.getSonglist。。。选项卡已被交换,以及选项卡的标题是什么
还有,我该如何做才能在选择时将歌曲添加到推荐的
选项卡
下面是我创建表格布局的代码:
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);
}
});
整个结果如下所示:
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;
}
}
我将回答您的问题,您想在不同的选项卡中根据类型显示不同的音频列表
好的,我认为第一个问题是如何从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;
}
在这里,您应该返回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;
}
希望有帮助。
如果您需要更多帮助,请告诉我。这样您自己就能找到解决方案。
我目前正在开发media player应用程序,所以如果您想缓存您的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;
}
也许这仍然有用
编码快乐 请澄清你的问题!“我需要一个标签上的一些片段,等等。”你是说你需要一个标签上的片段和其他标签上的片段吗?如果是这样,您将需要不同的数据结构,例如列表列表,并在适配器中返回所选列表。您还可以使用(流派?)并从您的adapter@kalabalik试图澄清这个问题你能从SongManager获得基于流派的歌曲列表吗?如果没有,那么现在就获取歌曲列表,然后在列表上迭代,根据流派制作多个列表。这并不理想,但如果您没有一个api返回基于genreFew的列表,您就必须这样做:1<代码>tab.setCustomView(songListAdapter.getTabView(i))代码>是多余的。您已经在使用ViewPager(..)进行设置了。此外,您的自定义视图只是文本,为什么要自己膨胀它呢。2. <代码>slf.setAudioList(getAudioList())代码>这不是向片段传递数据的方式。查看:@rafid059SongManager
返回的列表具有流派属性。是指向SongManager的链接。如果是这样的话,我必须列出多个列表?很抱歉,我实际上找到了一些接近这个的东西,但忘了在这里回答。无论如何,谢谢你的回答,我猜我会给你赏金,但我会等一天左右。也许有更好的解决方案。事实上,我知道有更好的方法来实现,因为我自己也尝试过这些方法。我想在更短的时间内给出最简单的解决方案。我很高兴你自己找到了解决办法,干得好。
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;
}