之前我们曾向您介绍过在Android中实现service动态更新UI界面,在UI设计中需要利用很多图库相册软件,而Gallery 是国外一个免费开源的、功能非常强大、有丰富的扩展图库相册软件。本文将讲解利用两个Gallery实现类似多级联动的功能。
一个Gallery是歌曲专辑图片,另一个Gallery是专辑的歌曲。滑动专辑Gallery,下面的歌曲也会随之发生变动。
Gallery布局
主要的布局是有两个相对布局+两个Gallery组成的:
- 1: <?xml version="1.0" encoding="utf-8"?>
- 2: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- 3: android:layout_width="fill_parent"
- 4: android:layout_height="fill_parent">
- 5: <!-- 专辑 -->
- 6: <Gallery android:id="@+id/gallery"
- 7: android:layout_width="fill_parent"
- 8: android:layout_height="wrap_content"
- 9: android:layout_alignParentTop="true"
- 10: android:gravity="center_horizontal"
- 11: android:spacing="16dp"
- 12: android:unselectedAlpha="0.5"/>
- 13: <!-- 歌曲 -->
- 14: <Gallery android:id="@+id/gallery2"
- 15: android:background="#FFF"
- 16: android:layout_width="fill_parent"
- 17: android:layout_height="30dp"
- 18: android:layout_below="@id/gallery"
- 19: android:layout_alignParentLeft="true"
- 20: android:gravity="center_vertical"
- 21: android:spacing="16dp"
- 22: android:unselectedAlpha="0.5" />
- 23: </RelativeLayout>
Gallery的适配器
在android中适配器很好的实现了MVC思想,它很好的为某些组件提供了数据和view的实现。此处我们需要通过继承BaseAdapter,实现两个Gallery的适配器。
- 1: /**
- 2: * 专辑
- 3: *
- 4: * @author halzhang
- 5: */
- 6: public class AlbumAdapter extends BaseAdapter {
- 7:
- 8: private Context context;
- 9:
- 10: private Cursor cursor;
- 11:
- 12: private Bitmap[] bitmaps;
- 13:
- 14: public AlbumAdapter(Context context) {
- 15: this.context = context;
- 16: this.cursor = context.getContentResolver().query(
- 17: MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI, null, null, null,
- 18: MediaStore.Audio.Albums.DEFAULT_SORT_ORDER);
- 19: bitmaps = new Bitmap[cursor.getCount()];
- 20: initBitmaps();
- 21: }
- 22:
- 23: /**
- 24: * 初始化专辑封面图片
- 25: */
- 26: private void initBitmaps() {
- 27: if (cursor.moveToFirst()) {
- 28: do {
- 29: bitmaps[cursor.getPosition()] = MusicUtils.getArtwork(context, -1, cursor
- 30: .getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Albums._ID)));
- 31: } while (cursor.moveToNext());
- 32: }
- 33: }
- 34:
- 35: public int getCount() {
- 36: if (cursor != null) {
- 37: return cursor.getCount();
- 38: }
- 39: return 0;
- 40: }
- 41:
- 42: public Object getItem(int position) {
- 43: return position;
- 44: }
- 45:
- 46: public long getItemId(int position) {
- 47: if (cursor != null) {
- 48: cursor.moveToPosition(position);
- 49: return cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Albums._ID));
- 50: }
- 51: return 0;
- 52: }
- 53:
- 54: public View getView(int position, View convertView, ViewGroup parent) {
- 55: ImageView iv = new ImageView(context);
- 56: iv.setLayoutParams(new Gallery.LayoutParams(100, 100));
- 57: iv.setAdjustViewBounds(true);
- 58: iv.setImageBitmap(bitmaps[position]);
- 59: return iv;
- 60: }
- 61:
- 62: }
- 1: /**
- 2: * 歌曲
- 3: *
- 4: * @author halzhang
- 5: */
- 6: public class AudioAdapter extends BaseAdapter {
- 7:
- 8: private Context context;
- 9:
- 10: private Cursor cursor;
- 11: /**专辑ID*/
- 12: private int albumId;
- 13:
- 14: public AudioAdapter(Context context, int albumId) {
- 15: this.context = context;
- 16: this.albumId = albumId;
- 17: this.cursor = context.getContentResolver().query(
- 18: MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null,
- 19: MediaStore.Audio.Media.ALBUM_ID + "=" + albumId, null,
- 20: MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
- 21: }
- 22:
- 23: public int getCount() {
- 24: if (cursor != null) {
- 25: return cursor.getCount();
- 26: }
- 27: return 0;
- 28: }
- 29:
- 30: public Object getItem(int position) {
- 31: return position;
- 32: }
- 33:
- 34: public long getItemId(int position) {
- 35: if (cursor != null) {
- 36: cursor.moveToPosition(position);
- 37: return cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media._ID));
- 38: }
- 39: return 0;
- 40: }
- 41:
- 42: public View getView(int position, View convertView, ViewGroup parent) {
- 43: cursor.moveToPosition(position);
- 44: TextView t = new TextView(context);
- 45: String title = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));
- 46: t.setLayoutParams(new Gallery.LayoutParams(LayoutParams.WRAP_CONTENT,
- 47: LayoutParams.WRAP_CONTENT));
- 48: t.setText(title);
- 49: t.setTextColor(Color.BLACK);
- 50: return t;
- 51: }
- 52:
- 53: /**
- 54: * 当专辑改变了,调用此方法更新adapter的数据
- 55: * @param albumId 专辑ID
- 56: */
- 57: public void notifyDataSetChanged(int albumId) {
- 58: this.cursor = context.getContentResolver().query(
- 59: MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null,
- 60: MediaStore.Audio.Media.ALBUM_ID + "=" + albumId, null,
- 61: MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
- 62: super.notifyDataSetChanged();
- 63: }
- 64:
- 65: }
Activity
- 1: public class MainActivity extends Activity implements AdapterView.OnItemSelectedListener {
- 2:
- 3: private Gallery album;
- 4:
- 5: private Gallery audio;
- 6:
- 7: private AlbumAdapter albumAdapter;
- 8:
- 9: private AudioAdapter audioAdapter;
- 10:
- 11: @Override
- 12: protected void onCreate(Bundle savedInstanceState) {
- 13: super.onCreate(savedInstanceState);
- 14: setContentView(R.layout.audio_player);
- 15: setupViews();
- 16: }
- 17:
- 18: // 个人习惯
- 19: private void setupViews() {
- 20: album = (Gallery) findViewById(R.id.gallery);
- 21: audio = (Gallery) findViewById(R.id.gallery2);
- 22:
- 23: albumAdapter = new AlbumAdapter(this);
- 24:
- 25: album.setAdapter(albumAdapter);
- 26:
- 27: int aid = (int) albumAdapter.getItemId(0);
- 28:
- 29: audioAdapter = new AudioAdapter(this, aid);
- 30: audio.setAdapter(audioAdapter);
- 31:
- 32: audio.setOnItemSelectedListener(this);
- 33: album.setOnItemSelectedListener(this);
- 34: }
- 35:
- 36: public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
- 37: if (parent == album) {
- 38: // 专辑被选中
- 39: int aid = (int) albumAdapter.getItemId(position);
- 40: // 更新歌曲Gallery
- 41: audioAdapter.notifyDataSetChanged(aid);
- 42: } else if (parent == audio) {
- 43: // TODO do something
- 44: }
- 45:
- 46: }
- 47:
- 48: public void onNothingSelected(AdapterView<?> parent) {
- 49:
- 50: }
好了,这就是我们介绍的在Android开发中使用Gallery实现“多级联动”的教程,谢谢大家。
【编辑推荐】
- 在Android中实现service动态更新UI界面
- Android的UI设计与后台线程交互
- 有效控制Android应用程序的耗电量
- 在Android上实现Junit单元测试的四部曲
- Android数据库事务浅析