Android实战 - 音心播放器 (MusicListActivity - 分类信息界面实现)

1.背景

   还记得主页上GridView的内容吗?对,是分类信息,在这里将要实现音乐分类的显示播放,在这里使用了v7兼容包下的RecyclerView实现,同时包含两个布局,一个有图的一个没图的!

   如下图所示:

                                                    

2.实现步骤

    在这里我们的RecyclerView采用了混排的形式,就是根据不同的位置,设置不同的布局实现,我们在这里有两个布局一个有图的View和一个没图的View, 对应两个ViewHolder .

    (1)两个Item 布局实现

             1)有图的Item Layout

 

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="80dp"
    android:background="@color/app_color_whrit">

                <ImageView
                    android:id="@+id/mlist_iv_music_songpic"
                    android:layout_width="80dp"
                    android:layout_height="match_parent"
                    android:layout_alignParentLeft="true"
                    android:scaleType="fitXY"
                    android:src="@drawable/moren_big" />

                <TextView
                    android:id="@+id/mlist_tv_music_songname"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="10dp"
                    android:layout_marginTop="18dp"
                    android:layout_toRightOf="@+id/mlist_iv_music_songpic"
                    android:maxLines="2"
                    android:text="@string/list_item_song_name"
                    android:textColor="@color/text_color_whrit"
                    android:textSize="15sp" />

                <TextView
                    android:id="@+id/mlist_tv_music_singer"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignParentBottom="true"
                    android:layout_alignParentRight="true"
                    android:layout_marginBottom="10dp"
                    android:layout_marginRight="20dp"
                    android:text="@string/list_item_singer_name"
                    android:textColor="@color/app_color_zi"
                    android:textSize="12sp" />

</RelativeLayout>
  

              2)没图的Item Layout 实现

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:background="@color/app_color_whrit"
    android:layout_height="70dp" >

    <TextView
        android:id="@+id/list_item_play"
        android:layout_width="30dp"
        android:layout_height="50dp"
        android:layout_alignParentLeft="true"
        android:layout_centerInParent="true"
        android:layout_margin="10dp"
        android:gravity="center"
        android:textColor="@color/app_color"
        android:text="@string/main_item_num" />

    <TextView
        android:id="@+id/tv_item_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="18dp"
        android:layout_toRightOf="@+id/list_item_play"
        android:maxLines="2"
        android:text="@string/list_item_song_name"
        android:textColor="@color/text_color_whrit"
        android:textSize="12sp" />

    <TextView
        android:id="@+id/tv_item_singer"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_marginBottom="10dp"
        android:layout_toRightOf="@+id/list_item_play"
        android:text="@string/list_item_singer_name"
        android:textColor="@color/app_color_zi"
        android:textSize="12sp" />

       <TextView
        android:id="@+id/tv_item_heart"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_marginBottom="10dp"
        android:layout_marginRight="20dp"
        android:drawablePadding="3dp"
        android:drawableRight="@drawable/heart_net"
        android:text="@string/list_item_singer_name"
        android:textColor="@color/text_color_whrit"
        android:textSize="12sp" />
    
</RelativeLayout>


   (2)ViewHolder实现

              1)有图的ViewHolder实现

package cn.labelnet.ui;

import android.support.v7.widget.RecyclerView.ViewHolder;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.TextView;
import cn.labelnet.event.MusicListRecyclerOnItemClick;
import cn.labelnet.maskmusic.R;

/**
 * 有图 ViewHolder 作者 :原明卓 时间 :2015年12月11日 上午10:19:05 描述 :TODO
 */
