从视图适配器无条件布局通货膨胀。 Kotlin

我在Android Studio中收到以下警告:“视图适配器的无条件布局膨胀:应该使用视图持有者模式(使用传递给此方法的循环视图作为第二个参数)以实现更平滑的滚动。 在inflater.inflate(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 } 

对于任何RecyclerView,您都需要拥有自己的ViewHolder类,该类拥有animal_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 } 

使用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> 

如果之前有另一个视图类型( 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 }