使用Fresco和Retrofit实现列表图片和动图展示跳转到音乐播放

使用的依赖和权限

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.GET_TASKS" />
implementation rootProject.ext.dependencies["appcompat-v7"]
implementation rootProject.ext.dependencies["constraint-layout"]
implementation rootProject.ext.dependencies["retrofit2"]
implementation rootProject.ext.dependencies["converter-gson"]
implementation rootProject.ext.dependencies["rxjava2"]
implementation rootProject.ext.dependencies["rxjava2:rxandroid"]
implementation rootProject.ext.dependencies["dagger"]
annotationProcessor rootProject.ext.dependencies["dagger-compiler"]
implementation rootProject.ext.dependencies["adapter-rxjava"]
implementation 'com.facebook.fresco:fresco:0.12.0'
// 支持 GIF 动图,需要添加
implementation 'com.facebook.fresco:animated-gif:0.12.0'
implementation 'com.sunfusheng:marqueeview:1.3.3'
implementation 'com.android.support:design:27.1.1'
implementation 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
implementation 'com.github.bumptech.glide:glide:4.7.1'
implementation 'com.android.support:recyclerview-v7:27.1.1'

build.gradle

apply from:"config.gradle"

创建一个config.gradle

ext{
    android=[
            compileSdkVersion: 27,
            applicationId    : "com.bwie.test.myzhoutest03",
            minSdkVersion    : 15,
            targetSdkVersion : 27,
            versionCode      : 1,
            versionName      : "1.0"
    ]
    dependencies=[
            "appcompat-v7"     : "com.android.support:appcompat-v7:27.1.1",
            "constraint-layout": "com.android.support.constraint:constraint-layout:1.1.0",
            "retrofit2"        : "com.squareup.retrofit2:retrofit:2.4.0",
            "converter-gson"   : "com.squareup.retrofit2:converter-gson:2.4.0",
            "adapter-rxjava"  :  "com.squareup.retrofit2:adapter-rxjava2:2.4.0",
            "rxjava2"          : "io.reactivex.rxjava2:rxjava:2.1.13",
            "rxjava2:rxandroid": "io.reactivex.rxjava2:rxandroid:2.0.2",
            "dagger"           : "com.google.dagger:dagger:2.8",
            "dagger-compiler" : "com.google.dagger:dagger-compiler:2.7"
    ]
}

activity_main

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:text="列表"
            android:textSize="18dp"
            android:textColor="#33000000"/>

        <Button
            android:id="@+id/bt_jump"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="跳转"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:background="#33000000" />
    </RelativeLayout>

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyle"
        android:layout_marginTop="1dp"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </android.support.v7.widget.RecyclerView>

</LinearLayout>

activity_music

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:id="@+id/relatives"
    tools:context=".MusicActivity">
    <ImageView
        android:id="@+id/coverImage"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:src="@mipmap/acm"
        android:scaleType="centerInside"
        android:layout_centerHorizontal="true"/>

    <TextView
        android:id="@+id/stateText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/coverImage"
        android:padding="15dp"
        android:text="空转"
        android:textSize="20dp"/>

    <TableRow
        android:id="@+id/row1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/stateText"
        android:padding="15dp">
        <TextView
            android:id="@+id/playingTime"
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:text="00:00"
            android:textSize="20dp"/>

        <SeekBar
            android:id="@+id/seekBar"
            android:layout_weight="4"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"/>

        <TextView
            android:id="@+id/totalTime"
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:text="00:00"
            android:textSize="20dp"/>
    </TableRow>

    <TableRow
        android:id="@+id/row2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/row1"
        android:gravity="center_horizontal"
        android:padding="15dp">
        <Button
            android:id="@+id/isPlayButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="22dp"
            android:text="播放" />

        <Button
            android:id="@+id/stopButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="22dp"
            android:text="暂停"
            android:layout_marginLeft="15dp"
            android:layout_marginRight="15dp"/>

        <Button
            android:id="@+id/quitButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="22dp"
            android:text="返回上一个页面" />
    </TableRow>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/row2"
        android:layout_centerHorizontal="true"
        android:textSize="18dp"
        android:id="@+id/pathText"/>

</RelativeLayout>

item0_layout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical">

    <LinearLayout
        android:padding="10dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <com.facebook.drawee.view.SimpleDraweeView
            android:id="@+id/drawee_view"
            android:layout_width="50dp"
            android:layout_height="50dp"
            app:placeholderImage="@mipmap/ic_launcher"/>

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:orientation="vertical">
            <TextView
                android:id="@+id/text_name"
                android:layout_marginLeft="10dp"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="sss"/>
            <TextView
                android:id="@+id/text_time"
                android:layout_marginLeft="10dp"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="sss"/>
        </LinearLayout>
    </LinearLayout>

