RecyclerView 视频播放列表 用到 retrofit-convert,fresco,SurfaceView

本文介绍如何使用Retrofit从网络获取数据,使用Fresco展示视频和图片,构建并配置RecyclerView以实现流畅的视频展示。通过设置自定义属性和适配器,实现网格布局展示三个列,确保图片和视频的高质量显示。

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印


关于recyclerView 需要
1:RecyclerView 需要设置排列的形式
2:RecyclerView 需要adapter ,并且adapter 里面必须要设置ViewHolder,在onCreateViewHolder 里面要填充一个item的layout
3:RecyclerView 的数据,来自Retrofit,
4:RecyclerView 里面的图片显示,使用到Fresco的SimpleDraweeView,这个可以通过setImageUri来添加网络的图片,并且还有缓存的效果。


设置3个列的GridLayout形式的recyclerView

        app:layoutManager="GridLayoutManager"

       app:spanCount="3"



注意:recycleView 的自定义属性的使用 要添加appNs
-------------------------------------------------------------------------------


7:RecycleView


首先在dependency 里面添加recycleView,retrofit-convert,fresco


或者直接在build.gradle文件里面的dependencies直接添加三句话:


dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.1.0'
    compile 'com.android.support:recyclerview-v7:23.1.0'
    compile 'com.squareup.retrofit: converter-gson:2.0.0-beta2'
    compile 'com.facebook.fresco:fresco:0.8.1'

Retrofit is the class through which your API interfaces are turned into callable objects. By default, Retrofit will give you sane defaults for your platform but it allows for customization.

CONVERTERS

By default, Retrofit can only deserialize HTTP bodies into OkHttp's ResponseBody type and it can only accept its RequestBody type for @Body.

Converters can be added to support other types. Six sibling modules adapt popular serialization libraries for your convenience.

  • Gsoncom.squareup.retrofit2:converter-gson
  • Jacksoncom.squareup.retrofit2:converter-jackson
  • Moshicom.squareup.retrofit2:converter-moshi
  • Protobufcom.squareup.retrofit2:converter-protobuf
  • Wirecom.squareup.retrofit2:converter-wire
  • Simple XMLcom.squareup.retrofit2:converter-simplexml
  • Scalars (primitives, boxed, and String): com.squareup.retrofit2:converter-scalars

Here's an example of using the GsonConverterFactory class to generate an implementation of the GitHubService interface which uses Gson for its deserialization.

Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("https://api.github.com")
    .addConverterFactory(GsonConverterFactory.create())
    .build();

GitHubService service = retrofit.create(GitHubService.class);
CUSTOM CONVERTERS

If you need to communicate with an API that uses a content-format that Retrofit does not support out of the box (e.g. YAML, txt, custom format) or you wish to use a different library to implement an existing format, you can easily create your own converter. Create a class that extends the Converter.Factory class and pass in an instance when building your adapter.



新建一个BaseApplication:
public class BaseApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        Fresco.initialize(this);
    }
}




新建一个HttpUtils 
public class HttpUtils  {
    public interface Service{
        public Call<>
    }
}




新建一个Entity


在浏览器中输入:http://m2.qiushibaike.com/article/list/video?page=
然后在拷贝里面的json 部分。
在android Studio 里面按alt+insert,点击GsonFormat
把刚才的内容拷贝进去,
然后点击ok ok




返回HttpUtils


public class HttpUtils  {
    public interface Service{
        @GET("article/list/video")
        Call<Entity> getVideo(@Query("page") int page);
    }
    private static Service service;
    static{
        service = new Retrofit.Builder().baseUrl("http://m2.qiushibaike.com/").addConverterFactory(GsonConverterFactory.create()).build().create(Service.class);
    }
    public static Service getService() {
        return service;
    }
}


下面写item的layout
为什么下面要有FrameLayout 的结构,是为了让两个一样大。
<?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">
<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/item_content"/>
    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <SurfaceView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/item_video"/>
        <com.facebook.drawee.view.SimpleDraweeView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/item_pic"/>


    </FrameLayout>
</LinearLayout>


新建一个VideoAdapter,ViewHolder


public class VideoAdapter {
    public static class VideoViewHolder extends RecyclerView.ViewHolder{


        private final TextView content;
        private final SimpleDraweeView pic;
        private final SurfaceView video;


        public VideoViewHolder(View itemView) {
            super(itemView);
            content = (TextView) itemView.findViewById(R.id.item_content);
            pic = (SimpleDraweeView) itemView.findViewById(R.id.item_pic);
            video = (SurfaceView) itemView.findViewById(R.id.item_video);
            pic.getHierarchy().setProgressBarImage(new ProgressBarDrawable());
pic.setAspectRatio(1);//设置高宽比 为 1
        }
    }
}


ViewHolder 做完,开始做Adapter


package com.example.xue.listmediareview;


import android.content.Context;
import android.net.Uri;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.SurfaceView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;


import com.facebook.drawee.drawable.ProgressBarDrawable;
import com.facebook.drawee.view.SimpleDraweeView;


import java.util.List;


/**
 * Created by XUE on 2016/1/8.
 */
public class VideoAdapter extends RecyclerView.Adapter<VideoAdapter.VideoViewHolder>{
    private Context context;
    private List<Entity.ItemsEntity> list;


    public VideoAdapter(Context context, List<Entity.ItemsEntity> list) {
        this.context = context;
        this.list = list;
    }


