Unconditional layout, inflation from view adapter: Should use View Holder pattern

后端 未结 5 1831
天命终不由人
天命终不由人 2020-12-08 13:33

I am getting following warning in eclipse:

Unconditional layout inflation from view adapter: Should use View Holder pattern (use recycled view passed

5条回答
  •  情书的邮戳
    2020-12-08 13:56

    What i have done is created a BaseSpinnerAdapter class and reusing it if needed

    import android.content.Context
    import android.view.LayoutInflater
    import android.view.View
    import android.view.ViewGroup
    import android.widget.BaseAdapter
    import androidx.annotation.LayoutRes
    
    /**
     * @param T Model class
     * @param VH ViewHolder class, which holds the view to reuse it
     * */
    abstract class BaseSpinnerAdapter(context: Context?, private val items: ArrayList) :
        BaseAdapter() {
    
        private var inflater: LayoutInflater = LayoutInflater.from(context)
    
        /** use viewHolder pattern to reusing the views
         * @param p0 current view position
         * @param p1
         * @param viewGroup
         * */
        override fun getView(p0: Int, p1: View?, viewGroup: ViewGroup?): View {
            var pClone = p1
            val viewHolder: VH
    
            if (pClone == null) {
            pClone = inflater.inflate(setSpinnerItemLayout(), viewGroup, false)
            viewHolder = createViewHolder(pClone)
            pClone?.tag = viewHolder
        } else {
            viewHolder = pClone.tag as VH
    
        }
            getView(viewHolder, p0)
    
            return pClone!!
        }
    
    
        override fun getItem(p0: Int): T {
            return items[p0]
        }
    
        override fun getItemId(p0: Int): Long {
            return p0.toLong()
        }
    
        override fun getCount(): Int {
            return items.size
        }
    
        @LayoutRes
        abstract fun setSpinnerItemLayout(): Int
    
        abstract fun getView(viewHolder: VH, position: Int)
    
        abstract fun createViewHolder(view: View?): VH
    
    
    }
    

    Here is an example How you can use BaseSpinnerAdapter in your implementation. I believe that there is no need to detail out the code description.

        class SpinnerImplAdapter(context: Context?, private val items: ArrayList) : BaseSpinnerAdapter(context, items) {
        
        
            override fun setSpinnerItemLayout(): Int {
                return R.layout.spinner_item
            }
        
            override fun createViewHolder(view: View?): ViewHolderImp {
                return ViewHolderImp(view)
            }
        
            override fun getView(viewHolder: ViewHolderImp, position: Int) {
                val model = items[position]
                viewHolder.textView?.text = "" // model.etc get anything you want
            }
        
        
    /**
     * I have used kotlin extension to get the viewId, 
     * if you are not using then simply call the view.findViewById(R.id.yourView)
     * */
            class ViewHolderImp(view: View?) {
                val textView: TextView? = view?.textView
            }
        
        
        }
    

提交回复
热议问题