Back to project page Music-Share-Android.
The source code is released under:
GNU General Public License
If you think the Android project Music-Share-Android listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.
package com.paperairplane.music.share; // w w w. j a v a2 s. c om import java.util.Arrays; import java.util.Comparator; import java.util.HashMap; import android.content.Context; import android.content.SharedPreferences; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.SectionIndexer; import android.widget.TextView; import com.paperairplane.music.share.R; import com.paperairplane.music.share.cache.ImageLoader; /** * ?????????ListView?Adapater * * @author Harry Chen (<a href="mailto:chenshengqi1@gmail.com">Harry Chen</a>) * @author Xavier Yao (<a href="mailto:xavieryao@me.com">Xavier Yao</a>) * @see <a * href="http://www.github.com/PaperAirPlane-Dev-Team/Music-Share-Android">Our * GitHub</a> */ public class MusicListAdapter extends BaseAdapter implements SectionIndexer { private Context mContext; private MusicData mMusicDatas[]; private HashMap<Character, Integer> mSectionMap; private Character[] mSectionCharArr; private boolean mIsTextColorSet, mHasUnknownChar; private int mTextColor; private ImageLoader mImageLoader; /** * ???? * * @param context * App??? * @param musicdatas * ??????????????? */ public MusicListAdapter(Context context, MusicData musicdatas[]) { mContext = context; mMusicDatas = musicdatas;// ????Cursor? mImageLoader = new ImageLoader(mContext, mMusicDatas); Arrays.sort(mMusicDatas, new Comparator<MusicData>() { @Override public int compare(MusicData lhs, MusicData rhs) { return lhs.compareTo(rhs); } }); int length = mMusicDatas.length; mSectionMap = new HashMap<Character, Integer>(); char charTemp = 0, charNow;// ?????????????? for (int i = length - 1; i >= 0; i--) { charNow = mMusicDatas[i].getFirstChar(); if (charTemp == charNow) { mSectionMap.remove(charTemp); } charTemp = mMusicDatas[i].getFirstChar(); mSectionMap.put(charTemp, i); /* * ???????,???????,????????,??????????????????????? ???????????? */ } if (mMusicDatas[mMusicDatas.length - 1].getFirstChar() == Consts.UNKNOWN_CHAR) { mHasUnknownChar = true; } mIsTextColorSet = false; SharedPreferences preference = mContext.getSharedPreferences( Consts.Preferences.GENERAL, Context.MODE_PRIVATE); String color=preference .getString(Consts.Preferences.TEXT_COLOR, ""); if (!color.equals("")) { mTextColor = android.graphics.Color.parseColor(color); mIsTextColorSet = true; } } public int getCount() { // if (mMusicDatas != null) { return mMusicDatas.length; // } // return 0; } public Object getItem(int position) { return mMusicDatas[position]; } public long getItemId(int position) { return position; } public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null;//????????????????????? if (convertView == null) { convertView = LayoutInflater.from(mContext).inflate( R.layout.musiclist_item, null); holder = new ViewHolder(); holder.tvTitle = (TextView) convertView .findViewById(R.id.musicname); holder.tvArtist = (TextView) convertView.findViewById(R.id.singer); holder.ivArtwork = (ImageView) convertView.findViewById(R.id.imageView1); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.tvTitle.setText(mMusicDatas[position].getTitle()); holder.tvArtist.setText(mMusicDatas[position].getArtist()); holder.ivArtwork.setImageResource(R.drawable.albumart_mp_unknown_list); mImageLoader.DisplayImage( "" + mMusicDatas[position].getAlbumId(), holder.ivArtwork, false); if (mIsTextColorSet) { holder.tvArtist.setTextColor(mTextColor); holder.tvTitle.setTextColor(mTextColor); } return convertView; } private static class ViewHolder { TextView tvTitle; TextView tvArtist; ImageView ivArtwork; } @Override public int getPositionForSection(int section) { char sectionChar = mSectionCharArr[section]; if (mHasUnknownChar && section == mSectionMap.size() - 1) // ???????? sectionChar = Consts.UNKNOWN_CHAR; int position = mSectionMap.get(sectionChar); return position; } @Override public int getSectionForPosition(int position) { int section = 0; char charNow = mMusicDatas[position].getFirstChar(); for (char charTemp : mSectionCharArr) { if (charNow != charTemp) { section++; continue; } if (charNow == charTemp) { break; } } if (charNow == Consts.UNKNOWN_CHAR) { // ??????????, ????????????????????????? return mSectionMap.size() - 1; } return section; } @Override public Object[] getSections() { // char[] s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ#".toCharArray(); int arraySize = mSectionMap.size(); mSectionCharArr = new Character[arraySize]; mSectionCharArr = mSectionMap.keySet().toArray(mSectionCharArr); // Sort for (int i = 0; i < arraySize; i++) { for (int j = 0; j < arraySize; j++) { if (mSectionCharArr[i].charValue() < mSectionCharArr[j].charValue()) { Character c = mSectionCharArr[i]; mSectionCharArr[i] = mSectionCharArr[j]; mSectionCharArr[j] = c; } } } /* * ????????????????????ArrayIndexOutOfBound???? ?????????, ??????????????-1, * ???arraySize?0 ???????????,?????????? */ return mSectionCharArr; } }