public class MusicListBigViewHolder extends ViewHolder implements
		OnClickListener {

	private ImageView mlist_iv_music_songpic;
	private TextView mlist_tv_music_songname, mlist_tv_music_singer;
	private MusicListRecyclerOnItemClick itemClick;

	

	public ImageView getMlist_iv_music_songpic() {
		return mlist_iv_music_songpic;
	}

	public TextView getMlist_tv_music_songname() {
		return mlist_tv_music_songname;
	}

	public TextView getMlist_tv_music_singer() {
		return mlist_tv_music_singer;
	}

	public MusicListBigViewHolder(View itemView,MusicListRecyclerOnItemClick itemClick) {
		super(itemView);
		this.itemClick=itemClick;
		initView(itemView);
	}

	private void initView(View itemView) {
		mlist_iv_music_songpic = (ImageView) itemView
				.findViewById(R.id.mlist_iv_music_songpic);
		mlist_tv_music_songname = (TextView) itemView
				.findViewById(R.id.mlist_tv_music_songname);
		mlist_tv_music_singer = (TextView) itemView
				.findViewById(R.id.mlist_tv_music_singer);
		itemView.setOnClickListener(this);
	}

	@Override
	public void onClick(View v) {
		itemClick.onRecyclerItemClick(getPosition());
	}

}

      2)没图的ViewHolder实现
package cn.labelnet.ui;

import cn.labelnet.event.MusicListRecyclerOnItemClick;
import cn.labelnet.maskmusic.R;
import android.support.v7.widget.RecyclerView.ViewHolder;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;

/**
 * 无图 ViewHolder
 * 作者 :原明卓
 * 时间 :2015年12月11日 上午10:20:25
 * 描述 :TODO
 */
public class MusicListNoViewHolder extends ViewHolder implements OnClickListener {

	private TextView list_item_play,tv_item_name,tv_item_singer,tv_item_heart;
	private MusicListRecyclerOnItemClick itemClick;
	
	public TextView getList_item_play() {
		return list_item_play;
	}

	public TextView getTv_item_name() {
		return tv_item_name;
	}

	public TextView getTv_item_singer() {
		return tv_item_singer;
	}

	public MusicListNoViewHolder(View itemView,MusicListRecyclerOnItemClick itemClick) {
		super(itemView);
		this.itemClick=itemClick;
		initView(itemView);
	}

	private void initView(View itemView) {
		list_item_play=(TextView) itemView.findViewById(R.id.list_item_play);
		tv_item_name=(TextView) itemView.findViewById(R.id.tv_item_name);
		tv_item_singer=(TextView) itemView.findViewById(R.id.tv_item_singer);
		tv_item_heart=(TextView) itemView.findViewById(R.id.tv_item_heart);
		itemView.setOnClickListener(this);
	}

	public TextView getTv_item_heart() {
		return tv_item_heart;
	}
	
	@Override
	public void onClick(View v) {
		itemClick.onRecyclerItemClick(getPosition());
	}

}


    (3)Recycler.Adapter实现

                getItemViewType() 方法 ,返回不同的结果,用来区分不同的item view;
               onCreateViewHolder 创建ViewHolder返回子类;
               onBindViewHolder 给ViewHolder 绑定数据;

package cn.labelnet.adapter;

import java.util.List;
import java.util.Random;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.RecyclerView.ViewHolder;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import cn.labelnet.event.MusicListRecyclerOnItemClick;
import cn.labelnet.maskmusic.R;
import cn.labelnet.model.MusicModel;
import cn.labelnet.net.MusicAsyncGetUrl;
import cn.labelnet.net.MusicAsyncHandlerGetUrl;
import cn.labelnet.net.MusicRequest;
import cn.labelnet.net.VolleyHttpRequest;
import cn.labelnet.ui.MusicListBigViewHolder;
import cn.labelnet.ui.MusicListNoViewHolder;

import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.ImageLoader.ImageListener;

/**
 * MusicListActivity 适配器 作者 :原明卓 时间 :2015年12月11日 上午10:33:42 描述 :TODO
 */
