今天主要完成从Media数据库中获取歌曲信息,然后布置在ui上,并在github上create了项目工程。
github地址: https://github.com/kwcn/OnlineMusic
具体内容:
使用RecyclerView布置fragment,RecyclerView.adpater提供了很多灵活的api,方便处理界面中的每个item。
ui布置:
1. layout:
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:id="@+id/fragment"
android:layout_width="match_parent"
android:layout_height="match_parent"></FrameLayout>
</LinearLayout>
fragment_base.xml
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="kwcn.master.fragment.BaseFragment">
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>
item_base.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="58dp">
<ImageView
android:id="@+id/img"
android:layout_width="58dp"
android:layout_height="58dp"
android:layout_margin="4dp" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginStart="4dp"
android:layout_toEndOf="@+id/img"
android:orientation="vertical">
<TextView
android:id="@+id/txt1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:lines="1"
android:textSize="18sp" />
<TextView
android:id="@+id/txt2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:lines="1"
android:textSize="15sp" />
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_alignParentBottom="true"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_toEndOf="@+id/img"
android:background="@android:color/holo_blue_light" />
</RelativeLayout>
2. activity中设置fragment:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
BaseFragment baseFragment = BaseFragment.newInstance();
getFragmentManager().beginTransaction().replace(R.id.fragment, baseFragment).commit();
}
}
3. fragment设置recyclerview和recyclerview.adpater。这里MediaDBHelper.getMusicInfoAll(context)的数据来自查询media数据库表中歌曲的信息,传入到adpter中。
public class BaseFragment extends Fragment {
public RecyclerView mRecyclerView;
public BaseAdapter mBaseAdapter;
public BaseFragment() {
// Required empty public constructor
}
public static BaseFragment newInstance() {
return new BaseFragment();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle
savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_base, container, false);
final Context context = getActivity().getApplicationContext();
mRecyclerView = view.findViewById(R.id.recyclerView);
mBaseAdapter = new BaseAdapter(MediaDBHelper.getMusicInfoAll(context), context);
mRecyclerView.setAdapter(mBaseAdapter);
mRecyclerView.setLayoutManager(new LinearLayoutManager(context));
return view;
}
}
4. adpater中载入歌曲数据,与ui控件绑定:
public class BaseAdapter extends RecyclerView.Adapter<BaseAdapter.ViewHolder> {
private Context mContext;
private List<Music> mMusicList;
public BaseAdapter(List<Music> list, Context context) {
mMusicList = list;
mContext = context;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new ViewHolder(LayoutInflater.from(mContext).inflate(R.layout
.item_base, parent, false));
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
Music music = mMusicList.get(position);
holder.mTxt1.setText(music.mTitle);
holder.mTxt2.setText(music.mArtist);
Bitmap bm = BitmapFactory.decodeFile(music.mAlbumArt);
BitmapDrawable bmpDraw = new BitmapDrawable(bm);
holder.mImg.setImageDrawable(bmpDraw);
}
@Override
public int getItemCount() {
return mMusicList.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
private TextView mTxt1;
private TextView mTxt2;
private ImageView mImg;
public ViewHolder(View itemView) {
super(itemView);
mTxt1 = itemView.findViewById(R.id.txt1);
mTxt2 = itemView.findViewById(R.id.txt2);
mImg = itemView.findViewById(R.id.img);
}
}
}
从Media数据库中获取歌曲信息:
1. 建立Music实体类,根据所需构造(这里应该封装变量,使用set和get方法控制变量,待优化):
public class Music implements MediaStore.MediaColumns {
public final String mMediaId;
public final String mPath;
public final String mDisplayName;
public final String mTitle;
public final String mArtistId;
public final String mArtist;
public final String mAlbumId;
public final String mAlbum;
public final String mAlbumArt;
public Music(String mMediaId, String mPath, String mDisplayName, String mTitle, String
mArtistId, String mArtist, String mAlbumId, String mAlbum, String mAlbumArt) {
this.mMediaId = mMediaId;
this.mPath = mPath;
this.mDisplayName = mDisplayName;
this.mTitle = mTitle;
this.mArtistId = mArtistId;
this.mArtist = mArtist;
this.mAlbumId = mAlbumId;
this.mAlbum = mAlbum;
this.mAlbumArt = mAlbumArt;
}
@Override
public String toString() {
return "mMediaId:[" + mMediaId + "] " + "mPath:[" + mPath + "] " + "mDisplayName:[" +
mDisplayName + "] " + "mTitle:[" + mTitle + "] " + "mArtistId:[" + mArtistId + "]" +
" " + "mArtist:[" + mArtist + "] " + "mAlbumId:[" + mAlbumId + "] " + "mAlbum:["
+ mAlbum + "] " + "mAlbumArt:[" + mAlbumArt + "]";
}
}
2. 查询数据,构造music对象集合:
public class MediaDBHelper {
public final static Uri MEDIA_URI = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
public final static Uri ALBUM_URI = MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI;
public static List<Music> getMusicInfoAll(Context context) {
String projection[] = {MediaStore.Audio.Media._ID, MediaStore.Audio.Media.DATA,
MediaStore.Audio.Media.DISPLAY_NAME, MediaStore.Audio.Media.TITLE, MediaStore
.Audio.Media.ARTIST_ID, MediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media
.ALBUM_ID, MediaStore.Audio.Media.ALBUM};
try (Cursor c = context.getContentResolver().query(MEDIA_URI, projection, null, null,
null, null)) {
if (c != null && c.moveToFirst()) {
List<Music> list = new ArrayList<>();
do {
String albumId = c.getString(6);
Music music = new Music(c.getString(0), c.getString(1), c.getString(2), c
.getString(3), c.getString(4), c.getString(5), albumId, c.getString
(7), getAlbumArt(context, albumId));
list.add(music);
} while (c.moveToNext());
return list;
}
}
return null;
}
@Nullable
private static String getAlbumArt(Context context, @NonNull String albumId) {
String projection[] = {MediaStore.Audio.AlbumColumns.ALBUM_ART};
String selection = MediaStore.Audio.Albums._ID + "=" + albumId;
try (Cursor c = context.getContentResolver().query(ALBUM_URI, projection, selection,
null, null, null)) {
if (c != null && c.moveToFirst()) {
return c.getString(0);
}
}
return null;
}
}
实现效果: