APP下载地址

效果图:

    
实现要求:

1. 项目框架:MVP;注意:最大程度上避免内存泄漏;

2. 图片加载:Fresco框架;

3.网络加载框架:使用Retrofit+RxJava+okHttp实现网络加载;

4. 数据展示使用RecylerView;

5. ButterKnife,EventBus

业务逻辑需求:

1. 使用Mvp+Retrofit+RxJava+okHttp完成框架搭建

2. 实现如图效果,精选页面 banner展示,精选推荐,点击跳转到电影详情页面,并可以直接播放影片,titlebar部

分采用沉浸式状态栏

3. 详情页面实现简介评论功能;

4. 点击影片可进行播放,全屏。

添加依赖:

compile 'com.android.support:design:26.0.0-alpha1'
compile 'com.android.support:appcompat-v7:26.+'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
compile 'io.reactivex.rxjava2:rxjava:2.1.7'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
compile 'com.jpeng:JPTabBar:1.1.4'
compile 'com.youth.banner:banner:1.4.9'
compile 'com.android.support:recyclerview-v7:26.0.0-alpha1'
compile 'com.github.bumptech.glide:glide:3.7.0'
compile 'com.facebook.fresco:fresco:0.12.0'
testCompile 'junit:junit:4.12'
compile project(':superplayerlibrary')
compile 'org.greenrobot:eventbus:3.1.1'//enentbus
compile 'com.jcodecraeer:xrecyclerview:1.3.2'

封装MVP:

http:

ApiService
public interface ApiService {@GET("homePageApi/homePage.do")Flowable<HomePage> getHome();@GET("videoDetailApi/videoDetail.do")Flowable<VideoDetail> getDetail(@QueryMap Map<String,String> map);@GET("Commentary/getCommentList.do")Flowable<CommentList> getComment(@QueryMap Map<String,String> map);
}

RetrofitUtils

public class RetrofitUtils {private static volatile RetrofitUtils instance;private ApiService apiService;private RetrofitUtils(){OkHttpClient client = new OkHttpClient();Retrofit retrofit = new Retrofit.Builder().client(client).addConverterFactory(GsonConverterFactory.create()).addCallAdapterFactory(RxJava2CallAdapterFactory.create()).baseUrl("http://api.svipmovie.com/front/").build();apiService = retrofit.create(ApiService.class);}public static RetrofitUtils getInstance(){if (null==instance){synchronized (RetrofitUtils.class){if (instance==null){instance = new RetrofitUtils();}}}return instance;}public ApiService getApiService(){return apiService;}
}

model层

HomeModel
public class HomeModel implements IModel{private HomePresenter presenter;public HomeModel(HomePresenter presenter) {this.presenter = presenter;}@Override
    public void getData(Map<String, String> map) {Flowable<VideoDetail> detail = RetrofitUtils.getInstance().getApiService().getDetail(map);presenter.getDetail(detail);}@Override
    public void getData() {Flowable<HomePage> flowable = RetrofitUtils.getInstance().getApiService().getHome();presenter.getNews(flowable);}@Override
    public void getCome(Map<String, String> map) {Flowable<CommentList> comment = RetrofitUtils.getInstance().getApiService().getComment(map);presenter.getComment(comment);}
}

IModel

public interface IModel {void getData(Map<String,String> map);void getData();void getCome(Map<String,String> map);
}

presenter层

BasePresenter
public interface BasePresenter {void getData(Map<String,String> map);void getData();void getCome(Map<String,String> map);
}

HomePresenter

public class HomePresenter implements BasePresenter {private DisposableSubscriber subscriber1;private DisposableSubscriber subscriber2;@Override
    public void getData() {HomeModel model = new HomeModel(this);model.getData();}@Override
    public void getCome(Map<String, String> map) {HomeModel model = new HomeModel(this);model.getCome(map);}private IView iv;private DisposableSubscriber subscriber;public void attachView(IView iv) {this.iv = iv;}public void detachView() {if (iv != null) {iv = null;}if (!subscriber.isDisposed()) {subscriber.dispose();}if (!subscriber1.isDisposed()){subscriber1.dispose();}if (!subscriber2.isDisposed()){subscriber2.dispose();}}@Override
    public void getData(Map<String, String> map) {HomeModel model = new HomeModel(this);model.getData(map);}public void getNews(Flowable<HomePage> flowable) {subscriber = flowable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribeWith(new DisposableSubscriber<HomePage>() {@Override
                    public void onNext(HomePage homePage) {if (homePage != null) {iv.onSuccess(homePage);}}@Override
                    public void onError(Throwable t) {iv.onFailed((Exception) t);}@Override
                    public void onComplete() {}});}public void getDetail(Flowable<VideoDetail> flowable) {subscriber1 = flowable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribeWith(new DisposableSubscriber<VideoDetail>() {@Override
                    public void onNext(VideoDetail videoDetail) {if (videoDetail != null) {iv.onSuccess(videoDetail);}}@Override
                    public void onError(Throwable t) {iv.onFailed((Exception) t);}@Override
                    public void onComplete() {}});}public void getComment(Flowable<CommentList> flowable){subscriber2 = flowable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribeWith(new DisposableSubscriber<CommentList>() {@Override
                    public void onNext(CommentList commentList) {if (commentList!=null){iv.onSuccess(commentList);}}@Override
                    public void onError(Throwable t) {iv.onFailed((Exception) t);}@Override
                    public void onComplete() {}});}
}

