视频列表的android客户端和springmvc服务端实现(三)
来源:互联网 发布:c 凯撒密码编程 编辑:程序博客网 时间:2024/05/29 07:54
项目运行图太大了,我放在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(); } @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: 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; } @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
0 0
- 视频列表的android客户端和springmvc服务端实现(三)
- 视频列表的android客户端和springmvc服务端实现(一)
- 视频列表的android客户端和springmvc服务端实现(二)
- android服务端客户端(三)
- springmvc服务端+android客户端的文件上传
- 简单的Android服务端和客户端登录交互(服务端)
- 手把手教你搭建自己的Java Web(Android)项目(SpringMVC + Mybatis服务端,Html5 Web端, Android客户端实现)
- 简单的Android服务端和客户端登录交互(客户端)
- android客户端和servlet服务端的简单登录实现
- Android上实现TCP&UDP的客户端和服务端
- 客户端和服务端通讯的N种方式(三)
- 客户端和服务端通讯的N种方式(三)
- socket实现客户端与服务端通信(三)服务端升级
- RSA客户端(android/ios)与服务端的通信实现
- Socket的实现,服务端和客户端(TCP)
- 基于Restful服务端的客户端实现(WebClient 和 HttpURLConnection)
- Netty实现客户端和服务端的通信
- 一步一实现视频播放器客户端(三)显示热门电影列表
- python使用condition实现一个简易的栅栏,CyclicBarriar
- 如何转载CSDN博客
- 采用队列数据结构按层次遍历二叉树
- android 如何设置颜色的透明度!
- Floyd-Warshall算法求任意两点间的最短路(图论算法)
- 视频列表的android客户端和springmvc服务端实现(三)
- [LeetCode]44. Wildcard Matching
- 数值分析 第五章 插值与逼近
- Winform打开和关闭控制台
- Fragment中监听返回键
- 算法分析:归并排序
- JavaScript 火焰
- 深度堆栈网络训练Python代码
- GOGS自动启动