Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/206.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用FragmentStatePagerAdapter仅使用选定项填充表格布局_Android_Android Viewpager_Android Tablayout_Fragmentstatepageradapter - Fatal编程技术网

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())这不是向片段传递数据的方式。查看:@rafid059
SongManager
返回的列表具有流派属性。是指向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;
}