view层

public interface IView {void onSuccess(Object o);void onFailed(Exception e);
}

沉浸式封装:

ImmersionUtils
public class ImmersionUtils {public void setImmersion(Window window, ActionBar supprotActionBar) {if(window != null) {if(Build.VERSION.SDK_INT >= 21) {View decorView = window.getDecorView();int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;decorView.setSystemUiVisibility(option);window.setStatusBarColor(Color.TRANSPARENT);}}if(supprotActionBar != null) {ActionBar actionBar = supprotActionBar;actionBar.hide();}}
}

自定义二级列表:

MyExListView
public class MyExListView extends ExpandableListView {public MyExListView(Context context) {this(context, null);}public MyExListView(Context context, AttributeSet attrs) {this(context, attrs, 0);}public MyExListView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}@Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,MeasureSpec.AT_MOST);super.onMeasure(widthMeasureSpec, expandSpec);}
}

自定义RecyclerView

MyRecyclerView
public class MyRecyclerView extends RecyclerView{public MyRecyclerView(Context context) {super(context);}public MyRecyclerView(Context context, AttributeSet attrs) {super(context, attrs);}public MyRecyclerView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}@Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {int measureSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);super.onMeasure(widthMeasureSpec, measureSpec);}
}

自定义scorllView

MyScrollView
public class MyScrollView extends ScrollView {private OnScrollListener listener;public void setOnScrollListener(OnScrollListener listener) {this.listener = listener;}public MyScrollView(Context context) {super(context);}public MyScrollView(Context context, AttributeSet attrs) {super(context, attrs);}public MyScrollView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}public interface OnScrollListener{void onScroll(int scrollY);}@Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) {super.onScrollChanged(l, t, oldl, oldt);if(listener != null){listener.onScroll(t);}}
}
MainActivity
public class MainActivity extends AppCompatActivity {private FragmentManager manager;private List<Fragment> list;@Titles
    private static final String[] mTitles = {"精选","专题","发现","我的"};@SeleIcons
    private static final int[] mSeleIcons = {R.mipmap.found_select,R.mipmap.special_select,R.mipmap.fancy_select,R.mipmap.my_select};@NorIcons
    private static final int[] mNormalIcons = {R.mipmap.found, R.mipmap.special, R.mipmap.fancy, R.mipmap.my};private ViewPager vp;@Override
    protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ImmersionUtils immersionUtils = new ImmersionUtils();immersionUtils.setImmersion(getWindow(),getSupportActionBar());JPTabBar tabBar = (JPTabBar) findViewById(R.id.tabbar);vp = (ViewPager) findViewById(R.id.vp);tabBar.setBackgroundResource(R.mipmap.bottom_bg);list = new ArrayList<>();list.add(new FragmentFound());list.add(new FragmentSpecial());list.add(new FragmentFancy());list.add(new FragmentMy());MyPager pager = new MyPager(getSupportFragmentManager(),list);vp.setAdapter(pager);tabBar.setContainer(vp);}class MyPager extends FragmentPagerAdapter {private List<Fragment> list;public MyPager(FragmentManager fm, List<Fragment> list) {super(fm);this.list=list;}@Override
        public Fragment getItem(int position) {return list.get(position);}@Override
        public int getCount() {return list.size();}}
}

VideoActivity

public class VideoActivity extends AppCompatActivity implements IView, SuperPlayer.OnNetChangeListener{private HomePresenter presenter;private ImageView back;private TextView title;private TabLayout tabLayout;private ViewPager vp;private SuperPlayer superPlayer;private String hdurl;private String video_title;@Override
    protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_video);EventBus.getDefault().register(this);ImmersionUtils immersionUtils = new ImmersionUtils();immersionUtils.setImmersion(getWindow(),getSupportActionBar());intiView();String id = getIntent().getStringExtra("id");EventBus.getDefault().post(id);Map<String, String> map = new HashMap<>();map.put("mediaId",id);presenter = new HomePresenter();presenter.getData(map);presenter.attachView(this);}public void intiView(){superPlayer = (SuperPlayer) findViewById(R.id.view_super_player);tabLayout = (TabLayout) findViewById(R.id.tab_layout);back = (ImageView) findViewById(R.id.back);title = (TextView) findViewById(R.id.title);vp = (ViewPager) findViewById(R.id.vp);final List<Fragment> fragmentList = new ArrayList<>();fragmentList.add(new FragmentSynopsis());fragmentList.add(new FragmentComment());vp.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) {@Override
            public Fragment getItem(int position) {return fragmentList.get(position);}@Override
            public int getCount() {return fragmentList.size();}});tabLayout.setupWithViewPager(vp);tabLayout.getTabAt(0).setText("简介");tabLayout.getTabAt(1).setText("评论");back.setOnClickListener(new View.OnClickListener() {@Override
            public void onClick(View view) {finish();overridePendingTransition(R.anim.showlefttoright,R.anim.hidelefttoright);}});}/**
     * 初始化播放器
     */
    private void initPlayer(){
//        if(isLive){
//            player.setLive(true);//设置该地址是直播的地址
//        }
        superPlayer.setNetChangeListener(true)//设置监听手机网络的变化
                .setOnNetChangeListener(this)//实现网络变化的回调
                .onPrepared(new SuperPlayer.OnPreparedListener() {@Override
                    public void onPrepared() {/**
                         * 监听视频是否已经准备完成开始播放。(可以在这里处理视频封面的显示跟隐藏)
                         */
                    }}).onComplete(new Runnable() {@Override
            public void run() {/**
                 * 监听视频是否已经播放完成了。(可以在这里处理视频播放完成进行的操作)
                 */
            }}).onInfo(new SuperPlayer.OnInfoListener() {@Override
            public void onInfo(int what, int extra) {/**
                 * 监听视频的相关信息。
                 */

            }}).onError(new SuperPlayer.OnErrorListener() {@Override
            public void onError(int what, int extra) {/**
                 * 监听视频播放失败的回调
                 */

            }}).setTitle(video_title)//设置视频的titleName
                .play(hdurl);//开始播放视频
        superPlayer.setScaleType(SuperPlayer.SCALETYPE_FITXY);superPlayer.setPlayerWH(0,superPlayer.getMeasuredHeight());//设置竖屏的时候屏幕的高度,如果不设置会切换后按照16:9的高度重置
    }@Override
    public void onSuccess(Object o) {if (o!=null){VideoDetail videoDetail = (VideoDetail) o;video_title = videoDetail.getRet().getTitle();this.title.setText(video_title);hdurl = videoDetail.getRet().getHDURL();EventBus.getDefault().post(videoDetail);initPlayer();}}@Override
    public void onFailed(Exception e) {}/**
     * 下面的这几个Activity的生命状态很重要
     */
    @Override
    protected void onPause() {super.onPause();if (superPlayer != null) {superPlayer.onPause();}}@Override
    protected void onResume() {super.onResume();if (superPlayer != null) {superPlayer.onResume();}}@Override
    protected void onDestroy() {super.onDestroy();if (superPlayer != null) {superPlayer.onDestroy();}EventBus.getDefault().unregister(this);}@Override
    public void onConfigurationChanged(Configuration newConfig) {super.onConfigurationChanged(newConfig);if (superPlayer != null) {superPlayer.onConfigurationChanged(newConfig);}}@Override
    public void onBackPressed() {if (superPlayer != null && superPlayer.onBackPressed()) {return;}super.onBackPressed();}@Subscribe
    public void onMessageEvent(MessageID event){String idd = event.getId();Log.i("bbbb", "onMessageEvent: "+idd);Map<String, String> map = new HashMap<>();map.put("mediaId",idd);presenter.getData(map);presenter.attachView(new IView() {@Override
            public void onSuccess(Object o) {VideoDetail videoDetail = (VideoDetail) o;video_title = videoDetail.getRet().getTitle();title.setText(video_title);hdurl = videoDetail.getRet().getHDURL();EventBus.getDefault().post(videoDetail);initPlayer();}@Override
            public void onFailed(Exception e) {}});}/**
     * 网络链接监听类
     */
    @Override
    public void onWifi() {Toast.makeText(this,"当前网络环境是WIFI",Toast.LENGTH_SHORT).show();}@Override
    public void onMobile() {Toast.makeText(this,"当前网络环境是手机网络",Toast.LENGTH_SHORT).show();}@Override
    public void onDisConnect() {Toast.makeText(this,"网络链接断开",Toast.LENGTH_SHORT).show();}@Override
    public void onNoAvailable() {Toast.makeText(this,"无网络链接",Toast.LENGTH_SHORT).show();}}

FragmentFound