</LinearLayout>

item1_layout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical">
    <LinearLayout
        android:padding="10dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <com.facebook.drawee.view.SimpleDraweeView
            android:id="@+id/drawee_view"
            android:layout_width="50dp"
            android:layout_height="50dp"
            app:placeholderImage="@mipmap/ic_launcher"/>

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:orientation="vertical">

            <TextView
                android:id="@+id/text_name"
                android:layout_marginLeft="10dp"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="sss"/>

            <TextView
                android:id="@+id/text_time"
                android:layout_marginLeft="10dp"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="sss"/>
        </LinearLayout>
    </LinearLayout>

    <com.facebook.drawee.view.SimpleDraweeView
        android:id="@+id/drawee_view1"
        android:layout_width="500dp"
        android:layout_height="250dp"
        app:placeholderImage="@mipmap/ic_launcher"/>

</LinearLayout>

item2_layout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical">
    <LinearLayout
        android:padding="10dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <com.facebook.drawee.view.SimpleDraweeView
            android:id="@+id/drawee_view"
            android:layout_width="50dp"
            android:layout_height="50dp"
            app:placeholderImage="@mipmap/ic_launcher"/>

        <LinearLayout
            android:layout_gravity="center"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <TextView
                android:id="@+id/text_name"
                android:layout_marginLeft="10dp"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="sss"/>

            <TextView
                android:id="@+id/text_time"
                android:layout_marginLeft="10dp"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="sss"/>
        </LinearLayout>
    </LinearLayout>

    <VideoView
        android:id="@+id/video_View"
        android:layout_width="match_parent"
        android:layout_height="250dp" />

</LinearLayout>

menu文件夹下settings

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/action_settings"
        android:orderInCategory="100"
        app:showAsAction="never"
        android:title="settings"/>
</menu>

MainActivity

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.Button;

import com.bwie.test.adapter.MyAdapter;
import com.bwie.test.bean.TypeBean;
import com.bwie.test.component.DaggerHttpComponent;
import com.bwie.test.myzhoutest03.base.BaetActivity;
import com.bwie.test.myzhoutest03.contract.ClasscityContract;
import com.bwie.test.myzhoutest03.presenter.ClasscityPresenter;

import java.util.ArrayList;
import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;

public class MainActivity extends BaetActivity<ClasscityPresenter> implements ClasscityContract.View,
                                  View.OnClickListener {
    //把ImgBean放到list集合
    private List<TypeBean.DataBean> data = new ArrayList<>();
    //调用适配器
    private MyAdapter myAdapter;
    @BindView(R.id.bt_jump)
    Button mBtJump;
    @BindView(R.id.recyle)
    RecyclerView mRecyle;
    int page=1;
    int type=1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
        //隐藏原有标题
        getSupportActionBar().hide();
        mPrensenter.attchView( this );
        mPrensenter.getSatinApi( String.valueOf( 1 ), String.valueOf( 1 ) );
        mBtJump.setOnClickListener( this );
    }

    @Override
    public int getContenLayout() {
        return R.layout.activity_main;
    }

    @Override
    public void inject() {
        DaggerHttpComponent.builder()
                .build()
                .inject(this);
    }

    @Override
    public void getSatinApi(List<TypeBean.DataBean> dataBean) {
        //垂直布局
        LinearLayoutManager manager = new LinearLayoutManager(this);
        mRecyle.setLayoutManager(manager);
        //初始化适配器
        MyAdapter adapter=new MyAdapter(MainActivity.this,dataBean);
        //绑定适配器
        mRecyle.setAdapter(adapter);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.bt_jump:
                Intent intent = new Intent( MainActivity.this, MusicActivity.class );
                startActivity( intent );
                break;
        }
    }
}

MusicActivity

import android.Manifest;
import android.animation.ObjectAnimator;
import android.app.Activity;
import android.app.ActivityManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Handler;
import android.os.IBinder;
import android.support.annotation.RequiresApi;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.ViewConfiguration;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.SeekBar;
import android.widget.TextView;

import com.bwie.test.untils.MusicService;
import java.lang.reflect.Field;
import java.text.SimpleDateFormat;
import java.util.List;