    @Override
    public VideoViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.item, parent, false);
        return new VideoViewHolder(view);
//        return null;
    }


    @Override
    public void onBindViewHolder(VideoViewHolder holder, int position) {
        Entity.ItemsEntity itemsEntity = list.get(position);
        holder.content.setText(itemsEntity.getContent());
        holder.pic.setImageURI(Uri.parse(itemsEntity.getPic_url()));


    }


    @Override
    public int getItemCount() {
//        return 0;
        return list.size();
    }


public void addAll(Collection<? extends Entity.ItemsEntity> collection){
        int size = list.size();
        list.addAll(collection);
        notifyItemRangeChanged(size,collection.size());
    }


    public static class VideoViewHolder extends RecyclerView.ViewHolder{


        private final TextView content;
        private final SimpleDraweeView pic;
        private final SurfaceView video;


        public VideoViewHolder(View itemView) {
            super(itemView);
            content = (TextView) itemView.findViewById(R.id.item_content);
            pic = (SimpleDraweeView) itemView.findViewById(R.id.item_pic);
            video = (SurfaceView) itemView.findViewById(R.id.item_video);
            pic.getHierarchy().setProgressBarImage(new ProgressBarDrawable());
pic.setAspectRatio(1);//设置高宽比 为 1
        }
    }
}




在mainxml 里面添加recycleView


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">




    <android.support.v7.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layoutManager="LinearLayoutManager"
        android:id="@+id/recycle"
        >






    </RecyclerView>
</RelativeLayout>




修改mainActivity


public class MainActivity extends AppCompatActivity implements Callback<Entity> {


    private VideoAdapter adapter;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycle);
        adapter = new VideoAdapter(this, new ArrayList<Entity.ItemsEntity>());
        recyclerView.setAdapter(adapter);
        HttpUtils.getService().getVideo(1).enqueue(this);
    }


    @Override
    public void onResponse(Response<Entity> response, Retrofit retrofit) {
        adapter.addAll(response.body().getItems());
    }


    @Override
    public void onFailure(Throwable t) {
        t.printStackTrace();
        Toast.makeText(this,"Fail",Toast.LENGTH_LONG).show();
    }
}






清单文件中添加:
<uses-permission android:name="android.permission.INTERNET"/>


application里面添加
        android:name=".BaseApplication"

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

内容概要:本文系统研究了基于豪猪优化算法(CPO)的多无人机协同集群在三维空间中的避障路径规划问题,聚焦于实现以最低成本为目标的航迹优化,综合考虑路径长度、飞行高度、威胁规避及转弯角度等多个关键因素。通过构建精细化的三维环境模型与多无人机协同机制,采用Matlab平台实现CPO算法的仿真与验证,充分展示了该算法在复杂动态障碍环境下的高效搜索能力与全局优化性能。研究不仅涵盖了路径规划的数学建模与目标函数设计,还深入探讨了算法的收敛特性与鲁棒性,为智能群体系统在实际场景中的应用提供了理论依据与技术支撑。; 适合人群:具备一定编程基础和优化算法背景,从事无人机系统控制、智能路径规划、群体协同、人工智能与自动化等相关领域的科研人员、高校研究生及工程技术人员。; 使用场景及目标:①应用于多无人机协同执行侦察、灾害监测、应急救援、区域巡检等复杂任务中的自主路径规划;②为智能优化算法在三维动态环境下的路径决策问题提供可复现的技术范例;③支持研究人员对CPO算法与其他主流群智能算法(如PSO、GWO、WOA等)进行性能对比与改进研究,推动路径规划技术的发展。; 阅读建议:建议结合提供的Matlab代码进行实践操作,重点理解目标函数的多维度建模方式与CPO算法的迭代优化流程,可通过调整环境参数与约束条件进行仿真实验,对比不同算法在相同场景下的路径质量与收敛速度,从而深入掌握其优势与适用边界。
内容概要:本文围绕电动汽车参与电力系统运行备用的能力评估展开深入研究,利用Matlab代码实现对电动汽车集群提供运行备用服务的建模与仿真分析。研究重点在于量化电动汽车作为分布式灵活资源参与电网辅助服务的潜力,通过构建精细化的数学模型,分析其可调功率容量、响应速度、时空分布特性及聚合能力,并采用多面体聚合、内近似模型与闵可夫斯基和等先进方法精确刻画其可调度能力边界。研究进一步结合大规模电动汽车接入场景,探讨其在多时间尺度调度框架下参与调峰、调频等辅助服务的优化策略,评估其对提升高比例可再生能源电网灵活性与稳定性的贡献,最终通过仿真验证所提模型与方法的有效性与实用性。; 适合人群:具备电力系统分析、智能电网、新能源汽车或优化调度等相关专业背景,熟悉Matlab/Simulink仿真工具,从事科研、工程应用的高校研究生、科研人员及电力行业工程师。; 使用场景及目标:①精确评估大规模电动汽车集群在不同约束条件下可提供的运行备用容量;②研究电动汽车在日前、日内及实时调度中的动态响应能力与优化调度策略;③为高渗透率新能源电力系统提供基于移动储能的灵活性资源解决方案,支撑电网安全经济运行。; 阅读建议:建议结合Matlab代码与技术文档同步学习,重点关注多面体聚合建模、能力边界计算及优化调度算法的设计与实现,可进一步拓展至V2G(车辆到电网)、需求响应等互动场景进行二次开发与应用验证。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值