public class FragmentFound extends Fragment implements IView {private HomePresenter presenter;private List<HomePage.RetBean.ListBean.ChildListBean> list = new ArrayList<>();private Banner banner;private EditText et_sousuo;private List<String> imgList = new ArrayList<>();private List<String> idList = new ArrayList<>();private RecyclerView recy_view;private HomeAdapter adapter;private MyScrollView scroll;private RelativeLayout header;private MyExListView elv;@Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {View view = View.inflate(getContext(), R.layout.fragmentfound, null);initView(view);return view;}@Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);presenter = new HomePresenter();presenter.getData();presenter.attachView(this);
//        LinearLayoutManager manager = new LinearLayoutManager(getContext());
//        recy_view.setLayoutManager(manager);
//        adapter = new HomeAdapter(getContext(), list);
//        recy_view.setAdapter(adapter);
        scroll.setOnScrollListener(new MyScrollView.OnScrollListener() {@Override
            public void onScroll(int scrollY) {int i = dip2px(getActivity(), scrollY);int dp = px2dip(getActivity(), i);if (dp>500){header.setVisibility(View.VISIBLE);}else {header.setVisibility(View.GONE);}}});}public static int dip2px(Context context, float dpValue) {final float scale = context.getResources().getDisplayMetrics().density;return (int) (dpValue * scale + 0.5f);}public static int px2dip(Context context, float pxValue) {final float scale = context.getResources().getDisplayMetrics().density;return (int) (pxValue / scale + 0.5f);}public void initView(View view) {banner = view.findViewById(R.id.ban);scroll = view.findViewById(R.id.scroll);et_sousuo = view.findViewById(R.id.et_sousuo);recy_view = view.findViewById(R.id.recy_view);header = view.findViewById(R.id.header);elv = view.findViewById(R.id.elv);}@Override
    public void onSuccess(Object o) {if (o != null) {HomePage homePage = (HomePage) o;imgList.clear();idList.clear();final List<HomePage.RetBean.ListBean> listBeen = homePage.getRet().getList();List<HomePage.RetBean.ListBean.ChildListBean> childList = listBeen.get(0).getChildList();for (int i = 0; i < childList.size(); i++) {imgList.add(childList.get(i).getPic());idList.add(childList.get(i).getDataId());}listBeen.remove(0);listBeen.remove(2);HomeExpandAdapter adapter = new HomeExpandAdapter(getContext(), listBeen);elv.setAdapter(adapter);elv.setGroupIndicator(null);for (int i=0;i<listBeen.size();i++){elv.expandGroup(i);}elv.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {@Override
                public boolean onChildClick(ExpandableListView expandableListView, View view, int i, int i1, long l) {Intent intent = new Intent(getContext(), VideoActivity.class);intent.putExtra("id",listBeen.get(i).getChildList().get(i1).getDataId());startActivity(intent);getActivity().overridePendingTransition(R.anim.showrighttoleft,R.anim.hiderighttoleft);return false;}});Log.i("zzz", "onSuccess: " + list.size());banner.setImageLoader(new ImgApp());//引用ImgApp,加载里面的东西
            banner.setImages(imgList);banner.isAutoPlay(true);banner.setDelayTime(2000);banner.start();banner.setOnBannerListener(new OnBannerListener() {@Override
                public void OnBannerClick(int position) {Intent intent = new Intent(getContext(), VideoActivity.class);intent.putExtra("id",idList.get(position));startActivity(intent);getActivity().overridePendingTransition(R.anim.showrighttoleft,R.anim.hiderighttoleft);}});}}@Override
    public void onFailed(Exception e) {}}

FragmentComment

public class FragmentComment extends Fragment {private XRecyclerView xRecyclerView;private int count = 1;private int id;private List<CommentList.RetBean.ListBean> list = new ArrayList<>();private MyAdapter adapter;@Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {View view = View.inflate(getContext(), R.layout.fragmentcoment, null);xRecyclerView = (XRecyclerView) view.findViewById(R.id.xrecyclerView);return view;}@Override
    public void onStart() {super.onStart();EventBus.getDefault().register(this);}@Subscribe
    public void onMessageEvent(MessageEvent event) {id = event.getId();}@Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);LinearLayoutManager layoutManager = new LinearLayoutManager(getContext());layoutManager.setOrientation(LinearLayoutManager.VERTICAL);xRecyclerView.setLayoutManager(layoutManager);getData(count);xRecyclerView.setPullRefreshEnabled(true);xRecyclerView.setLoadingMoreEnabled(true);xRecyclerView.setRefreshProgressStyle(ProgressStyle.BallSpinFadeLoader);xRecyclerView.setLoadingMoreProgressStyle(ProgressStyle.Pacman);xRecyclerView.setLoadingListener(new XRecyclerView.LoadingListener() {@Override
            public void onRefresh() {new Handler().postDelayed(new Runnable(){public void run() {count=1;getData(count);xRecyclerView.refreshComplete();}}, 2000);}@Override
            public void onLoadMore() {new Handler().postDelayed(new Runnable(){public void run() {count++;getData(count);xRecyclerView.refreshComplete();}}, 2000);}});}public void getData(int num) {Map<String, String> map = new HashMap<>();map.put("mediaId", id + "");map.put("pnum", num + "");HomePresenter presenter = new HomePresenter();presenter.getCome(map);presenter.attachView(new IView() {@Override
            public void onSuccess(Object o) {if (o != null) {CommentList commentList = (CommentList) o;Log.i("aaa", "onSuccess: "+commentList.getMsg());list.clear();list.addAll(commentList.getRet().getList());adapter = new MyAdapter(list, getContext());xRecyclerView.setAdapter(adapter);}}@Override
            public void onFailed(Exception e) {}});}@Override
    public void onDestroy() {super.onDestroy();EventBus.getDefault().unregister(this);}
}