public class MusicActivity extends AppCompatActivity {
    private Button isPlay;
    private Button stop;
    private Button quit;
    private ImageView coverImage;
    // private ObjectAnimator animator;
    private int flag = 0;
    private TextView totalTime;
    private TextView playingTime;
    private TextView stateText;
    private SeekBar seekBar;
    private TextView pathText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_music);
        //隐藏原有标题
        getSupportActionBar().hide();
        getOverflowMenu();
        bindServiceConnection();
        musicService = new MusicService();

        coverImage = (ImageView) findViewById(R.id.coverImage);
        musicService.animator = ObjectAnimator.ofFloat(coverImage, "rotation", 0, 359);

        isPlay = (Button) findViewById(R.id.isPlayButton);
        isPlay.setOnClickListener(new myOnClickListener());

        stop = (Button) findViewById(R.id.stopButton);
        stop.setOnClickListener(new myOnClickListener());

        quit = (Button) findViewById(R.id.quitButton);
        quit.setOnClickListener(new myOnClickListener());

        seekBar = (SeekBar) findViewById(R.id.seekBar);
        seekBar.setProgress(musicService.mediaPlayer.getCurrentPosition());
        seekBar.setMax(musicService.mediaPlayer.getDuration());

        totalTime = (TextView) findViewById(R.id.totalTime);
        playingTime = (TextView) findViewById(R.id.playingTime);
        stateText = (TextView) findViewById(R.id.stateText);

        pathText = (TextView) findViewById(R.id.pathText);
