代码改变世界

Android开发——使用Gallery实现“多级联动”

2010-08-07 09:14  HalZhang  阅读(7623)  评论(3编辑  收藏

本文将讲解利用两个Gallery实现类似多级联动的功能。先看图:device ,一个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:     }

OK,代码贴的有点多了。欢迎交流。

-------EOF------