使用的依赖和权限
<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; } } }