public class MusicTypeListAdapter extends RecyclerView.Adapter<ViewHolder>
		implements MusicAsyncGetUrl {

	private List<MusicModel> musics = null;
	private Random random = new Random();
	private int r = 7;
	private Context context;
	private MusicModel mm = null;
	// 布局控制
	private MusicListBigViewHolder bigViewHolder = null;
	private MusicListNoViewHolder listNoViewHolder = null;
	private MusicListRecyclerOnItemClick itemClick;
	// 图片请求
	private MusicAsyncHandlerGetUrl musicAsyncHandlerGetUrl;
	private ImageListener imageListener = null;
	private MusicRequest musicRequest = null;
	private ImageView iv_list;
	//
	private String urlStr = null;

	public MusicTypeListAdapter(List<MusicModel> musics, Context context,
			MusicListRecyclerOnItemClick itemClick) {
		this.musics = musics;
		this.context = context;
		this.itemClick = itemClick;

		// 请求图片资源
		musicAsyncHandlerGetUrl = new MusicAsyncHandlerGetUrl();
		musicAsyncHandlerGetUrl.setMusicasyncGetUrl(this);
		musicRequest = new MusicRequest();
		musicRequest.setMusicAsyncHandler(musicAsyncHandlerGetUrl);
	}

	@Override
	public int getItemViewType(int position) {
		return position == 0 ? 0 : 1;
	}

	@Override
	public int getItemCount() {
		return musics.size() > 0 ? musics.size() : 0;
	}

	@Override
	public ViewHolder onCreateViewHolder(ViewGroup vg, int flag) {
		ViewHolder holder = null;
		if (flag == 0) {
			// 有图的布局
			View itemView = LayoutInflater.from(context).inflate(
					R.layout.list_item_music_layout, vg, false);
			holder = new MusicListBigViewHolder(itemView, itemClick);
		} else {
			// 没图的布局
			View itemView = LayoutInflater.from(context).inflate(
					R.layout.list_item_music_no_layout, vg, false);
			holder = new MusicListNoViewHolder(itemView, itemClick);
		}

		return holder;
	}

	@Override
	public void onBindViewHolder(ViewHolder vh, int position) {
		mm = musics.get(position);
		if (mm != null) {
			// 不建议,待优化
			if (vh instanceof MusicListNoViewHolder) {
				// 无图适配
				listNoViewHolder = (MusicListNoViewHolder) vh;
				// Log.d("MaskMusic", "无图适配");
				listNoViewHolder.getList_item_play().setText("" + position);
				listNoViewHolder.getTv_item_singer()
						.setText(mm.getSingername());
				listNoViewHolder.getTv_item_name().setText(mm.getSongname());
				int heartNum = (mm.getSongid() + mm.getSingerid()) / 134;

				listNoViewHolder.getTv_item_heart().setText("" + heartNum);

			} else {
				// 有图适配
				bigViewHolder = (MusicListBigViewHolder) vh;
				bigViewHolder.getMlist_tv_music_singer().setText(
						mm.getSingername());
				bigViewHolder.getMlist_tv_music_songname().setText(
						mm.getSongname());
			
				if (urlStr == null) {
					iv_list = bigViewHolder.getMlist_iv_music_songpic();
					imageListener = ImageLoader.getImageListener(iv_list,
							R.drawable.moren, R.drawable.moren_big);
					musicRequest.setMusicAsyncHandler(musicAsyncHandlerGetUrl);
					musicRequest.requestStringData(mm.getSingername() + "");
				}
			}
		}
	}

	@Override
	public void getSongImageURL(String imgUrl) {
		urlStr = imgUrl;
		VolleyHttpRequest.Image_Loader(imgUrl, imageListener);
	}

}

3. 使用

   (1)绑定 RecyclerView

		list_recycler_view = (RecyclerView) findViewById(R.id.list_recycler_view);
		// 设置是否固定长度
		list_recycler_view.setHasFixedSize(true);
		// 添加样式
		list_recycler_view.setLayoutManager(new LinearLayoutManager(this,
				LinearLayoutManager.VERTICAL, false));
		// 添加item动画
		list_recycler_view.setItemAnimator(new DefaultItemAnimator());
		// 添加item分割线
		list_recycler_view.addItemDecoration(new SpacesItemDecoration(2));
		// 添加适配器
		musicTypeAdapter = new MusicTypeListAdapter(musics, this, this);
		list_recycler_view.setAdapter(musicTypeAdapter);

    (2)点击事件回调

             一个接口实现 :
/**
 * MusicListActivity RecycleView点击事件
 * 作者 :原明卓
 * 时间 :2015年12月11日 下午5:13:55
 * 描述 :TODO
 */
public interface MusicListRecyclerOnItemClick {
	
	void onRecyclerItemClick(int position);

}
  
           具体的步骤是 :
                在ViewHolder 中实现OnClickListener 点击事件,在MusicListActivity 中进行回调使用,前面已经有解释了。

4.总结

     下篇讲实现网络请求数据和实现音乐播放








           


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值