FragmentSynopsis

public class FragmentSynopsis extends Fragment{private TextView synopsis;private RecyclerView recy_view;private SynopsisAdapter adapter;private TextView like;@Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {View view = View.inflate(getContext(), R.layout.synopsis_item, null);initView(view);return view;}private void initView(View view) {synopsis = view.findViewById(R.id.synopsis);recy_view = view.findViewById(R.id.recy_view);like = view.findViewById(R.id.you_like);}@Override
    public void onStart() {super.onStart();EventBus.getDefault().register(this);}@Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);}@Subscribe
    public void MessageEvent(VideoDetail detail){synopsis.setText(detail.getRet().getDescription());final List<VideoDetail.RetBean.ListBean> list = detail.getRet().getList();final List<VideoDetail.RetBean.ListBean.ChildListBean> childList = list.get(0).getChildList();like.setText(list.get(0).getTitle());GridLayoutManager manager = new GridLayoutManager(getContext(), 3);recy_view.setLayoutManager(manager);adapter = new SynopsisAdapter(getContext(), childList);recy_view.setAdapter(adapter);adapter.setOnItemClickListener(new SynopsisAdapter.OnItemClickListener() {@Override
            public void onClick(int position) {String dataId = childList.get(position).getDataId();MessageID messageID = new MessageID(dataId);EventBus.getDefault().post(messageID);Log.i("aaaa", "onClick: "+dataId);}@Override
            public void onLongClick(int position) {}});}@Override
    public void onDestroy() {super.onDestroy();EventBus.getDefault().unregister(this);}
}

适配器:

HomeExpandAdapter
public class HomeExpandAdapter extends BaseExpandableListAdapter {private Context context;private List<HomePage.RetBean.ListBean> listBeen;public HomeExpandAdapter(Context context, List<HomePage.RetBean.ListBean> listBeen) {this.context = context;this.listBeen = listBeen;}@Override
    public int getGroupCount() {return listBeen.size();}@Override
    public int getChildrenCount(int i) {return listBeen.get(i).getChildList().size();}@Override
    public Object getGroup(int i) {return listBeen.get(i);}@Override
    public Object getChild(int i, int i1) {return listBeen.get(i).getChildList().get(i1);}@Override
    public long getGroupId(int i) {return i;}@Override
    public long getChildId(int i, int i1) {return i1;}@Override
    public boolean hasStableIds() {return false;}@Override
    public View getGroupView(int i, boolean b, View view, ViewGroup viewGroup) {GroupHolder holder = null;if (view == null) {holder = new GroupHolder();view = View.inflate(context, R.layout.group_item, null);holder.group_title = view.findViewById(R.id.group_title);view.setTag(holder);}holder = (GroupHolder) view.getTag();holder.group_title.setText(listBeen.get(i).getTitle());return view;}@Override
    public View getChildView(int i, int i1, boolean b, View view, ViewGroup viewGroup) {ChildHolder holder = null;if (view == null) {holder = new ChildHolder();view = View.inflate(context, R.layout.found_item, null);holder.child_img = view.findViewById(R.id.item_img);holder.child_title = view.findViewById(R.id.item_title);view.setTag(holder);}holder = (ChildHolder) view.getTag();holder.child_title.setText(listBeen.get(i).getChildList().get(i1).getTitle());holder.child_img.setImageURI(listBeen.get(i).getChildList().get(i1).getPic());return view;}@Override
    public boolean isChildSelectable(int i, int i1) {return true;}class GroupHolder {TextView group_title;}class ChildHolder {TextView child_title;SimpleDraweeView child_img;}
}

MyAdapter

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {private List<CommentList.RetBean.ListBean> list;private Context context;public MyAdapter(List<CommentList.RetBean.ListBean> list, Context context) {this.list = list;this.context = context;}//创建新View,被LayoutManager所调用
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {View view = View.inflate(context, R.layout.comment_item, null);ViewHolder vh = new ViewHolder(view);return vh;}//将数据与界面进行绑定的操作
    @Override
    public void onBindViewHolder(ViewHolder viewHolder, int position) {viewHolder.item_img.setImageURI(list.get(position).getUserPic());viewHolder.title.setText(list.get(position).getPhoneNumber());viewHolder.time.setText(list.get(position).getTime());viewHolder.msg.setText(list.get(position).getMsg());}//获取数据的数量
    @Override
    public int getItemCount() {return list.size();}//自定义的ViewHolder,持有每个Item的的所有界面元素
    public static class ViewHolder extends RecyclerView.ViewHolder {private TextView title;private TextView time;private TextView msg;private SimpleDraweeView item_img;public ViewHolder(View view) {super(view);title = (TextView) view.findViewById(R.id.coom_title);time = (TextView) view.findViewById(R.id.coom_time);msg = (TextView) view.findViewById(R.id.coom_msg);item_img = view.findViewById(R.id.item_img);}}
}

SynopsisAdapter

