Заполнение TabLayout с использованием FragmentStatePagerAdapter только с выбранными элементами - PullRequest
0 голосов
/ 29 июня 2018

Я использую Android TabLayout для генерации tabs с FragmentStatePagerAdapter как adapter. Теперь с этим кодом он генерирует items на каждом tab, когда я его прокручиваю.

SongManager.getAudioListFromResponse(result) дает List из Audio объектов, каждый из которых имеет String, называемый жанром. Например, первое аудио имеет жанр рок, а второе - жанр блюз.

getItem() в SongListAdapter создает новый фрагмент, который использует атрибуты одного Audio и добавляет его к 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

Ответы [ 2 ]

0 голосов
/ 09 июля 2018

ТАК Ваше решение придумать самостоятельно. В настоящее время я работаю над приложением медиа-проигрывателя, поэтому, если вы хотите кэшировать свой 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;
}

Может быть, это все еще полезно

Удачного кодирования !!!!

0 голосов
/ 04 июля 2018

Я отвечу за то, что понимаю из вашего вопроса, то есть вы хотите показать разные списки Аудио в зависимости от жанра в разных вкладках.

Хорошо, поэтому я думаю, что первая проблема в том, как вы возвращаете экземпляр фрагмента из метода getItem SongsListAdapter, т.е.

@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;
            }
        }

Надеюсь, это поможет.
Дайте мне знать, если вам понадобится дополнительная помощь.

...