安卓 实现对已知路径文件夹以及文件排序和遍历

思路:
项目需求对已知的音乐路径作排序, 做成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);
    }

}

猜你喜欢

转载自blog.csdn.net/qq_36331942/article/details/78292377