Android layout 来自视图适配器的无条件布局膨胀。科特林
我在Android Studio中收到以下警告: “来自视图适配器的无条件布局充气:应使用视图保持器模式(使用传递到此方法的循环视图作为第二个参数)以实现更平滑的滚动。”在充气器上。充气(R.layout.animal_ticket,null)行 如何修复警告?我找不到解决那个问题的办法 谢谢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
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可能使用列表视图
/适配器
,而不是回收视图
/回收视图.适配器
。