zoukankan      html  css  js  c++  java
  • Android开发——使用Gallery实现“多级联动”

    本文将讲解利用两个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------

  • 相关阅读:
    使用方法GetPostBackEventReference 得到回发脚本
    超实用的Linux/Unix快捷键大汇总
    Http 之Get/Post请求区别
    使用ASP启动/停止指定WEB站点
    使用ASP在IIS创建WEB站点的函数
    CSS+JS 仿MSN TAB选项卡
    防止圖片在WEB頁面上下載
    asp定时生成静态HTML的代码
    jQuery Slide Show – jQuery幻灯片效果
    Debian 5.0.5 正式版
  • 原文地址:https://www.cnblogs.com/halzhang/p/1794555.html
Copyright © 2011-2022 走看看