## 一.首先配置Kotlin环境  ##
 1.在Android Studio 中  选择File-->Settings--->Pluguns  在进行收索Kotlin 进行安装,在重启Android Studio 即可
 2.新建一个项目,在你新建的项目下的build.gradle 配置Kotlin的版本号
    buildscript {
    

ext.kotlin_version = '1.0.0' 

    ext.kotlin_version = '1.1.2-4' 

    ext.support_version = '23.1.1' 

     

    ext.anko_version = '0.8.2' 

    repositories { 

    jcenter() 

    } 

    dependencies { 

        

    classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version" 

    classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 

    } 

    } 

 3.在你新建的项目的module下的build.gradle去配置一些属性 


    apply plugin: 'kotlin-android' 

    apply plugin: 'kotlin-android-extensions' 


 在dependencies 配置 

    dependencies { 


    

    compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" 

    

     

    } 



4. 这些都完成了之后 ,在Android Studio 选择Code-->Convert Java File to Kolin File  系统会自动把你的java代码转换成Kolitn代码 

5. 测试  在你.xml 编写一个TextView 



    <TextView 

    android:id="@+id/tv_test" 

    android:layout_width="wrap_content" 

    android:layout_height="wrap_content" /> 



   

 然后在你的Kolitn 代码中 可以直接得到你刚才编写TextView控件 

 根据id可以进行操作  


    tv_test.text="Hello Kolitn" 

 这时候会提示tv_test找不到 ,在你的代码中导入Kolitn包即可 


    import kotlinx.android.synthetic.main.activity_main.* 


 运行你的程序,界面上显示 Hello Kolitn证明你的Kolitn编译环境搭建完成 


## 二.获取本地视频 ## 


 1.首先建一个been对象 



    class VideoBeen(name: String, duration: Long, size: Long, data: String, imageUrl: String, desc: String) : Serializable { 

    val name: String 

    val duration: Long 

    val size: Long 

    val data: String 

    val imageUrl: String 

    val desc: String 



    init { 

        this.name = name 

        this.duration = duration 

        this.size = size 

        this.data = data 

        this.imageUrl = imageUrl 

        this.desc = desc 

    } 

    } 

 说明: 

   (1)参数就不多说了,这个Kotlin建been对象和java建been对象是不同的,java需要写大量的get()和set()方法,而Kotlin却不用 


   (2) java实现接口用implement 继承用extends 而Kotlin继承和实现接口都用":"就行了,如果想实现多个接口,用","分开即可 


    eg:class MainActivity : 接口1, 接口2... 

    

   (3)声明字段类型 val name:String   name是字段的名称  String是字段的类型   

 //用val或var声明变量,指明它们是不可变的或可变的 



 2.创建一个list  


     
` var list = ArrayList<VideoBeen>()` 


 java 中创建list都是new  而Kolitn不需要new 


 3.得到本地视频并把对象赋值给list  

   

      fun initData() { 

     

    val contentResolver = this.getContentResolver() 

    val uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI 

     

    val objects = arrayOf(MediaStore.Video.Media.DISPLAY_NAME, //在Sdcard显示的名称 

    MediaStore.Video.Media.DURATION, //视频的长度 

    MediaStore.Video.Media.SIZE, //视频文件大小 

    MediaStore.Video.Media.DATA//视频的绝对地址 

    ) 

    val cursor = contentResolver.query(uri, objects, null, null, null) 

     

    if (cursor != null) { 

    while (cursor.moveToNext()) { 

    val name = cursor.getString(0) 

    val duration = cursor.getLong(1) 

    val size = cursor.getLong(2) 

    val data = cursor.getString(3) 

     

    val mediaItem = VideoBeen(name, duration, size, data, "", ""); 

    //把视频添加到列表中 

    list.add(mediaItem) 

     

    } 

     

     

    cursor.close() 

    } 

     

    //Log.e("list", "list====" + list.size); 

    } 


