Android layout 来自视图适配器的无条件布局膨胀。科特林

Android layout 来自视图适配器的无条件布局膨胀。科特林,android-layout,android-studio,kotlin,Android Layout,Android Studio,Kotlin,我在Android Studio中收到以下警告: “来自视图适配器的无条件布局充气:应使用视图保持器模式(使用传递到此方法的循环视图作为第二个参数)以实现更平滑的滚动。”在充气器上。充气(R.layout.animal_ticket,null)行 如何修复警告?我找不到解决那个问题的办法 谢谢 override fun getView(p0: Int, p1: View?, p2: ViewGroup?): View { val animal = listOfAnimals[p0

我在Android Studio中收到以下警告: “来自视图适配器的无条件布局充气:应使用视图保持器模式(使用传递到此方法的循环视图作为第二个参数)以实现更平滑的滚动。”在充气器上。充气(R.layout.animal_ticket,null)行

如何修复警告?我找不到解决那个问题的办法

谢谢

override fun getView(p0: Int, p1: View?, p2: ViewGroup?): View {
        val animal = listOfAnimals[p0]
        val inflater = LayoutInflater.from(context)
        var holder = ViewHolder()
        val myView = inflater.inflate(R.layout.animal_ticket, null)
        myView.tvName.text = animal.name!!
        myView.tvDes.text = animal.description!!
        myView.jvAnimalImage.setImageResource(animal.image!!)
        return myView
    }

如果以前有另一个相同视图类型的
视图
getItemViewType(position:Int)
返回了相同的值)滚动到屏幕外,列表视图可能会将该实例作为第二个参数传递到
getView()
。重用该视图比膨胀新视图要快

您还应该使用
ViewHolder
来缓存有关视图的内容,例如相对昂贵的
findViewById()
。可以通过标记将其附着到视图并从视图中检索

override fun getView(position: Int, convertView: View?, parent: ViewGroup?) {
    val animal = listOfAnimals[position]
    val myView = convertView ?:
        LayoutInflater.from(context).inflate(R.layout.animal_ticket, parent, false)
    val holder = myView.tag as? ViewHolder ?: ViewHolder(myView)
    myView.tag = holder
    holder.tvName.text = animal.name!! // etc
}

class ViewHolder(view: View) {
    val tvName: TextView = view.name // etc
}

对于任何RecyclerView,您需要自己的ViewHolder类,该类包含
animal\u ticket
中列出的所有视图

基本上,它是这样工作的:

1) 创建“保存”要显示的项目的所有视图的ViewHolder

2) 将ViewHolder绑定到RecyclerView,并为其中的视图赋值

下面是我编写的适配器示例:

class MyActivity : Activity() {
//users is the list we're going to use to get information for the views
val users = ArrayList<User>()
//...getting user information
//.. your activity stuff here

//Creating our adapter
/* 
  Note that to extend the RecyclerView.Adapter, you need to specify a
  ViewHolder. The code becomes much easier to manage if you just put the 
  ViewHolder inside your adapter.
*/
inner class MyAdapter : RecyclerView.Adapter<MyAdapter.MyViewHolder>() {

    //This is the view holder
    inner class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        //Here you declare your views and get them from the itemView
        //The itemView is one that is passed each time to the RecyclerView
        //(the items inside your XML layout file)
        internal val userImageView = itemView.findViewById(R.id.userImage)
        internal val userFullName = itemView.findViewById(R.id.userName)
    }

    //This is where you return your own ViewHolder with your layout
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
        val layoutInflater = LayoutInflater.from(parent.context)
        //user_list_item.xml is below
        val itemView = layoutInflater.inflate(R.layout.user_list_item, parent, false))
        return MyViewHolder(itemView)
    }


    //In here is where you want to set your values for the views
    override fun onBindViewHolder(holder: SentRequestViewHolder, position: Int) {
        val currentUser = users[position]

        holder.userImage.drawable = currentUser.drawable
        holder.userFullName.text = currentUser.name
    }

    //You must override this method as well for the adapter to work properly
    override fun getItemCount() = users.size
}
类MyActivity:Activity(){
//用户是我们用来获取视图信息的列表
val users=ArrayList()
//…获取用户信息
//你的活动资料在这里
//创建我们的适配器
/* 
请注意,要扩展RecyclerView.Adapter,需要指定
如果您只需将
适配器内的视窗支架。
*/
内部类MyAdapter:RecyclerView.Adapter(){
//这是视图持有者
内部类MyViewHolder(itemView:View):RecyclerView.ViewHolder(itemView){
//在这里,您可以声明视图并从itemView获取它们
//itemView是每次传递给RecyclerView的视图
//(XML布局文件中的项目)
内部val userImageView=itemView.findviewbyd(R.id.userImage)
内部val userFullName=itemView.findviewbyd(R.id.userName)
}
//在这里,您可以将自己的ViewHolder与布局一起返回
重写CreateViewHolder(父级:ViewGroup,viewType:Int):MyViewHolder{
val layoutInflater=layoutInflater.from(parent.context)
//下面是user_list_item.xml
val itemView=layoutInflater.flate(R.layout.user\u list\u item,parent,false))
返回MyViewHolder(项目视图)
}
//在这里,您要为视图设置值
覆盖onBindViewHolder(holder:SentRequestViewHolder,位置:Int){
val currentUser=用户[位置]
holder.userImage.drawable=currentUser.drawable
holder.userFullName.text=currentUser.name
}
//您还必须重写此方法,适配器才能正常工作
重写getItemCount()=users.size
}
使用RecyclerView.Adapter时,必须重写这些方法

以下是user_list_item.xml

<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="100dp">

    <ImageView
        android:id="@+id/userImage"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

    <TextView
        android:id="@+id/userName"
        android:layout_below="@id/userImage"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

 </RelativeLayout>

很好的建议,但鉴于问题使用了
覆盖有趣的getView
,OP可能使用
列表视图
/
适配器
,而不是
回收视图
/
回收视图.适配器