public class SynopsisAdapter extends RecyclerView.Adapter<SynopsisAdapter.ViewHolder>{private Context context;private List<VideoDetail.RetBean.ListBean.ChildListBean> list;public SynopsisAdapter(Context context, List<VideoDetail.RetBean.ListBean.ChildListBean> list) {this.context = context;this.list = list;}private OnItemClickListener mOnItemClickListener;public interface OnItemClickListener{void onClick(int position);void onLongClick(int position);}public void setOnItemClickListener(OnItemClickListener onItemClickListener ){this. mOnItemClickListener=onItemClickListener;}@Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {View view = View.inflate(context, R.layout.found_item, null);ViewHolder holder = new ViewHolder(view);return holder;}@Override
    public void onBindViewHolder(ViewHolder holder, final int position) {holder.item_img.setImageURI(list.get(position).getPic());holder.item_title.setText(list.get(position).getTitle());if( mOnItemClickListener!= null){holder.itemView.setOnClickListener( new View.OnClickListener() {@Override
                public void onClick(View v) {mOnItemClickListener.onClick(position);}});holder. itemView.setOnLongClickListener( new View.OnLongClickListener() {@Override
                public boolean onLongClick(View v) {mOnItemClickListener.onLongClick(position);return false;}});}}@Override
    public int getItemCount() {return list.size();}public class ViewHolder extends RecyclerView.ViewHolder{private final SimpleDraweeView item_img;private final TextView item_title;public ViewHolder(View itemView) {super(itemView);item_img = itemView.findViewById(R.id.item_img);item_title = itemView.findViewById(R.id.item_title);}}
}

布局文件:

anim页面左进右出动画效果
hidelefttoright.xml
<set xmlns:android="http://schemas.android.com/apk/res/android"><translate
        android:fromXDelta="0%p"
        android:toXDelta="100%p"
        android:duration="500" />
</set>

hiderighttoleft.xml

<set xmlns:android="http://schemas.android.com/apk/res/android"><translate
        android:fromXDelta="0%p"
        android:toXDelta="-100%p"
        android:duration="500" />
</set>

showlefttoright.xml

<set xmlns:android="http://schemas.android.com/apk/res/android"><translate
        android:fromXDelta="-100%p"
        android:toXDelta="0%p"
        android:duration="500" />
</set>

showrighttoleft.xml

<set xmlns:android="http://schemas.android.com/apk/res/android"><translate
        android:fromXDelta="100%p"
        android:toXDelta="0%p"
        android:duration="500" />
</set>

activity_main.xml

<?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"
    tools:context="com.bwie.com.videodemo.MainActivity"><android.support.v4.view.ViewPager
        android:id="@+id/vp"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        ></android.support.v4.view.ViewPager><com.jpeng.jptabbar.JPTabBar
            android:id="@+id/tabbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:TabHeight="50dp"
            app:TabAnimate="None"
            android:layout_alignParentBottom="true"
            /></RelativeLayout>

activity_video.xml

<?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:background="@drawable/found_shap"
    android:orientation="vertical"
    tools:context="com.bwie.com.videodemo.VideoActivity"><RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:background="#1488e1"><ImageView
            android:id="@+id/back"
            android:layout_width="30dp"
            android:layout_height="30dp"
            android:layout_centerVertical="true"
            android:src="@mipmap/back" /><TextView
            android:id="@+id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:text="我是标题"
            android:textColor="#fff"
            android:textSize="20sp" /><ImageView
            android:layout_width="30dp"
            android:layout_height="30dp"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:layout_marginRight="10dp"
            android:src="@mipmap/collection" /></RelativeLayout><RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="250dp"><com.superplayer.library.SuperPlayer
            android:id="@+id/view_super_player"
            android:layout_width="match_parent"
            android:layout_height="match_parent"></com.superplayer.library.SuperPlayer></RelativeLayout><android.support.design.widget.TabLayout
        android:id="@+id/tab_layout"
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:layout_gravity="center_horizontal"

        app:tabBackground="@color/colortab"
        app:tabGravity="center"
        app:tabIndicatorColor="#158424"
        app:tabIndicatorHeight="3dp"
        app:tabMode="scrollable"
        app:tabSelectedTextColor="#158424"
        app:tabTextAppearance="@android:style/TextAppearance.Holo.Large"
        app:tabTextColor="#fff"></android.support.design.widget.TabLayout><android.support.v4.view.ViewPager
        android:id="@+id/vp"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></android.support.v4.view.ViewPager></LinearLayout>

