package com.wm.remusic.fragment; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; import android.support.v4.app.Fragment; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.TextView; import com.bilibili.magicasakura.widgets.TintImageView; import com.github.promeg.pinyinhelper.Pinyin; import com.wm.remusic.R; import com.wm.remusic.activity.AlbumsDetailActivity; import com.wm.remusic.activity.SelectActivity; import com.wm.remusic.handler.HandlerUtil; import com.wm.remusic.info.MusicInfo; import com.wm.remusic.service.MusicPlayer; import com.wm.remusic.uitl.Comparator.MusicComparator; import com.wm.remusic.uitl.IConstants; import com.wm.remusic.uitl.MusicUtils; import com.wm.remusic.uitl.PreferencesUtility; import com.wm.remusic.uitl.SortOrder; import com.wm.remusic.widget.DividerItemDecoration; import com.wm.remusic.widget.SideBar; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; /** * Created by wm on 2016/1/19. */ public class MusicFragment extends BaseFragment { private Adapter mAdapter; private ArrayList<MusicInfo> musicInfos; private RecyclerView recyclerView; private LinearLayoutManager layoutManager; private PreferencesUtility mPreferences; private FrameLayout frameLayout; private View view; private boolean isFirstLoad = true; private SideBar sideBar; private TextView dialogText; private HashMap<String, Integer> positionMap = new HashMap<>(); private boolean isAZSort = true; private void loadView() { //setUservisibleHint 可能先与attach if (view == null && mContext != null) { view = LayoutInflater.from(mContext).inflate(R.layout.recylerview, frameLayout, false); dialogText = (TextView) view.findViewById(R.id.dialog_text); recyclerView = (RecyclerView) view.findViewById(R.id.recyclerview); layoutManager = new LinearLayoutManager(mContext); recyclerView.setLayoutManager(layoutManager); mAdapter = new Adapter(null); recyclerView.setAdapter(mAdapter); recyclerView.setHasFixedSize(true); //fastScroller = (FastScroller) view.findViewById(R.id.fastscroller); recyclerView.addItemDecoration(new DividerItemDecoration(mContext, DividerItemDecoration.VERTICAL_LIST)); sideBar = (SideBar) view.findViewById(R.id.sidebar); sideBar.setOnTouchingLetterChangedListener(new SideBar.OnTouchingLetterChangedListener() { @Override public void onTouchingLetterChanged(String s) { dialogText.setText(s); sideBar.setView(dialogText); if (positionMap.get(s) != null) { int i = positionMap.get(s); ((LinearLayoutManager) recyclerView.getLayoutManager()).scrollToPositionWithOffset(i + 1, 0); } } }); reloadAdapter(); Log.e("MusicFragment", "load l"); } } @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if(isVisibleToUser){ loadView(); } } private RecyclerView.OnScrollListener scrollListener = new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); if (newState == RecyclerView.SCROLL_STATE_DRAGGING) { sideBar.setVisibility(View.VISIBLE); } } }; @Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); mPreferences = PreferencesUtility.getInstance(mContext); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.load_framelayout, container, false); frameLayout = (FrameLayout) view.findViewById(R.id.loadframe); View loadView = LayoutInflater.from(mContext).inflate(R.layout.loading, frameLayout, false); frameLayout.addView(loadView); isFirstLoad = true; isAZSort = mPreferences.getSongSortOrder().equals(SortOrder.SongSortOrder.SONG_A_Z); if(getUserVisibleHint()){ loadView(); } return view; } //刷新列表 public void reloadAdapter() { if (mAdapter == null) { return; } new AsyncTask<Void, Void, Void>() { @Override protected Void doInBackground(final Void... unused) { isAZSort = mPreferences.getSongSortOrder().equals(SortOrder.SongSortOrder.SONG_A_Z); ArrayList<MusicInfo> songList = (ArrayList) MusicUtils.queryMusic(mContext, IConstants.START_FROM_LOCAL); // 名称排序时,重新排序并加入位置信息 if (isAZSort) { Collections.sort(songList, new MusicComparator()); for (int i = 0; i < songList.size(); i++) { if (positionMap.get(songList.get(i).sort) == null) positionMap.put(songList.get(i).sort, i); } } mAdapter.updateDataSet(songList); return null; } @Override protected void onPostExecute(Void aVoid) { mAdapter.notifyDataSetChanged(); if (isAZSort) { recyclerView.addOnScrollListener(scrollListener); } else { sideBar.setVisibility(View.INVISIBLE); recyclerView.removeOnScrollListener(scrollListener); } Log.e("MusicFragment","load t"); if (isFirstLoad) { Log.e("MusicFragment","load"); frameLayout.removeAllViews(); //framelayout 创建了新的实例 ViewGroup p = (ViewGroup) view.getParent(); if (p != null) { p.removeAllViewsInLayout(); } frameLayout.addView(view); isFirstLoad = false; } } }.execute(); } @Override public void onActivityCreated(final Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); setHasOptionsMenu(true); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); inflater.inflate(R.menu.song_sort_by, menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.menu_sort_by_az: mPreferences.setSongSortOrder(SortOrder.SongSortOrder.SONG_A_Z); reloadAdapter(); return true; case R.id.menu_sort_by_date: mPreferences.setSongSortOrder(SortOrder.SongSortOrder.SONG_DATE); reloadAdapter(); return true; case R.id.menu_sort_by_artist: mPreferences.setSongSortOrder(SortOrder.SongSortOrder.SONG_ARTIST); reloadAdapter(); return true; case R.id.menu_sort_by_album: mPreferences.setSongSortOrder(SortOrder.SongSortOrder.SONG_ALBUM); reloadAdapter(); return true; } return super.onOptionsItemSelected(item); } //异步加载recyclerview界面 private class loadSongs extends AsyncTask<String, Void, String> { @Override protected String doInBackground(String... params) { if (mContext != null) { musicInfos = (ArrayList<MusicInfo>) MusicUtils.queryMusic(mContext, IConstants.START_FROM_LOCAL); for (int i = 0; i < musicInfos.size(); i++) { char c = Pinyin.toPinyin(musicInfos.get(i).musicName.charAt(0)).charAt(0); } if (musicInfos != null) mAdapter = new Adapter(musicInfos); } return "Executed"; } @Override protected void onPostExecute(String result) { recyclerView.setAdapter(mAdapter); if (mContext != null) recyclerView.addItemDecoration(new DividerItemDecoration(mContext, DividerItemDecoration.VERTICAL_LIST)); } @Override protected void onPreExecute() { } } public class Adapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { final static int FIRST_ITEM = 0; final static int ITEM = 1; private ArrayList<MusicInfo> mList; PlayMusic playMusic; Handler handler; public Adapter(ArrayList<MusicInfo> list) { // if (list == null) { // throw new IllegalArgumentException("model Data must not be null"); // } handler = HandlerUtil.getInstance(mContext); mList = list; } //更新adpter的数据 public void updateDataSet(ArrayList<MusicInfo> list) { this.mList = list; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { if (viewType == FIRST_ITEM) return new CommonItemViewHolder(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.common_item, viewGroup, false)); else { return new ListItemViewHolder(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.fragment_musci_common_item, viewGroup, false)); } } //判断布局类型 @Override public int getItemViewType(int position) { return position == FIRST_ITEM ? FIRST_ITEM : ITEM; } //将数据与界面进行绑定 @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { MusicInfo model = null; if (position > 0) { model = mList.get(position - 1); } if (holder instanceof ListItemViewHolder) { ((ListItemViewHolder) holder).mainTitle.setText(model.musicName.toString()); ((ListItemViewHolder) holder).title.setText(model.artist.toString()); //判断该条目音乐是否在播放 if (MusicPlayer.getCurrentAudioId() == model.songId) { ((ListItemViewHolder) holder).playState.setVisibility(View.VISIBLE); ((ListItemViewHolder) holder).playState.setImageResource(R.drawable.song_play_icon); ((ListItemViewHolder) holder).playState.setImageTintList(R.color.theme_color_primary); } else { ((ListItemViewHolder) holder).playState.setVisibility(View.GONE); } } else if (holder instanceof CommonItemViewHolder) { ((CommonItemViewHolder) holder).textView.setText("(共" + mList.size() + "首)"); ((CommonItemViewHolder) holder).select.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(mContext, SelectActivity.class); intent.putParcelableArrayListExtra("ids", mList); intent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); mContext.startActivity(intent); } }); } } @Override public int getItemCount() { return (null != mList ? mList.size() + 1 : 0); } public class CommonItemViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { TextView textView; ImageView select; CommonItemViewHolder(View view) { super(view); this.textView = (TextView) view.findViewById(R.id.play_all_number); this.select = (ImageView) view.findViewById(R.id.select); view.setOnClickListener(this); } public void onClick(View v) { //// TODO: 2016/1/20 if(playMusic != null) handler.removeCallbacks(playMusic); if(getAdapterPosition() > -1){ playMusic = new PlayMusic(0); handler.postDelayed(playMusic,70); } // HandlerUtil.getInstance(getContext()).postDelayed(new Runnable() { // @Override // public void run() { // long[] list = new long[mList.size()]; // HashMap<Long, MusicInfo> infos = new HashMap(); // for (int i = 0; i < mList.size(); i++) { // MusicInfo info = mList.get(i); // list[i] = info.songId; // info.islocal = true; // info.albumData = MusicUtils.getAlbumArtUri(info.albumId) + ""; // infos.put(list[i], mList.get(i)); // } // MusicPlayer.playAll(infos, list, 0, false); // } // },70); } } public class ListItemViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { //ViewHolder ImageView moreOverflow; TextView mainTitle, title; TintImageView playState; ListItemViewHolder(View view) { super(view); this.mainTitle = (TextView) view.findViewById(R.id.viewpager_list_toptext); this.title = (TextView) view.findViewById(R.id.viewpager_list_bottom_text); this.playState = (TintImageView) view.findViewById(R.id.play_state); this.moreOverflow = (ImageView) view.findViewById(R.id.viewpager_list_button); moreOverflow.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { MoreFragment morefragment = MoreFragment.newInstance(mList.get(getAdapterPosition() - 1), IConstants.MUSICOVERFLOW); morefragment.show(getFragmentManager(), "music"); } }); view.setOnClickListener(this); } @Override public void onClick(View v) { if(playMusic != null) handler.removeCallbacks(playMusic); if(getAdapterPosition() > -1){ playMusic = new PlayMusic(getAdapterPosition() - 1); handler.postDelayed(playMusic,70); } // HandlerUtil.getInstance(getContext()).postDelayed(new Runnable() { // @Override // public void run() { // long[] list = new long[mList.size()]; // HashMap<Long, MusicInfo> infos = new HashMap(); // for (int i = 0; i < mList.size(); i++) { // MusicInfo info = mList.get(i); // list[i] = info.songId; // info.islocal = true; // info.albumData = MusicUtils.getAlbumArtUri(info.albumId) + ""; // infos.put(list[i], mList.get(i)); // } // if (getAdapterPosition() > 0) // MusicPlayer.playAll(infos, list, getAdapterPosition() - 1, false); // } // }, 60); } } class PlayMusic implements Runnable{ int position; public PlayMusic(int position){ this.position = position; } @Override public void run() { long[] list = new long[mList.size()]; HashMap<Long, MusicInfo> infos = new HashMap(); for (int i = 0; i < mList.size(); i++) { MusicInfo info = mList.get(i); list[i] = info.songId; info.islocal = true; info.albumData = MusicUtils.getAlbumArtUri(info.albumId) + ""; infos.put(list[i], mList.get(i)); } if (position > -1) MusicPlayer.playAll(infos, list, position, false); } } } }