项目运行图太大了,我放在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: fanyafeng@live.cn*/
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();}@Overridepublic void writeToParcel(Parcel dest, int flags) {dest.writeInt(id);dest.writeString(img);dest.writeString(videoUrl);dest.writeString(title);dest.writeString(des);dest.writeString(headerImg);}@Overridepublic int describeContents() {return 0;}public static final Creator<VideoBean> CREATOR = new Creator<VideoBean>() {@Overridepublic VideoBean createFromParcel(Parcel in) {return new VideoBean(in);}@Overridepublic 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;}@Overridepublic 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;}@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);if (getArguments() != null) {mParam1 = getArguments().getString(ARG_PARAM1);mParam2 = getArguments().getString(ARG_PARAM2);}}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {// Inflate the layout for this fragmentreturn inflater.inflate(R.layout.fragment_three, container, false);}@Overridepublic 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> {@Overrideprotected void onPreExecute() {super.onPreExecute();}@Overrideprotected 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();}}}@Overrideprotected 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: fanyafeng@live.cn*/
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;}@Overridepublic VideoViewHolder getViewHolder(View view) {return new VideoViewHolder(view);}@Overridepublic VideoViewHolder onCreateViewHolder(ViewGroup parent, int viewType, boolean isItem) {View view = LayoutInflater.from(context).inflate(R.layout.item_yinyue_layout, parent, false);return getViewHolder(view);}@Overridepublic 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() {@Overridepublic void onClick(View v) {Intent intent = new Intent(context, PlayVideoActivity.class);intent.putExtra("videoUrl", videoBean.getVideoUrl());context.startActivity(intent);}});}@Overridepublic 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

视频列表的android客户端和springmvc服务端实现(三)相关推荐

  1. 解决android客户端上传图片到服务端时,图片损坏的问题

    解决android客户端上传图片到服务端时,图片损坏的问题 参考文章: (1)解决android客户端上传图片到服务端时,图片损坏的问题 (2)https://www.cnblogs.com/cnbl ...

  2. Android客户端与PHP服务端API接口Token安全验证

    Android客户端: 1.写一个生成token的算法 /*** 生成api接口的token* @param map* @param apikey* @return*/public static St ...

  3. c pc 和android通讯,Android 客户端与PC服务端socket通信接收与发送图片(终结者)

    前言 这个解决方案是我和队友在<物联网>比赛的集训中得到的.在socket中Android客户端接收图片是相当的棘手(反正我当时就是这样觉得),接收文字还算简单.在刚开始接触socket接 ...

  4. android java websocket client_websocket服务端,android客户端示例

    服务端库依赖详见章末 #####spring websocket服务端代码(会话过程) public class HandshakeInterceptor extends HttpSessionHan ...

  5. Linux Socket 两个客户端通信,服务端作为中转

    Socket 两个客户端通信,服务端作为中转 Socket两个客户端通信,服务端作为中转,通过sockket的通信原理,简单的做了一个以c语言写的服务端,与自己制作的Android app 与树莓派为 ...

  6. 客户端渲染和服务端渲染

    参考链接:客户端渲染和服务端渲染的区别https://blog.csdn.net/qq_40885461/article/details/88539989 浅谈服务端渲染(SSR)https://ww ...

  7. http 缓存分为客户端缓存和服务端缓存

    http 缓存分为客户端缓存和服务端缓存 1. 客户端缓存 客户端缓存指的是浏览器缓存, 浏览器缓存是最快的缓存, 因为它直接从本地获取(但有可能需要发送一个请求), 它的优势是可以减少网络流量, 加 ...

  8. grpc 客户端的context 服务端获取不到_MLamp;DEV[10] | gRPC的应用

    上一期和大家谈到了gRPC的快速开始,我么哪知道了gRPC是什么以及怎么快速启动,那么现在,我们来看看这个玩意具体内部是怎么运作的,这里我们同样以helloworld这个为例子来去谈.首先上期内容在这 ...

  9. Unity中进行网络通信:三:unity客户端和Unity服务端互相发消息

    目录 一.目的 1.想知道:Unity中进行网络通信:unity客户端和Unity服务端互相发消息 二.参考 1.unity3D中使用Socket进行数据通信(三) 三.操作:一:完成:在同一个Uni ...

最新文章

  1. 2008 r2 sn sqlserver_sqlserver 下载地址(SQL Server 2008 R2 中英文 开发版/企业版/标准版 下载)...
  2. 深入剖析Redis系列(三) - Redis集群模式搭建与原理详解
  3. 我们可以写100%,但是这样不科学
  4. LinkedList 模拟栈和队列
  5. like左匹配索引失效_Mysql索引失效的情况
  6. 计算方法太牛了,留着以后教孩子!!!
  7. php smarty php函数,smarty中使用php函数的方法
  8. 【BZOJ4547】【HDU5171】小奇的集合,暴力+矩阵乘法
  9. [1424] 金克拉与贪吃蛇的故事
  10. mysql优化之 EXPLAIN(一)
  11. java设计模式模式组合_Java设计模式---组合模式
  12. 学生a3制图标题栏尺寸手绘_机械制图基本知识点
  13. RH850中断使用方法
  14. html input限制输入小数,限制input输入小数只能到3位或者只能输入正整数(兼容ios)...
  15. 计算机一级常用英语缩写,电脑常用英文单词和缩写
  16. 解决Monterey12系统CleanMyMac X闪退问题
  17. 数据库数据增删改查练习题(1)——学生选课数据库
  18. BilSTM 实体识别_NLP入门实体命名识别(NER)+BilstmCRF模型原理Pytorch代码详解——最全攻略...
  19. 如何用java让坦克发射子弹_java怎么制作坦克大战
  20. Daisy Chains

热门文章

  1. 工业机器人关节拆装流程_VR工业机器人拆装系统
  2. 骨科医疗器械行业产业链及技术水平趋势、竞争格局、主要壁垒构成
  3. 2022/1/15 双指针
  4. 夫唯不争,天下莫能与之争
  5. 重转win10会出现dns服务器未响应,win10系统DnS服务器未响应的处理办法
  6. Day2-Mybatis之sql复习
  7. vscode配置C++环境(图文详解)
  8. WebRTC源码-信令之六:SDP协议与协商流程
  9. 出海、上市,分众传媒还能再造一个“分众”吗?
  10. 分众模式下的学员管理