版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_23195583/article/details/54343336
项目运行图太大了,我放在github上了
https://github.com/1181631922/Recreation/blob/master/readme/video/videos2.gif
服务器端代码基本就完成了,来看一下客户端的代码,先来看一下json接口
public final static String BASE_URL = "http://localhost:8080/recreation-1.0";
//获取视频接口
public final static String GET_VIDEO_LIST = BASE_URL + "/videos/findVideoByPage?page=";
这里服务器还没有做分页,现在数据相对来说还比较少,嘿嘿。
客户端的bean和服务器保持了一致,就是序列化了一下
package com.fanyafeng.recreation.bean;
import android.os.Parcel;
import android.os.Parcelable;
import org.json.JSONObject;
/**
* Author: fanyafeng
* Data: 17/1/5 上午10:37
* Email: [email protected]
*/
public class VideoBean implements Parcelable {
private int id;
private String img;
private String videoUrl;
private String title;
private String des;
private String headerImg;
public VideoBean(JSONObject jsonObject) {
setId(jsonObject.optInt("id"));
setImg(jsonObject.optString("img"));
setVideoUrl(jsonObject.optString("video_url"));
setTitle(jsonObject.optString("title"));
setDes(jsonObject.optString("des"));
setHeaderImg(jsonObject.optString("header_img"));
}
protected VideoBean(Parcel in) {
id = in.readInt();
img = in.readString();
videoUrl = in.readString();
title = in.readString();
des = in.readString();
headerImg = in.readString();
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(id);
dest.writeString(img);
dest.writeString(videoUrl);
dest.writeString(title);
dest.writeString(des);
dest.writeString(headerImg);
}
@Override
public int describeContents() {
return 0;
}
public static final Creator<VideoBean> CREATOR = new Creator<VideoBean>() {
@Override
public VideoBean createFromParcel(Parcel in) {
return new VideoBean(in);
}
@Override
public VideoBean[] newArray(int size) {
return new VideoBean[size];
}
};
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getImg() {
return img;
}
public void setImg(String img) {
this.img = img;
}
public String getVideoUrl() {
return videoUrl;
}
public void setVideoUrl(String videoUrl) {
this.videoUrl = videoUrl;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDes() {
return des;
}
public void setDes(String des) {
this.des = des;
}
public String getHeaderImg() {
return headerImg;
}
public void setHeaderImg(String headerImg) {
this.headerImg = headerImg;
}
@Override
public String toString() {
return "VideoBean{" +
"id=" + id +
", img='" + img + '\'' +
", videoUrl='" + videoUrl + '\'' +
", title='" + title + '\'' +
", des='" + des + '\'' +
", headerImg='" + headerImg + '\'' +
'}';
}
}
再来看一下fragment的代码,这里用的是recyclerview,但是没有启用加载和刷新。
package com.fanyafeng.recreation.fragment;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.fanyafeng.recreation.R;
import com.fanyafeng.recreation.adapter.VideoAdapter;
import com.fanyafeng.recreation.bean.VideoBean;
import com.fanyafeng.recreation.network.NetUtil;
import com.fanyafeng.recreation.network.Urls;
import com.fanyafeng.recreation.refreshview.XRefreshView;
import com.fanyafeng.recreation.util.StringUtil;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import static com.fanyafeng.recreation.network.NetUtil.JSON;
public class ThreeFragment extends Fragment {
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
private String mParam1;
private String mParam2;
private Toolbar toolbar_three;
private XRefreshView refreshVideo;
private RecyclerView rvVideo;
private List<VideoBean> videoBeanList = new ArrayList<>();
private VideoAdapter videoAdapter;
public ThreeFragment() {
}
public static ThreeFragment newInstance(String param1, String param2) {
ThreeFragment fragment = new ThreeFragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_three, container, false);
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
initView();
// initData();
// Thread thread = new Thread(new LoadThread());
// thread.start();
new RecommandWineTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
private void initView() {
toolbar_three = (Toolbar) getActivity().findViewById(R.id.toolbar_three);
toolbar_three.setLogo(R.drawable.simle_logo_03);
toolbar_three.setTitle("音乐视频");
refreshVideo = (XRefreshView) getActivity().findViewById(R.id.refreshVideo);
refreshVideo.setPullLoadEnable(true);
refreshVideo.setAutoLoadMore(true);
refreshVideo.setPullRefreshEnable(false);
rvVideo = (RecyclerView) getActivity().findViewById(R.id.rvVideo);
rvVideo.setLayoutManager(new GridLayoutManager(getActivity(), 1, GridLayoutManager.VERTICAL, false));
videoAdapter = new VideoAdapter(getActivity(), videoBeanList);
rvVideo.setAdapter(videoAdapter);
}
private void initData() {
}
class RecommandWineTask extends AsyncTask<String, String, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
if (!StringUtil.isNullOrEmpty(s)) {
Log.d("video", s);
try {
JSONObject jsonObject = new JSONObject(s);
if (jsonObject != null) {
String state = jsonObject.optString("state");
if (state.equals(NetUtil.STATE_OK)) {
JSONArray jsonArray = jsonObject.optJSONArray("videoList");
int videoSize = jsonArray.length();
for (int i = 0; i < videoSize; i++) {
VideoBean videoBean = new VideoBean(jsonArray.optJSONObject(i));
videoBeanList.add(videoBean);
videoAdapter.notifyDataSetChanged();
}
}
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
@Override
protected String doInBackground(String... param) {
return NetUtil.httpGetUtil(getActivity(), Urls.GET_VIDEO_LIST + 0);
}
}
private void postJson() {
//申明给服务端传递一个json串
//创建一个OkHttpClient对象
OkHttpClient okHttpClient = new OkHttpClient();
//创建一个RequestBody(参数1:数据类型 参数2传递的json串)
JSONObject jsonObject = new JSONObject();
JSONObject common = null;
JSONObject params = null;
try {
common = new JSONObject();
common.put("identifier", "mo098fd4ac5ed161ad921d6048636625");
common.put("app_version", "1006010802");
common.put("os_version", "23");
common.put("device", "Google Nexus 6P - 6.0.0 - API 23 - 1440x2560");
common.put("platform", "Android");
common.put("pid", "5080");
common.put("language", "CN");
common.put("uid", "366617270");
common.put("width", "1440");
common.put("height", "2392");
params = new JSONObject();
params.put("category_id", "113");
params.put("city_id", "33");
params.put("page_past", "0");
params.put("page_length", "10");
params.put("is_webp", "1");
jsonObject.put("common", common);
jsonObject.put("params", params);
} catch (JSONException e) {
e.printStackTrace();
}
RequestBody requestBody = RequestBody.create(JSON, jsonObject.toString());
//创建一个请求对象
Request request = new Request.Builder()
.url("http://fds.api.moji.com/card/recommendV2")
.post(requestBody)
.build();
//发送请求获取响应
try {
Response response = okHttpClient.newCall(request).execute();
//判断请求是否成功
if (response.isSuccessful()) {
//打印服务端返回结果
Log.i("three", response.body().string());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
最后看一下适配器,点击进行相应的视频播放。
package com.fanyafeng.recreation.adapter;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.facebook.drawee.view.SimpleDraweeView;
import com.fanyafeng.recreation.R;
import com.fanyafeng.recreation.activity.PlayVideoActivity;
import com.fanyafeng.recreation.bean.VideoBean;
import com.fanyafeng.recreation.bean.YinYueBean;
import com.fanyafeng.recreation.refreshview.recyclerview.BaseRecyclerAdapter;
import com.fanyafeng.recreation.util.FrescoAttributeUtil;
import com.fanyafeng.recreation.util.FrescoUtil;
import java.util.List;
/**
* Author: fanyafeng
* Data: 16/12/19 下午5:51
* Email: [email protected]
*/
public class VideoAdapter extends BaseRecyclerAdapter<VideoAdapter.VideoViewHolder> {
private Context context;
private List<VideoBean> videoBeanList;
public VideoAdapter(Context context, List<VideoBean> videoBeanList) {
this.context = context;
this.videoBeanList = videoBeanList;
}
@Override
public VideoViewHolder getViewHolder(View view) {
return new VideoViewHolder(view);
}
@Override
public VideoViewHolder onCreateViewHolder(ViewGroup parent, int viewType, boolean isItem) {
View view = LayoutInflater.from(context).inflate(R.layout.item_yinyue_layout, parent, false);
return getViewHolder(view);
}
@Override
public void onBindViewHolder(VideoViewHolder holder, int position, boolean isItem) {
final VideoBean videoBean = videoBeanList.get(position);
FrescoUtil.loadPicOnNet(holder.sdvImg, videoBean.getImg());
holder.tvTitle.setText(videoBean.getTitle());
FrescoUtil.loadPicOnNet(holder.sdvIcon, videoBean.getHeaderImg());
holder.sdvIcon.setHierarchy(FrescoAttributeUtil.setCircleRingHierarchy(context, Color.BLUE, 5f));
holder.sdvIcon.bringToFront();
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(context, PlayVideoActivity.class);
intent.putExtra("videoUrl", videoBean.getVideoUrl());
context.startActivity(intent);
}
});
}
@Override
public int getAdapterItemCount() {
return videoBeanList.size();
}
class VideoViewHolder extends RecyclerView.ViewHolder {
SimpleDraweeView sdvImg;
TextView tvTitle;
SimpleDraweeView sdvIcon;
public VideoViewHolder(View itemView) {
super(itemView);
sdvImg = (SimpleDraweeView) itemView.findViewById(R.id.sdvImg);
tvTitle = (TextView) itemView.findViewById(R.id.tvTitle);
sdvIcon = (SimpleDraweeView) itemView.findViewById(R.id.sdvIcon);
}
}
}
这里的图片处理就是用的我原来写的fresco的工具类:
https://github.com/1181631922/FrescoPicLoad