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------

  • 相关阅读:
    解决xcode5升级后,Undefined symbols for architecture arm64:问题
    第8章 Foundation Kit介绍
    app 之间发送文件 ios
    iphone怎么检测屏幕是否被点亮 (用UIApplication的Delegate)
    CRM下载对象一直处于Wait状态的原因
    错误消息Customer classification does not exist when downloading
    How to resolve error message Distribution channel is not allowed for sales
    ABAP CCDEF, CCIMP, CCMAC, CCAU, CMXXX这些东东是什么鬼
    有了Debug权限就能干坏事?小心了,你的一举一动尽在系统监控中
    SAP GUI和Windows注册表
  • 原文地址:https://www.cnblogs.com/halzhang/p/1794555.html
Copyright © 2011-2022 走看看