2017-08-13 4 views
1

Ich erhalte folgende Warnung in Android Studio: "Unbedingte Layout Inflation von Ansicht Adapter: Sollte View Holder-Muster verwenden (recycled Ansicht in diese Methode als zweiter Parameter übergeben) für reibungsloseres Scrollen." auf inflater.infllate (R.layout.animal_ticket, null) Zeile.Bedingungslose Layout Inflation von Ansicht Adapter. Kotlin

Wie behebe ich die Warnung? Ich bin nicht in der Lage, eine Lösung für dieses Problem zu finden.

Danke!

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 
    } 

Antwort

1

Wenn es vorher war eine weitere View desselben Sichttyp (getItemViewType(position: Int) den gleichen Wert zurückgeführt), der Bildschirm gescrollt wird die Liste in diesem Fall als zweiten Parameter zu getView() passieren können. Es ist schneller, diese Ansicht wiederzuverwenden, als eine neue aufzublasen.

Sie sollten auch die ViewHolder verwenden, um Dinge über die Ansicht zu cachen, wie die relativ teure findViewById(). Sie können es anhängen und aus der Ansicht nach Tag abrufen.

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

Für RecyclerView, müssen Sie Ihre eigene ViewHolder Klasse, die alle Ansichten aufgelistet innerhalb animal_ticket hat.

Grundsätzlich funktioniert es wie folgt aus:

1) ViewHolder erstellen, dass alle Ansichten des Elements ‚hält‘ Sie anzeigen möchten;

2) Binden Sie den ViewHolder an die RecyclerView und weisen Sie den Ansichten Werte zu;

Hier ein Beispiel Adapter schrieb ich:

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 
} 

Sie müssen diese Methoden außer Kraft setzen, wenn ein RecyclerView.Adapter

Hier ist die 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> 
+1

Guter Rat mit, aber da die Frage 'override fun getView' verwendet, verwendet OP wahrscheinlich 'ListView' /' Adapter' und nicht 'RecyclerView' /' RecyclerView.Adapter'. – ephemient

Verwandte Themen