comment_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:fresco="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"><LinearLayout
        android:layout_width="match_parent"
        android:layout_height="140dp"
        android:orientation="horizontal"
        ><com.facebook.drawee.view.SimpleDraweeView
            android:layout_width="80dp"
            android:layout_height="80dp"
            android:id="@+id/item_img"
            android:layout_gravity="center"
            android:layout_centerHorizontal="true"
            fresco:placeholderImage="@mipmap/user"

            fresco:roundAsCircle="true"
            /><LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical"
            android:layout_marginLeft="10dp"
            ><TextView
                android:id="@+id/coom_title"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="用户名"
                android:textStyle="bold"
                android:textSize="18sp"
                android:textColor="#fff"
                android:layout_margin="7dp"
                /><TextView
                android:id="@+id/coom_time"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="日期"
                android:textSize="18sp"
                android:textColor="#fff"
                android:layout_margin="7dp"
                /><TextView
                android:id="@+id/coom_msg"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="评论"
                android:textColor="#ddd"
                android:textSize="18sp"
                android:layout_margin="7dp"
                /></LinearLayout></LinearLayout>
</LinearLayout>

found_item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:fresco="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"><com.facebook.drawee.view.SimpleDraweeView
            android:id="@+id/item_img"
            android:layout_width="match_parent"
            android:layout_height="250dp"
            android:layout_centerHorizontal="true"
            fresco:roundingBorderWidth="8dp"
            fresco:roundingBorderColor="#1f6a88"
            /><TextView
        android:id="@+id/item_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:textColor="#fff"
        android:text="我是标题"
        android:layout_margin="5dp"
        android:layout_below="@+id/item_img"
        android:layout_centerHorizontal="true"
        />
</RelativeLayout>

fragmentcoment.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent"><com.jcodecraeer.xrecyclerview.XRecyclerView
        android:id="@+id/xrecyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></com.jcodecraeer.xrecyclerview.XRecyclerView>
</LinearLayout>

fragmentfound.xml

<?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="match_parent"
    android:background="@drawable/found_shap"
    android:orientation="vertical"><com.bwie.com.videodemo.view.MyScrollView
        android:id="@+id/scroll"
        android:layout_width="match_parent"
        android:layout_height="match_parent"><RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"><LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical"
                ><com.youth.banner.Banner
                    android:id="@+id/ban"
                    android:layout_width="match_parent"
                    android:layout_height="250dp"></com.youth.banner.Banner><com.bwie.com.videodemo.view.MyExListView
                    android:id="@+id/elv"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"

                    /></LinearLayout><EditText
                android:id="@+id/et_sousuo"
                android:layout_width="match_parent"
                android:layout_height="40dp"
                android:layout_marginLeft="100dp"
                android:layout_marginRight="100dp"
                android:layout_marginTop="15dp"
                android:background="@drawable/edittext_shap"
                android:drawableLeft="@mipmap/search"
                android:hint="一念天堂"
                android:paddingLeft="10dp"
                android:textColorHint="#fff" /><RelativeLayout
                android:id="@+id/header"
                android:layout_width="match_parent"
                android:layout_height="50dp"
                android:visibility="gone"
                android:background="#3f9be2"><TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_centerInParent="true"
                    android:text="精选"
                    android:textColor="#fff"
                    android:textSize="25sp" /></RelativeLayout></RelativeLayout></com.bwie.com.videodemo.view.MyScrollView>
</RelativeLayout>

group_item.xml

<?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="match_parent"
    android:orientation="vertical"><RelativeLayout
        android:id="@+id/rel"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:layout_below="@+id/ban"
        android:layout_margin="5dp"><TextView
            android:id="@+id/line1"
            android:layout_width="3dp"
            android:layout_height="match_parent"
            android:layout_marginLeft="15dp"
            android:background="#62b0b3" /><TextView
            android:id="@+id/group_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:layout_marginLeft="15dp"
            android:layout_toRightOf="@+id/line1"
            android:text="精彩推荐"
            android:textColor="#fff"
            android:textSize="22sp" /></RelativeLayout>
</LinearLayout>

synopsis_item.xml

<?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="match_parent"
    android:orientation="vertical"><ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"><LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical"><RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"><TextView
                    android:id="@+id/synopsis"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:textColor="#ddd"
                    android:textSize="17sp" /><TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignParentRight="true"
                    android:layout_below="@+id/synopsis"
                    android:layout_margin="10dp"
                    android:text="展开"
                    android:textColor="#fff"
                    android:textSize="20dp" /></RelativeLayout><TextView
                android:id="@+id/you_like"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="猜你喜欢"
                android:textColor="#fff"
                android:textStyle="bold"
                android:textSize="20sp"
                android:layout_margin="5dp"
                /><android.support.v7.widget.RecyclerView
                android:id="@+id/recy_view"
                android:layout_width="match_parent"
                android:layout_height="match_parent"></android.support.v7.widget.RecyclerView></LinearLayout></ScrollView>
</LinearLayout>

绘画背景色:

found_shap.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"><gradient
        android:angle="270"
        android:centerColor="#026693"
        android:endColor="#023d5d"
        android:startColor="#1989a1" />
</shape>

edittext_shap.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"><solid android:color="#fff" /><stroke android:width="1dip" android:color="#ddd"/><corners
        android:bottomLeftRadius="5dp"
        android:bottomRightRadius="5dp"
        android:topRightRadius="5dp"
        android:topLeftRadius="5dp"/><gradient
        android:angle="270"
        android:endColor="#50000000"
        android:startColor="#50000000" />
