【问题标题】:Unconditional layout inflation from view adapter. kotlin来自视图适配器的无条件布局膨胀。科特林
【发布时间】:2017-08-13 17:38:37
【问题描述】:

我在 Android Studio 中收到以下警告: “来自视图适配器的无条件布局膨胀:应该使用 View Holder 模式(使用传递给此方法的回收视图作为第二个参数)以获得更平滑的滚动。”在 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
    }

【问题讨论】:

    标签: android-layout android-studio kotlin


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      对于任何 RecyclerView,您都需要自己的 ViewHolder 类,该类包含animal_ticket 中列出的所有视图。

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

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

      2) 将ViewHolder绑定到RecyclerView,并给里面的view赋值;

      这是我写的一个示例适配器:

      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>
      

      【讨论】:

      • 好建议,但鉴于问题使用override fun getView,OP 可能使用ListView/Adapter 而不是RecyclerView/RecyclerView.Adapter
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-12
      • 2013-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多