## 三.Kotiln怎么写adapter ## 


 1.在你module下的build.gradle添加recycleview包 


    compile 'com.android.support:recyclerview-v7:24.0.0' 


 2.在布局中 


    <?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.support.v7.widget.RecyclerView 

    android:id="@+id/lv_video" 

    android:layout_width="match_parent" 

    android:layout_height="match_parent" 

    android:cacheColorHint="@android:color/transparent" /> 

     

     

     

     

    <TextView 

    android:visibility="gone" 

    android:id="@+id/tv_nomedia" 

    android:layout_width="wrap_content" 

    android:layout_height="wrap_content" 

    android:layout_centerInParent="true" 

    android:text="没有找到视频..." 

    android:textColor="@android:color/black" 

    android:textSize="18sp" /> 

     

    <ProgressBar 

    android:id="@+id/pb_loading" 

    android:layout_width="wrap_content" 

    android:layout_height="wrap_content" 

    android:layout_centerInParent="true" 

     /> 

     

    </RelativeLayout> 

     

 3.写adapter 先看代码 



    class VideoAdapter(val context: Context, val list: List<VideoBeen>, val inter: positioninterface.posi) : RecyclerView.Adapter<VideoAdapter.ViewHolder>() { 



    override fun onBindViewHolder(holder: ViewHolder?, position: Int) { 



        val mediaItem = list.get(position) 


        holder!!.tv_name.text = mediaItem.name 

        val itemview = holder.rl 

        itemview.setOnClickListener { 

            inter.getposition(position); 


        } 

        val size = mediaItem.size; 

        holder!!.tv_size.text = Formatter.formatFileSize(context, size) 

        holder!!.tv_duration.text = mediaItem.desc 



    } 


    override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): ViewHolder { 



        val view = View.inflate(context, R.layout.item_video_pager, null); 

        val viewHolder = ViewHolder(view) 


        return viewHolder; 


    } 


    override fun getItemCount(): Int { 



        return list.size; 

    } 



    class ViewHolder(itemView: View?) : RecyclerView.ViewHolder(itemView) { 



        var iv_icon: ImageView = itemView!!.findViewById(R.id.iv_icon) as ImageView; 

        var tv_name: TextView = itemView!!.findViewById(R.id.tv_name) as TextView; 

        var tv_duration: TextView = itemView!!.findViewById(R.id.tv_duration) as TextView; 

        var tv_size: TextView = itemView!!.findViewById(R.id.tv_size) as TextView; 

        var rl: RelativeLayout = itemView!!.findViewById(R.id.rl) as RelativeLayout; 

    } 



    } 


 说明: 


  (1)VideoAdapter()中的参数,val context: Context 上下文   

  val list: List<VideoBeen> 视频的集合 inter: positioninterface.posi 接口的实现 


  (2)继承RecyclerView.Adapter 刚才说过了Kolitn继承用“:” 

   

  (3)然后Alt+Enter,实现方法 

    

  (4)坑爹的ViewHolder 在adapter中还带自己写findviewbyid, 

 不用findviewbyid得到对象的话,一直抱空指针(但是会有人提出疑问,Kotlin不是可以根据id,来得到对象吗? 我这样测试了,压根不让你导包)如果有大神知道怎么优化这点,欢迎骚扰 

    

  (5) 怎么写布局,和实现接口的监听在这里就不说了(随后会把代码上传),说说怎么给对象赋值吧, java 代码holder..settext=""   而kotlin中 

 tv_size 

 就没有settext这个方法,而是 holder!!.tv_name.text="" 即可  


 话说这两个!!是什么东西 


 你把这个两个!!去掉的话,系统会提示你 


 Only sfe(?.) or non-null asserted(!!.) calls are allowed on a nullable receiver of type View? 

  简单的说这个对象可能为空或者是不安全的,在这里不允许在这个使用加上(?)或者(!!)才能使用 


## 四给recycleview设置adapter ## 


 1.和java代码没什么区别 (就是声明对象不new) 


    private fun setadapter() { 


        val videoAdapter = VideoAdapter(this, list, this) 

        val mLayoutManager = LinearLayoutManager(this) 

        lv_video.setLayoutManager(mLayoutManager) 

        lv_video.adapter = videoAdapter; 

    } 


## 五美化界面 ## 

 1.在系统需找本地视频的时候加一个提示 


 2.找不到视频,给用户一个提示 


    private fun setvisible(){ 

        pb_loading.visibility=View.GONE 

        if(list.size<=0){ 

            tv_nomedia.visibility=View.VISIBLE 

        } 


    } 

 3.实现接口的监听 

     


     public class positioninterface { 

    public interface posi { 


        public fun getposition(property: Int) 


    } 


    }



来判断用户点击的是哪个item

到这里就可以把本地视频给展示出来了

使用 Kotlin 读取本地视频并使用Vitamio框架编写万能播放器进行播放(二)地址