思路:
项目需求对已知的音乐路径作排序, 做成window状态的图形操作模式,不过网上似乎没找到. 后来我把这堆集合放入TreeSet ,利用集合的唯一性和TreeSet的自然排序. 对这个String 泛型的Set 分别作split 切割 ,通过判断”/”的第一个字符串 ,把他们放入一个叫pathHeadStringList的集合中. 再建一个FolderBean的实体对象, 内含属性:文件名 作为数据适配给recyclerview.
遍历的思想是通过recyclerview 自己定义的item 点击事件, 当设置点击事件时,判断获取的segment段后缀, 如果不是MP3后缀的话遍历出string对象(当然也可以判断是否最后一个”/”)
,在不断的点击中更换recyclerview 的adapter 所依赖的集合, 来实现文件遍历和排序.
在更换集合前, 存进preDataSet中, 每次按手机返回键的时候 把preDataSet中返回(只存比现在DataSet目录 上级的目录) ,这样保证返回到顶级目录的时候 按back不会再跳转到次级目录, 而是直接退出界面.
因为项目不需要这个需求了, 把这个需求思路留下 方便日后使用和大家分享.
if (!getAdapter().getDataSet().get(position).getFolderName().endsWith(".mp3")) {
ArrayList<String> a = new ArrayList<>();
a.addAll(mArrayList);
mArrayList.clear();
for (String sa : mStringSet) {
Logger.d(sa);
if (a.size() > 0 && sa.contains(a.get(position))) {
String[] splitString = sa.trim().split("/");
if (searchIndex >= splitString.length) {
return;
}
if (!mArrayList.contains(splitString[searchIndex])) {
mArrayList.add(splitString[searchIndex]);
}
}
}
for (int i = 0; i < mArrayList.size(); i++) {
Logger.d(mArrayList.get(i));
}
ArrayList<FolderBean> folderBeanList = getFolderBeen(mData, mArrayList);
getAdapter().swapDataSet(folderBeanList);
getAdapter().notifyDataSetChanged();
} else {
MusicPlayerRemote.openQueue(getSongArrayList(mArrayList), position, true);
}
期间不得不说AsyncTaskLoader, 具备AsyncTask的特点 附带跟随Activity生命周期, 不溢出.
private static class AsyncSongLoader extends WrappedAsyncTaskLoader<ArrayList<Song>> {
public AsyncSongLoader(Context context) {
super(context);
}
@Override
public ArrayList<Song> loadInBackground() {
ArrayList<Song> songList = SongLoader.getAllSongs(getContext());
return songList;
}
}
通过AsyncTaskLoader异步或者所有的歌曲, 在LoaderManager的initLoader方法中标记
getLoaderManager().initLoader(LOADER_ID, null, this);
在onLoadFinished中按照这样的思路或者出recyclerview所需要的mData
mData = data;
ArrayList<String> stringPathList = getFolderListFromSong(data);
ArrayList<FolderBean> folderBeanList = getFolderBeen(data, stringPathList);
getAdapter().swapDataSet(folderBeanList);
@Override
public void onLoaderReset(Loader<ArrayList<Song>> loader) {
getAdapter().swapDataSet(new ArrayList<FolderBean>());
}
public class FolderPlusFragment extends AbsLibRecFragment<FolderAdapter, GridLayoutManager>
implements LoaderManager.LoaderCallbacks<ArrayList<Song>>, FolderAdapter.OnRvItemClickListener {
private static final int LOADER_ID = LoaderIds.FOLDERSPLUS_FRAGMENT;
private int currentLayoutRes;
private ArrayList<String> mArrayList;
private TreeSet<String> mStringSet;
private FolderAdapter mFolderAdapter;
private ArrayList<Song> mData;
private ArrayList<Song> mSongArrayList;
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
getLoaderManager().initLoader(LOADER_ID, null, this);
}
@NonNull
@Override
protected GridLayoutManager createLayoutManager() {
return new GridLayoutManager(getActivity(), 1);
}
@Override
public Loader<ArrayList<Song>> onCreateLoader(int id, Bundle args) {
mSongArrayList = new ArrayList<>();
mArrayList = new ArrayList<>();
mStringSet = new TreeSet<>();
mData = new ArrayList<>();
return new AsyncSongLoader(getActivity());
}
@Override
public void onLoadFinished(Loader<ArrayList<Song>> loader, ArrayList<Song> data) {
mData = data;
ArrayList<String> stringPathList = getFolderListFromSong(data);
ArrayList<FolderBean> folderBeanList = getFolderBeen(data, stringPathList);
getAdapter().swapDataSet(folderBeanList);
}
@NonNull
private ArrayList<FolderBean> getFolderBeen(ArrayList<Song> data, ArrayList<String> stringPathList) {
ArrayList<FolderBean> folderBeanList = new ArrayList<>();
for (int i = 0; i < stringPathList.size(); i++) {
FolderBean f = new FolderBean(stringPathList.get(i), data.get(i).getData(), data.get(i).getAlbumId());
folderBeanList.add(f);
}
return folderBeanList;
}
private ArrayList getFolderListFromSong(ArrayList<Song> data) {
for (int i = 0; i < data.size(); i++) {
mStringSet.add(data.get(i).getData());
}
return getFolderNameList(1);
}
private ArrayList<String> getFolderNameList(int searchIndex) {
for (String s : mStringSet) {
String[] splitString = s.trim().split("/");
if (!mArrayList.contains(splitString[searchIndex])) {
mArrayList.clear();
mArrayList.add(splitString[searchIndex]);
}
}
return mArrayList;
}
@Override
public void onLoaderReset(Loader<ArrayList<Song>> loader) {
getAdapter().swapDataSet(new ArrayList<FolderBean>());
}
@LayoutRes
protected int getItemLayoutRes() {
return R.layout.item_local_folder;
}
protected final void notifyLayoutResChanged(@LayoutRes int res) {
this.currentLayoutRes = res;
RecyclerView recyclerView = getRecyclerView();
if (recyclerView != null) {
applyRecyclerViewPaddingForLayoutRes(recyclerView, currentLayoutRes);
}
}
@NonNull
@Override
protected FolderAdapter createAdapter() {
int itemLayoutRes = getItemLayoutRes();
notifyLayoutResChanged(itemLayoutRes);
ArrayList<FolderBean> dataSet = getAdapter() == null ? new ArrayList<FolderBean>() : getAdapter().getDataSet();
FolderAdapter folderAdapter = new FolderAdapter(
getLibraryFragment().getMainActivity(),
dataSet,
getActivity());
folderAdapter.setOnRvItemClickListener(this);
return folderAdapter;
}
@Override
public void onItemClick(int position, int searchIndex) {
if (!getAdapter().getDataSet().get(position).getFolderName().endsWith(".mp3")) {
ArrayList<String> a = new ArrayList<>();
a.addAll(mArrayList);
mArrayList.clear();
for (String sa : mStringSet) {
Logger.d(sa);
if (a.size() > 0 && sa.contains(a.get(position))) {
String[] splitString = sa.trim().split("/");
if (searchIndex >= splitString.length) {
return;
}
if (!mArrayList.contains(splitString[searchIndex])) {
mArrayList.add(splitString[searchIndex]);
}
}
}
for (int i = 0; i < mArrayList.size(); i++) {
Logger.d(mArrayList.get(i));
}
ArrayList<FolderBean> folderBeanList = getFolderBeen(mData, mArrayList);
getAdapter().swapDataSet(folderBeanList);
getAdapter().notifyDataSetChanged();
} else {
MusicPlayerRemote.openQueue(getSongArrayList(mArrayList), position, true);
}
}
public ArrayList<Song> getSongArrayList(ArrayList<String> stringList) {
mSongArrayList.clear();
for (String s : stringList) {
Logger.d(s);
}
for (int i = 0; i < mData.size(); i++) {
if (mData.contains("地震")) {
Logger.d(mData.get(i).getData());
}
for (String s : stringList) {
if (mData.get(i).getData().contains(s)) {
Logger.d(s +" >>>"+mData.get(i).getData());
mSongArrayList.add(mData.get(i));
}
}
}
return mSongArrayList;
}
private static class AsyncSongLoader extends WrappedAsyncTaskLoader<ArrayList<Song>> {
public AsyncSongLoader(Context context) {
super(context);
}
@Override
public ArrayList<Song> loadInBackground() {
ArrayList<Song> songList = SongLoader.getAllSongs(getContext());
return songList;
}
}
protected void applyRecyclerViewPaddingForLayoutRes(@NonNull RecyclerView recyclerView, @LayoutRes int res) {
int padding;
int intPre = DensityUtil.dip2px(getContext(), 1);
if (res == com.online.music.free.R.layout.item_grid) {
// padding = (int) (getResources().getDisplayMetrics().density * 2);
padding = intPre;
} else {
padding = 0;
}
recyclerView.setPadding(padding * 4, padding * 4, padding * 4, padding * 0);
}
}