您的位置:首页 > 移动开发 > Android开发

【转】在Android开发中使用Gallery实现“多级联动”

2011-04-24 11:07 381 查看
之前我们曾向您介绍过在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实现“多级联动”的教程,谢谢大家
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