</shape>

android——做一个电影播放的Demo相关推荐

  1. android做一个音乐播放器,制作一个简单的Android版的音乐播放器

    音乐播放器是一个非常常见的应用,这篇博客就是介绍如何制作一个简单的音乐播放器,这款音乐播放器具有以下的功能:播放歌曲.暂停播放歌曲..显示歌曲的总时长.显示歌曲的当前播放时长.调节滑块可以将歌曲调节到 ...

  2. 手把手教你用苹果CMS做一个电影视频网站 可直接在线播放

    现在大家在网上看电影很方便了,因为电影网站多如牛毛!那很多人在想,做电影网站难么?能否拥有一个属于自己的电影网站呢?其实真的可以,而且很简单下面我们就来手把手的教你如何做一个电影网站!因为我的空间是P ...

  3. 如何使用uni-app做一个音乐播放器

    如何使用uni-app做一个音乐播放器 uni-app提供给我们非常棒的API,可以做出很好看的自定义样式的音乐播放器 好的编译器可以让我们的项目事半功倍,HBuilderX可以很方便的创建uni-a ...

  4. 0基础用android做一个excel表查询器(2):编写程序

    0基础用android做一个Excel表查询器(2):编写程序 编完页面下面就该开始写程序了,首先确定一下思路,很简单,将Excel表写入一个List(或数组)里,然后获取Plain Text中写入的 ...

  5. 23|VS2017 基于MFC 做一个音乐播放器,带音量调节,切换歌曲

    最近接到个小任务,用MFC做一个音乐播放器,不过这也是一直想尝试的,于是今天早上9点到下午16:00,总算是完成了需要的功能 开门见山,先展示一下整体界面 下面按照功能模块介绍我做这个播放器的过程 预 ...

  6. 用Android做一个简单的音乐播放器(上)

    这一学期要结束了,我用Android写了一个音乐播放器,算是给它画上个完美的句号,里面有登录,注册,这个APP还有很多功能没完善,有时间了在加一些料.效果图如下: 登录.注册直接用的是Android自 ...

  7. 使用howler做一个音频播放器到底有多简单

    强大的howler.js howler官网 https://howlerjs.com/ howler git地址 https://github.com/goldfire/howler.js 实现一个音 ...

  8. android做一个坦克大战小游戏_一个 ECharts 做的猜数小游戏

    大概 1 年多之前,一位老同学找到我,问能不能帮他做一个非常简单的猜数字游戏,需求是这样的: 在 1 到 100 的整数里,随机选一个数字,让小朋友们猜: 如果猜错了,告知小朋友猜大了还是猜小了: 如 ...

  9. 用jaxa做一个简单的菜谱Demo

    用jaxa做一个简单的菜谱 jquery-3.3.1.js <!DOCTYPE html><html lang="en"><head><m ...

最新文章

  1. java modbus通讯协议_物联通讯协议一(Modbus)
  2. java 线程的创建和执行_线程管理(一)线程的创建和运行
  3. jquery二维码生成插件jquery.qrcode.js
  4. Android通过JNI调用驱动程序(完全解析实例)
  5. [YTU]_2432 (C++习题 对象数组输入与输出)
  6. 在python中print表示的数据类型是_python之数据类型
  7. 软件性能测试报告_软件测试新手请收好:测试基本流程、及如何写好测试用例全在这里!...
  8. 《CDN 之我见》原理篇——CDN的由来与调度
  9. linux c程序调用脚本,C程序与Lua脚本相互调用
  10. Linux下SVN 命令操作手册
  11. Windows下安装Elasticsearch
  12. 8月7日科技联播:人民日报发推欢迎Google回归,李彦宏回应非常有信心再赢一次...
  13. win7 64位 纯净版旗舰版202104
  14. git pull之后出现REBASE(1/1)
  15. python批量提取视频帧
  16. 绪言 前端性能的重要性 HTTP概述
  17. Bootstrap中jumbotron属性
  18. 进公司两个月了还没上手项目_27个“经验证且易于上手”的赚钱在线业务创意
  19. 企业中Linux下软件的管理(yum仓库的搭建以及软件的控制)
  20. 美国房价仍在上涨,但购房需求今年首次低于2020年水平

热门文章

  1. 启用计算机休眠,win7 开启睡眠功能的方法分享
  2. OFFICE-word:在某些节中,您为左右边距、栏间距或段落缩进选择的设置相对于页面宽度过大
  3. C#(三十八)之StreamWriter StreamWriter使用方法及与FileStream类的区别
  4. 一个程序员眼里的茶行业
  5. Qt 安装包制作(基于Qt Installer Framework)
  6. 记录Windows版lux视频下载工具的安装
  7. 快递鸟代收货款API对接demo1
  8. 解析Binder框架
  9. springboot +promethues+grafna+alertmanager+qq邮箱实现系统监控警告
  10. 【罗盘时钟---使用html,js,css编写。附源代码及效果】