【转】在Android开发中使用Gallery实现“多级联动”
2011-04-24 11:07
381 查看
之前我们曾向您介绍过在Android中实现service动态更新UI界面,在UI设计中需要利用很多图库相册软件,而Gallery 是国外一个免费开源的、功能非常强大、有丰富的扩展图库相册软件。本文将讲解利用两个Gallery实现类似多级联动的功能。
![](http://images.51cto.com/files/uploadimg/20101018/1345120.png)
一个Gallery是歌曲专辑图片,另一个Gallery是专辑的歌曲。滑动专辑Gallery,下面的歌曲也会随之发生变动。
好了,这就是我们介绍的在Android开发中使用Gallery实现“多级联动”的教程,谢谢大家
![](http://images.51cto.com/files/uploadimg/20101018/1345120.png)
一个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开发——使用Gallery实现“多级联动”
- Android App开发中使用RecyclerView实现Gallery画廊的实例
- android 开发技巧(1)--使用 weight 属性实现视图的居中显示
- 在Android的UI开发中,有时为了界面美观而需要使用虚线。在这里我自己实现一个画虚线的控件。
- Android开发使用Handler的PostDelayed方法实现图片轮播功能
- 【Android UI设计与开发】5.底部菜单栏(二)使用Fragment实现底部菜单栏
- Android开发ViewPager和Fragment结合使用实现新闻类app( 三 )(基本成型的app)
- Android UI开发第四十三篇——使用Property Animation实现墨迹天气3.0引导界面及动画实现
- Android开发之使用DrawerLayout实现侧拉菜单功能
- Android开发使用json实现服务器与客户端数据的交互功能示例
- Android TV开发:使用RecycleView实现横向的Listview并响应点击事件的代码
- Android应用开发之使用PhoneGap(cordova)实现拍照上传功能
- 【Android UI设计与开发】第02期:引导界面(二)使用ViewPager实现欢迎引导页面
- 【Android UI设计与开发】第06期:底部菜单栏(一)使用TabActivity实现底部菜单栏
- Android开发之瀑布流控件的实现与使用方法示例
- Android开发 -- 关于RecylerView的使用和RecylerViewAdapter的实现及监听
- android开发教程之使用线程实现视图平滑滚动示例
- Android开发之使用VideoView实现视频的横屏播放、去除边框
- Android开发之实现省市区三级联动
- Android游戏开发之使用AnimationDrable实现Frame动画