//        String sdcard = "音乐文件的路径为:" + Environment.getExternalStorageDirectory()
//.getAbsolutePath().toString()+"/K.Will-Melt.mp3";
//        pathText.setText(sdcard);
    }

    private MusicService musicService;
    private SimpleDateFormat time = new SimpleDateFormat("mm:ss");
    private ServiceConnection sc = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            musicService = ((MusicService.MyBinder) iBinder).getService();
        }

        @Override
        public void onServiceDisconnected(ComponentName componentName) {
            musicService = null;
        }
    };

    private void bindServiceConnection() {
        Intent intent = new Intent(this, MusicService.class);
        startService(intent);
        bindService(intent, sc, this.BIND_AUTO_CREATE);
    }

    public Handler handler = new Handler();
    public Runnable runnable = new Runnable() {
        @Override
        public void run() {

            isPlay.setOnClickListener(new myOnClickListener());
            stop.setOnClickListener(new myOnClickListener());
            quit.setOnClickListener(new myOnClickListener());

            if(musicService.mediaPlayer.isPlaying()) {
                stateText.setText("Playing");
            } else {
                if (musicService.which.equals("stop"))  {
                    stateText.setText("Stop");
                } else if (musicService.which.equals("pause")){
                    stateText.setText("Pause");
                }
            }
            playingTime.setText(time.format(musicService.mediaPlayer.getCurrentPosition()));
            totalTime.setText(time.format(musicService.mediaPlayer.getDuration()));
            seekBar.setProgress(musicService.mediaPlayer.getCurrentPosition());
            seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
                @Override
                public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                    if (fromUser) {
                        musicService.mediaPlayer.seekTo(seekBar.getProgress());
                    }
                }

                @Override
                public void onStartTrackingTouch(SeekBar seekBar) {

                }

                @Override
                public void onStopTrackingTouch(SeekBar seekBar) {

                }
            });
            handler.postDelayed(runnable, 100);
        }
    };

    @Override
    public void onPause(){
        super.onPause();
        if(isApplicationBroughtToBackground()) {
            musicService.isReturnTo = 1;
            Log.e("b","后台中");
        }
    }

    @Override
    public void onRestart() {
        super.onRestart();
        musicService.isReturnTo = 1;
    }

    @Override
    protected void onResume() {
        musicService.AnimatorAction();
        verifyStoragePermissions(this);
        if(musicService.mediaPlayer.isPlaying()) {
            stateText.setText("Playing");
        } else {
            if (musicService.which.equals("stop"))  {
                stateText.setText("Stop");
            } else if (musicService.which.equals("pause")){
                stateText.setText("Pause");
            }
        }
        seekBar.setProgress(musicService.mediaPlayer.getCurrentPosition());
        seekBar.setMax(musicService.mediaPlayer.getDuration());
        handler.post(runnable);
        super.onResume();
        Log.d("hint", "handler post runnable");
    }

    private class myOnClickListener implements View.OnClickListener {
        @RequiresApi(api = Build.VERSION_CODES.KITKAT)
        @Override
        public void onClick(View view) {
            switch (view.getId()) {
                case R.id.isPlayButton:
                    changePlay();
                    musicService.playOrPause();
                    break;
                case R.id.stopButton:
                    musicService.stop();
                    changeStop();
                    break;
                case R.id.quitButton:
                    quit();
                    break;
                default:
                    break;
            }
        }
    }

    private void changePlay() {
        if(musicService.mediaPlayer.isPlaying()){
            stateText.setText("正在播放");
            isPlay.setText("播放");
            //animator.pause();
        } else {
            stateText.setText("Playing");
            isPlay.setText("PAUSE");
        }
    }

    private void changeStop() {
        stateText.setText("Stop");
        seekBar.setProgress(0);
        //animator.pause();
    }

    private void quit() {
        musicService.animator.end();
        handler.removeCallbacks(runnable);
        unbindService(sc);
        try {
            finish();
            System.exit(0);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onStop() {
        super.onStop();
    }

    @Override
    public void onDestroy() {
        unbindService(sc);
        super.onDestroy();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.settings, menu);
        return true;
    }

    private void getOverflowMenu() {
        try {
            ViewConfiguration config = ViewConfiguration.get(this);
            Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");
            if (menuKeyField != null) {
                menuKeyField.setAccessible(true);
                menuKeyField.setBoolean(config, false);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private boolean isApplicationBroughtToBackground() {
        ActivityManager am = (ActivityManager) getSystemService( Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningTaskInfo> tasks = am.getRunningTasks(1);
        if (!tasks.isEmpty()) {
            ComponentName topActivity = tasks.get(0).topActivity;
            if (!topActivity.getPackageName().equals(getPackageName())) {
                return true;
            }
        }
        return false;
    }

    private static final int REQUEST_EXTERNAL_STORAGE = 1;
    private static String[] PERMISSIONS_STORAGE = {
            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.WRITE_EXTERNAL_STORAGE
    };

    public static void verifyStoragePermissions(Activity activity) {
        // Check if we have write permission
        int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission
                                .WRITE_EXTERNAL_STORAGE);
        if (permission != PackageManager.PERMISSION_GRANTED) {
            // We don't have permission so prompt the user
            ActivityCompat.requestPermissions(
                    activity,
                    PERMISSIONS_STORAGE,
                    REQUEST_EXTERNAL_STORAGE
            );
        }
    }
}

app文件夹下MyApp

import android.app.Application;
import com.facebook.drawee.backends.pipeline.Fresco;

public class MyApp extends Application{
    @Override
    public void onCreate() {
        super.onCreate();
        //初始化fresco
        Fresco.initialize(this);
    }
}

base文件夹下BaetActivity

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.View;

import com.bwie.test.inter.IBase;
import javax.inject.Inject;

public abstract class BaetActivity <T extends BaseContract.BasePresenter>extends AppCompatActivity 
                             implements BaseContract.BaseView,IBase{
    @Inject
    protected T mPrensenter;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate( savedInstanceState );
        setContentView( getContenLayout() );
        inject();
        //绑定
        if (mPrensenter!=null){
            mPrensenter.attchView( this );
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //绑定
        if (mPrensenter!=null){
            mPrensenter.detachView();
        }
    }

    @Override
    public void showLoading() {

    }

    @Override
    public void dismissLoading() {

    }
}

BaseContract

public interface BaseContract {
    //抽取所有Presenter共性,比如绑定,解绑
    interface BasePresenter<T extends BaseView>{
        void attchView(T view);
        void detachView();
    }

    //抽取所有View的共性,比如显示进度条和关闭进度
    interface BaseView{
        void showLoading();
        void dismissLoading();
    }
}

BasePresenter

public class BasePresenter<T extends BaseContract.BaseView> implements BaseContract.BasePresenter<T>{
    protected  T mView;

    @Override
    public void attchView(T view) {
        this.mView=view;
    }

    @Override
    public void detachView() {
        if (mView!=null){
            mView=null;
        }
    }
}

adapter文件夹下MyAdapter

import android.content.Context;
import android.media.MediaPlayer;
import android.net.Uri;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.MediaController;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.VideoView;

import com.bwie.test.bean.TypeBean;
import com.bwie.test.myzhoutest03.R;
import com.facebook.drawee.view.SimpleDraweeView;
import java.util.List;

public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{
    Context context;
    List<TypeBean.DataBean> data;
    private int HOLDRE1=1;
    private int HOLDRE2=2;
    private int HOLDRE0=0;

    public MyAdapter(Context context, List<TypeBean.DataBean> data) {
        this.context=context;
        this.data=data;
    }

    @Override
    public int getItemViewType(int position) {
        if (position%3==0){
            return HOLDRE0;
        }else if(position%3==1){
            return HOLDRE1;
        } else {
            return HOLDRE2;
        }
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        if (viewType==HOLDRE0){
            View view=View.inflate(context, R.layout.item0_layout,null);
            Holder0 holder0=new Holder0(view);
            return holder0;
        }else if (viewType==HOLDRE1){
            View view=View.inflate(context, R.layout.item1_layout,null);
            Holder1 holder1=new Holder1(view);
            return holder1;
        }else if (viewType==HOLDRE2){
            View view=View.inflate(context, R.layout.item2_layout,null);
            Holder2 holder2=new Holder2(view);
            return holder2;
        }
        return null;
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
        if (holder instanceof Holder0){
            ((Holder0) holder).drawee_view.setImageURI(data.get(position).getProfile_image());
            ((Holder0) holder).text_name.setText(data.get(position).getName());
            ((Holder0) holder).text_time.setText(data.get(position).getPasstime());
        }
        if (data.get(position).getType().equals("41")) {
            if (holder instanceof Holder2) {
                ((Holder2) holder).drawee_view.setImageURI(data.get(position).getProfile_image());
                ((Holder2) holder).text_name.setText(data.get(position).getName());
                ((Holder2) holder).text_time.setText(data.get(position).getPasstime());
                //网络视频
                Uri uri = Uri.parse(data.get(position).getVideouri());
                //设置视频控制器
                ((Holder2) holder).video_View.setMediaController(new MediaController(context));
                //播放完成回调
                ((Holder2) holder).video_View.setOnCompletionListener(new MyPlayerOnCompletionListener());
                //设置视频路径
                ((Holder2) holder).video_View.setVideoURI(uri);
                //开始播放视频
                ((Holder2) holder).video_View.start();
            }
        }
        if (holder instanceof Holder1) {
            ((Holder1) holder).drawee_view.setImageURI(data.get(position).getProfile_image());
            ((Holder1) holder).text_name.setText(data.get(position).getName());
            ((Holder1) holder).text_time.setText(data.get(position).getPasstime());
            ((Holder1) holder).drawee_view1.setImageURI(data.get(position).getImage0());
        }
    }

    @Override
    public int getItemCount() {
        return data.size();
    }

    class Holder0 extends RecyclerView.ViewHolder{
        public SimpleDraweeView drawee_view;
        public TextView text_name;
        public TextView text_time;
        public Holder0(View itemView) {
            super(itemView);
            drawee_view = itemView.findViewById(R.id.drawee_view);
            text_name = itemView.findViewById(R.id.text_name);
            text_time = itemView.findViewById(R.id.text_time);
        }
    }

    class Holder1 extends RecyclerView.ViewHolder{
        public SimpleDraweeView drawee_view;
        public TextView text_name;
        public TextView text_time;
        public SimpleDraweeView drawee_view1;
        public Holder1(View itemView) {
            super(itemView);
            drawee_view = itemView.findViewById(R.id.drawee_view);
            text_name = itemView.findViewById(R.id.text_name);
            text_time = itemView.findViewById(R.id.text_time);
            drawee_view1 = itemView.findViewById(R.id.drawee_view1);
        }
    }
    class Holder2 extends RecyclerView.ViewHolder{
        public SimpleDraweeView drawee_view;
        public TextView text_name;
        public TextView text_time;
        public VideoView video_View;
        public Holder2(View itemView) {
            super(itemView);
            drawee_view = itemView.findViewById(R.id.drawee_view);
            text_name = itemView.findViewById(R.id.text_name);
            text_time = itemView.findViewById(R.id.text_time);
            video_View = itemView.findViewById(R.id.video_View);
        }
    }

    class MyPlayerOnCompletionListener implements MediaPlayer.OnCompletionListener {
        @Override
        public void onCompletion(MediaPlayer mp) {
            Toast.makeText( context, "播放完成了", Toast.LENGTH_SHORT).show();
        }
    }
}

contract文件夹下ClasscityContract

import com.bwie.test.bean.TypeBean;
import com.bwie.test.myzhoutest03.base.BaseContract;
import java.util.List;

public interface ClasscityContract {
    interface View extends BaseContract.BaseView{
        void getSatinApi(List<TypeBean.DataBean> dataBean);
    }

    interface Presenter extends BaseContract.BasePresenter<View>{
        void getSatinApi(String type, String page);
    }
}

presenter文件夹下ClasscityPresenter

import com.bwie.test.bean.TypeBean;
import com.bwie.test.myzhoutest03.base.BasePresenter;
import com.bwie.test.myzhoutest03.contract.ClasscityContract;
import com.bwie.test.net.SatinApi;

import java.util.List;
import javax.inject.Inject;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.functions.Consumer;
import io.reactivex.functions.Function;
import io.reactivex.schedulers.Schedulers;

public class ClasscityPresenter extends BasePresenter<ClasscityContract.View>
                       implements ClasscityContract.Presenter{
   private SatinApi satinApi;

   @Inject
    public ClasscityPresenter(SatinApi satinApi) {
        this.satinApi = satinApi;
    }

    @Override
    public void getSatinApi(String type, String page) {
       satinApi.getSatin(type,page)
               .observeOn( AndroidSchedulers.mainThread() )
               .subscribeOn( Schedulers.io() )
               .map( new Function<TypeBean, List<TypeBean.DataBean>>() {
                   @Override
                   public List<TypeBean.DataBean> apply(TypeBean typeBean) throws Exception {
                       return typeBean.getData();
                   }
               } ).subscribe( new Consumer<List<TypeBean.DataBean>>() {
           @Override
           public void accept(List<TypeBean.DataBean> dataBeans) throws Exception {

               if (mView!=null){
                   mView.getSatinApi( dataBeans );
               }
           }
       } );
    }
}

component文件夹下HttpComponent

import com.bwie.test.module.HttpModule;
import com.bwie.test.myzhoutest03.MainActivity;
import dagger.Component;

@Component(modules = HttpModule.class)
public interface HttpComponent {
    void inject(MainActivity mainActivity);
}

inter文件夹下IBase

import android.view.View;

public interface IBase {
    int getContenLayout();
    void inject();
}

module文件夹下HttpModule

import com.bwie.test.net.Api;
import com.bwie.test.net.SatinApi;
import com.bwie.test.net.SatinApiService;

import java.util.concurrent.TimeUnit;
import dagger.Module;
import dagger.Provides;
import okhttp3.OkHttpClient;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;

@Module
public class HttpModule {
    @Provides
    OkHttpClient.Builder provideOkHttpClientBuilder(){
        return new OkHttpClient.Builder()
                .writeTimeout( 20, TimeUnit.SECONDS )
                .readTimeout( 20, TimeUnit.SECONDS  )
                .connectTimeout(20, TimeUnit.SECONDS   );
    }

    @Provides
    Retrofit.Builder provideRetrofitBuilder (OkHttpClient.Builder builder){
        return new Retrofit.Builder()
                .baseUrl( Api.BASEURL )
                .addCallAdapterFactory( RxJava2CallAdapterFactory.create() )
                .addConverterFactory( GsonConverterFactory.create() )
                .client( builder.build() );
    }

    @Provides
    SatinApi providesatinApi(Retrofit.Builder builder ){
        Retrofit retrofit = builder.build();
        SatinApiService satinApiService = retrofit.create( SatinApiService.class );
        return SatinApi.getSatinApi(satinApiService );
    }
}

net文件夹下Api

public interface Api {
    String BASEURL="https://www.apiopen.top";
}

SatinApi

import com.bwie.test.bean.TypeBean;
import io.reactivex.Observable;

public class SatinApi {
    private static SatinApi satinApi;
    private SatinApiService satinApiService;

    public SatinApi(SatinApiService satinApiService) {
        this.satinApiService = satinApiService;
    }

    public static SatinApi getSatinApi(SatinApiService satinApiService){
        if (satinApi ==null){
            satinApi=new SatinApi( satinApiService );
        }
        return satinApi;
    }

    public Observable<TypeBean> getSatin(String type, String page){
        return satinApiService.getSatinApi( type,page );
    }
}

SatinApiService

import com.bwie.test.bean.TypeBean;
import io.reactivex.Observable;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.POST;

public interface SatinApiService {
    @FormUrlEncoded
    @POST("satinApi")
    Observable<TypeBean> getSatinApi(@Field( "type" ) String type, @Field( "page" )String page);
}

untils文件夹下MusicService

import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.annotation.SuppressLint;
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Binder;
import android.os.Build;
import android.os.Environment;
import android.os.IBinder;
import android.support.annotation.RequiresApi;
import android.view.animation.LinearInterpolator;

public class MusicService extends Service{
    public final IBinder binder = new MyBinder();

    public class MyBinder extends Binder {
        public MusicService getService() {
            return MusicService.this;
        }
    }

    public static int isReturnTo = 0;
    public static MediaPlayer mediaPlayer = new MediaPlayer();
    public static ObjectAnimator animator;

    public MusicService() {
        initMediaPlayer();
    }

    public void initMediaPlayer() {
        try {
            //String file_path = "/storage/0123-4567/K.Will-Melt.mp3";
            String path="http://sc1.111ttt.cn:8282/2018/1/03m/13/396131229550.m4a?tflag
                  =1519095601&pin=6cd414115fdb9a950d827487b16b5f97#.mp3";
//            String file_path = Environment.getExternalStorageDirectory().getAbsolutePath()
//+"/K.Will-Melt.mp3";
//            //String file_path = "/data/K.Will-Melt.mp3";
//            mediaPlayer.setDataSource(file_path);
            mediaPlayer.setDataSource( path );
            mediaPlayer.prepare();
            mediaPlayer.setLooping(true);  // 设置循环播放
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @SuppressLint("WrongConstant")
    public  void AnimatorAction() {
        if (mediaPlayer.isPlaying()) {
            animator.setDuration(5000);
            animator.setInterpolator(new LinearInterpolator()); // 均速旋转
            animator.setRepeatCount( ValueAnimator.INFINITE); // 无限循环
            animator.setRepeatMode(ValueAnimator.INFINITE);
            animator.start();
        }
    }

    private int flag = 0;
    public static String which = "";
    @SuppressLint("WrongConstant")
    @RequiresApi(api = Build.VERSION_CODES.KITKAT)
    public void playOrPause() {
        flag++;
        if (flag >= 1000) flag = 2;
        which = "pause";

        if(mediaPlayer.isPlaying()){
            mediaPlayer.pause();
            animator.pause();
        } else {
            mediaPlayer.start();
            if ((flag == 1) || (isReturnTo == 1)) {
                animator.setDuration(5000);
                animator.setInterpolator(new LinearInterpolator()); // 均速旋转
                animator.setRepeatCount(ValueAnimator.INFINITE); // 无限循环
                animator.setRepeatMode(ValueAnimator.INFINITE);
                animator.start();
            } else {
                animator.resume();
            }
        }
    }

    @RequiresApi(api = Build.VERSION_CODES.KITKAT)
    public void stop() {
        which = "stop";
        animator.pause();
        if(mediaPlayer != null) {
            mediaPlayer.pause();
            mediaPlayer.stop();
            try {
                mediaPlayer.prepare();
                mediaPlayer.seekTo(0);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    public void onDestroy() {
        mediaPlayer.stop();
        mediaPlayer.release();
        super.onDestroy();
    }

    /**
     * onBind 是 Service 的虚方法,因此我们不得不实现它。
     * 返回 null,表示客服端不能建立到此服务的连接。
     */
    @Override
    public IBinder onBind(Intent intent) {
        return binder;
    }
}

bean文件夹下TypeBean

import java.util.List;

public class TypeBean {

    private int code;
    private String msg;
    private List<DataBean> data;

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public List<DataBean> getData() {
        return data;
    }

    public void setData(List<DataBean> data) {
        this.data = data;
    }

    public static class DataBean {

        private String type;
        private String text;
        private String user_id;
        private String name;
        private String screen_name;
        private String profile_image;
        private String created_at;
        private Object create_time;
        private String passtime;
        private String love;
        private String hate;
        private String comment;
        private String repost;
        private String bookmark;
        private String bimageuri;
        private Object voiceuri;
        private Object voicetime;
        private Object voicelength;
        private String status;
        private String theme_id;
        private String theme_name;
        private String theme_type;
        private String videouri;
        private int videotime;
        private String original_pid;
        private int cache_version;
        private String playcount;
        private String playfcount;
        private String cai;
        private Object weixin_url;
        private String image1;
        private String image2;
        private boolean is_gif;
        private String image0;
        private String image_small;
        private String cdn_img;
        private String width;
        private String height;
        private String tag;
        private int t;
        private String ding;
        private String favourite;
        private Object top_cmt;
        private Object themes;

        public String getType() {
            return type;
        }

        public void setType(String type) {
            this.type = type;
        }

        public String getText() {
            return text;
        }

        public void setText(String text) {
            this.text = text;
        }

        public String getUser_id() {
            return user_id;
        }

        public void setUser_id(String user_id) {
            this.user_id = user_id;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getScreen_name() {
            return screen_name;
        }

        public void setScreen_name(String screen_name) {
            this.screen_name = screen_name;
        }

        public String getProfile_image() {
            return profile_image;
        }

        public void setProfile_image(String profile_image) {
            this.profile_image = profile_image;
        }

        public String getCreated_at() {
            return created_at;
        }

        public void setCreated_at(String created_at) {
            this.created_at = created_at;
        }

        public Object getCreate_time() {
            return create_time;
        }

        public void setCreate_time(Object create_time) {
            this.create_time = create_time;
        }

        public String getPasstime() {
            return passtime;
        }

        public void setPasstime(String passtime) {
            this.passtime = passtime;
        }

        public String getLove() {
            return love;
        }

        public void setLove(String love) {
            this.love = love;
        }

        public String getHate() {
            return hate;
        }

        public void setHate(String hate) {
            this.hate = hate;
        }

        public String getComment() {
            return comment;
        }

        public void setComment(String comment) {
            this.comment = comment;
        }

        public String getRepost() {
            return repost;
        }

        public void setRepost(String repost) {
            this.repost = repost;
        }

        public String getBookmark() {
            return bookmark;
        }

        public void setBookmark(String bookmark) {
            this.bookmark = bookmark;
        }

        public String getBimageuri() {
            return bimageuri;
        }

        public void setBimageuri(String bimageuri) {
            this.bimageuri = bimageuri;
        }

        public Object getVoiceuri() {
            return voiceuri;
        }

        public void setVoiceuri(Object voiceuri) {
            this.voiceuri = voiceuri;
        }

        public Object getVoicetime() {
            return voicetime;
        }

        public void setVoicetime(Object voicetime) {
            this.voicetime = voicetime;
        }

        public Object getVoicelength() {
            return voicelength;
        }

        public void setVoicelength(Object voicelength) {
            this.voicelength = voicelength;
        }

        public String getStatus() {
            return status;
        }

        public void setStatus(String status) {
            this.status = status;
        }

        public String getTheme_id() {
            return theme_id;
        }

        public void setTheme_id(String theme_id) {
            this.theme_id = theme_id;
        }

        public String getTheme_name() {
            return theme_name;
        }

        public void setTheme_name(String theme_name) {
            this.theme_name = theme_name;
        }

        public String getTheme_type() {
            return theme_type;
        }

        public void setTheme_type(String theme_type) {
            this.theme_type = theme_type;
        }

        public String getVideouri() {
            return videouri;
        }

        public void setVideouri(String videouri) {
            this.videouri = videouri;
        }

        public int getVideotime() {
            return videotime;
        }

        public void setVideotime(int videotime) {
            this.videotime = videotime;
        }

        public String getOriginal_pid() {
            return original_pid;
        }

        public void setOriginal_pid(String original_pid) {
            this.original_pid = original_pid;
        }

        public int getCache_version() {
            return cache_version;
        }

        public void setCache_version(int cache_version) {
            this.cache_version = cache_version;
        }

        public String getPlaycount() {
            return playcount;
        }

        public void setPlaycount(String playcount) {
            this.playcount = playcount;
        }

        public String getPlayfcount() {
            return playfcount;
        }

        public void setPlayfcount(String playfcount) {
            this.playfcount = playfcount;
        }

        public String getCai() {
            return cai;
        }

        public void setCai(String cai) {
            this.cai = cai;
        }

        public Object getWeixin_url() {
            return weixin_url;
        }

        public void setWeixin_url(Object weixin_url) {
            this.weixin_url = weixin_url;
        }

        public String getImage1() {
            return image1;
        }

        public void setImage1(String image1) {
            this.image1 = image1;
        }

        public String getImage2() {
            return image2;
        }

        public void setImage2(String image2) {
            this.image2 = image2;
        }

        public boolean isIs_gif() {
            return is_gif;
        }

        public void setIs_gif(boolean is_gif) {
            this.is_gif = is_gif;
        }

        public String getImage0() {
            return image0;
        }

        public void setImage0(String image0) {
            this.image0 = image0;
        }

        public String getImage_small() {
            return image_small;
        }

        public void setImage_small(String image_small) {
            this.image_small = image_small;
        }

        public String getCdn_img() {
            return cdn_img;
        }

        public void setCdn_img(String cdn_img) {
            this.cdn_img = cdn_img;
        }

        public String getWidth() {
            return width;
        }

        public void setWidth(String width) {
            this.width = width;
        }

        public String getHeight() {
            return height;
        }

        public void setHeight(String height) {
            this.height = height;
        }

        public String getTag() {
            return tag;
        }

        public void setTag(String tag) {
            this.tag = tag;
        }

        public int getT() {
            return t;
        }

        public void setT(int t) {
            this.t = t;
        }

        public String getDing() {
            return ding;
        }

        public void setDing(String ding) {
            this.ding = ding;
        }

        public String getFavourite() {
            return favourite;
        }

        public void setFavourite(String favourite) {
            this.favourite = favourite;
        }

        public Object getTop_cmt() {
            return top_cmt;
        }

        public void setTop_cmt(Object top_cmt) {
            this.top_cmt = top_cmt;
        }

        public Object getThemes() {
            return themes;
        }

        public void setThemes(Object themes) {
            this.themes = themes;
        }
    }
}

猜你喜欢

转载自blog.csdn.net/gh323093/article/details/80462342