代码之家  ›  专栏  ›  技术社区  ›  wbk727

为GridView创建适配器时出现内部类构造函数问题

  •  -1
  • wbk727  · 技术社区  · 6 年前

    我试图以编程方式将一些项添加到GridView中,但它不起作用。我已经看到了关于这个错误的类似问题的答案,但我不确定在这个场景中应该做什么。创建外部类还是其他什么?

    AdapterItem 在里面 adapter.addAdapterItem(MyFragment.AdapterItem(primeNumber))

    内部类AdapterItem的构造函数只能通过包含类的接收方调用

    class MyFragment : androidx.fragment.app.Fragment() {
        private val primeNumbers = arrayOf("2", "3", "5", "7", "11", "13", "17", "19", "23", "29")
    
        private lateinit var adapter: MyAdapter
    
        override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
            return inflater.inflate(R.layout.fragment_linearlayout, container, false)
        }
    
        override fun onActivityCreated(savedInstanceState: Bundle?) {
            val v = view
    
            val mainLinearLayout = v!!.findViewById(R.id.my_linearLayout) as LinearLayout
            val cardLinearLayout = LinearLayout(context)
    
            cardLinearLayout.orientation = LinearLayout.VERTICAL
    
    
            val cardView = context?.let { CardView(it) }
            when {
                cardView != null -> {
                    cardView.radius = twoDp.toFloat()
                    cardView.setContentPadding(36,36,36,36)
                    cardView.layoutParams = params
                    cardView.cardElevation = twoDp.toFloat()
                }
            }
    
    
            val mTitle = TextView(context)
            mTitle.text = "Prime numbers"
            TextViewCompat.setTextAppearance(mTitle, android.R.style.TextAppearance_Large)
    
            val mGridView = com.companyname.appname.MyGridView(context!!)
            mGridView.columnWidth = 100f
            mGridView.run {
                numColumns = GridView.AUTO_FIT
                stretchMode = GridView.STRETCH_COLUMN_WIDTH
            }
            adapter = MyAdapter(activity!!.applicationContext, 0)
            mGridView.adapter = adapter
            for (primeNumber in primeNumbers) {
                adapter.addAdapterItem(MyFragment.AdapterItem(primeNumber))
            }
    
            cardLinearLayout.addView(mTitle)
            cardLinearLayout.addView(mGridView)
            cardView!!.addView(cardLinearLayout)
            mainLinearLayout.addView(cardView)
    
            super.onActivityCreated(savedInstanceState)
        }
    
    
        private inner class MyAdapter internal constructor(context: Context, textviewid: Int) : ArrayAdapter<AdapterItem>(context, textviewid) {
            private val items = ArrayList<AdapterItem>()
    
            internal fun addAdapterItem(item: MyFragment.AdapterItem) {
                items.add(item)
            }
    
            override fun getCount(): Int {
                return items.size
            }
    
            override fun getItem(position: Int): MyFragment.AdapterItem? {
                return items[position]
            }
    
            override fun getItemId(position: Int): Long {
                return position.toLong()
            }
    
            @NonNull
            override fun getView(position: Int, convertView: View?, @NonNull parent: ViewGroup): View {
                val rowView: View = when (convertView) {
                    null -> activity!!.layoutInflater.inflate(R.layout.gridview_item, parent, false)
                    else -> convertView
                }
    
                val tv = rowView.findViewById(R.id.item_gridview) as TextView
                tv.text = items[position].first
    
                return rowView
            }
        }
    
        internal inner class AdapterItem // add more items
        (var first: String)
    }
    

    GridView类

    class MyGridView : GridView {
        constructor(context: Context) : super(context)
    
        constructor(context: Context, attrs: AttributeSet) : super(context, attrs)
    
        constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(context, attrs, defStyle)
    
        override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
            val heightSpec: Int = when {
                layoutParams.height == AbsListView.LayoutParams.WRAP_CONTENT -> View.MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE shr 2, View.MeasureSpec.AT_MOST)
                else -> heightMeasureSpec
            }
    
            super.onMeasure(widthMeasureSpec, heightSpec)
        }
    }
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   zapl    6 年前

    改变

    adapter.addAdapterItem(MyFragment.AdapterItem(primeNumber))
    

    adapter.addAdapterItem(AdapterItem(primeNumber))
    

    或者它的形式很长

    adapter.addAdapterItem(this.AdapterItem(primeNumber))
    

    因为那样的话,它试图通过 this.AdapterItem

    inner 内部的