fragment中listview的创建


在使用listview的时候,我们必须用到adapt这个东西,adapt一般用于listview这种列表形式的类。它的作用就是用于数据和视图的适配。

首先我们创建一个样式用于显示内容 比如我创建item_study.xml

创建item样式

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:orientation="horizontal"
    android:layout_margin="20dp"
    android:layout_height="100dp">
    <ImageView
        android:id="@+id/item_image"
        android:layout_width="50dp"
        android:layout_height="50dp" />
    <LinearLayout
        android:layout_width="match_parent"
        android:orientation="vertical"
        android:gravity="center_horizontal"
        android:layout_height="match_parent">
        <TextView
            android:id="@+id/item_title"
            android:text="标题"
            android:textSize="25sp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
        <TextView
            android:layout_marginTop="10dp"
            android:id="@+id/dec"
            android:text="简介"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
    </LinearLayout>
</LinearLayout>

这个xml样式用于样式的显示

创建模型类

我们创建一个模型类用于表示里面的内容

class Study(val image:Int,val title:String,val dec: String) {

}

这个类名字后面的括号表示构造函数,我们这个构造函数里面有三个属性,一个是标题,一个是描述还有一个是图片。这里我们直接利用这个来声明属性以及从主构造函数初始化属性。

创建adapt

/**
 * 学习列表的adapt
 * @author 小游
 *  (activity: Context, private val id:Int, data:List<Study>),这个就是adapt的构造函数,里面是初始化adapt锁需要的参数
 *  : ArrayAdapter<Study>(activity,id,data) : 这个用于类实现接口或者继承类,如果是接口那么就不需要加括号,继承的话就需要加上括号
 *  因为arrayAdapt是一个泛型类 <>里面表示泛型的类型
 *  然后后面那个(activity,id,data)就是继承类的初始化,因为这个继承类有构造函数,继承的时候要初始化这个构造函数
 *  以往的java中如果继承的父类中有构造函数,那么就必须使用super(activity,id,data)来进行初始化,我们这里省去了super,直接初始化
 */
class StudyAdapt(activity: Context, private val id:Int, data:List<Study>) : ArrayAdapter<Study>(activity,id,data) {
    // 我们这里创建一个viewHolder来缓存控件数据,这里使用viewHolder的好处就是把控件的数据缓存起来,以供后面的函数调用
    inner class ViewHolder(val image:ImageView,val title:TextView,val dec:TextView)
    // 这里我们重写了getView的方法,这里我们就负责样式的初始化
    override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
        val view : View
        val holder : ViewHolder
        // 因为这个getView在进行加载的时候,每次布局都会重新加载一遍
        // convertView这个参数用于将之前的加载好的布局进行缓存。以便之后进行重用,所以我们可以进行判断,避免重新加载
        if (convertView == null){
            // 如果布局为空,那么我们就指定布局id
            view = LayoutInflater.from(context).inflate(id,parent,false)
            // 获取控件信息,然后放到holder里面
            val image: ImageView =view.findViewById(R.id.item_image)
            val title: TextView =view.findViewById(R.id.item_title)
            val dec: TextView =view.findViewById(R.id.item_dec)
            // 把holder绑定到tag上进行存储,方便后面直接调用
            holder = ViewHolder(image,title, dec)
            view.tag = holder
        }else {
            // 如果有缓存了,那么我们就直接调用就可
            view = convertView
            holder = view.tag as ViewHolder
        }
        // 这里的getItem是ArrayAdapter里面的一个方法,我们通过这个可以获取之前泛型里面的数据
        val study=getItem(position)//获取当前项得Fruit实例
        // 判断是否有数据,如果有的话我们就进行设置布局操作
        if (study!=null){
            // 这里我们直接用holder里面的数据来设置控件
            holder.image.setImageResource(study.image)
            holder.title.text = study.title
            holder.dec.text = study.dec
        }
        return  view
    }
}

这个adapt我这里已经注释的很详细了,看里面的操作就可以了。这里本质上就是对数据进行绑定

数据显示

// 初始化adapt
val adapter= StudyAdapt(view.context,R.layout.item_study,study)
// adapt赋值
knowledge_list.adapter = adapter

这个study是一个ArrayListstudy()类型


文章作者: 小游
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 小游 !
  目录