【问题标题】:Stuck for apply Recyclerview in Fragment Android Studio [Kotlin]卡在 Fragment Android Studio [Kotlin] 中申请 Recyclerview
【发布时间】:2022-01-07 02:34:29
【问题描述】:

卡了好几天了,如何在fragment中申请recyclerview?它只是不工作。 Fragment.kt 中的 this 给我一个错误“类型不匹配,必需:上下文!”

这是我的 HomePageActivity

package com.haziqharis.golivetvmalaysia

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import androidx.fragment.app.Fragment
import com.google.android.material.bottomnavigation.BottomNavigationView
import com.haziqharis.golivetvmalaysia.fragment.*

class HomepageActivity : AppCompatActivity() {


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_FULLSCREEN
        actionBar?.hide()
        setContentView(R.layout.activity_homepage)
        val bottomNavigationView = findViewById<BottomNavigationView>(R.id.bottomNavigationView)

        val fragmentHome = HomeFragment()
        val fragmentLive = LiveFragment()
        val fragmentShopping = ShoppingFragment()
        val fragmentCart = CartFragment()
        val fragmentProfile = ProfileFragment()

        setCurrentFragment(fragmentHome)

        bottomNavigationView.setOnNavigationItemSelectedListener {
            when(it.itemId){
                R.id.homeIcon -> setCurrentFragment(fragmentHome)
                R.id.liveIcon -> setCurrentFragment(fragmentLive)
                R.id.shoppingIcon -> setCurrentFragment(fragmentShopping)
                R.id.cartIcon -> setCurrentFragment(fragmentCart)
                R.id.profileIcon -> setCurrentFragment(fragmentProfile)
            }
            true
        }

        bottomNavigationView.getOrCreateBadge(R.id.cartIcon).apply {
            number = 99
            isVisible = true
        }
    }

    private fun setCurrentFragment(fragment: Fragment) =
        supportFragmentManager.beginTransaction().apply {
            replace(R.id.flFragmentHomepage, fragment)
            commit()
        }
}

这是我的 Fragment.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/blueBackground"
    android:padding="20dp"
    tools:context=".fragment.ShoppingFragment">


    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/shoppingRV"
        android:layout_width="match_parent"
        android:layout_height="570dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

这是我的 Fragment.kt

package com.haziqharis.golivetvmalaysia.fragment

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import com.haziqharis.golivetvmalaysia.R
import com.haziqharis.golivetvmalaysia.data.ProductData
import com.haziqharis.golivetvmalaysia.databinding.ShoppingProductBinding


class ShoppingFragment : Fragment() {

}
package com.haziqharis.golivetvmalaysia.fragment

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.LinearLayoutManager
import com.haziqharis.golivetvmalaysia.HomepageActivity

import com.haziqharis.golivetvmalaysia.R
import com.haziqharis.golivetvmalaysia.adapter.ShoppingAdapter
import com.haziqharis.golivetvmalaysia.data.ProductData
import com.haziqharis.golivetvmalaysia.databinding.ShoppingProductBinding
import kotlinx.android.synthetic.main.fragment_shopping.*


class ShoppingFragment : Fragment(R.layout.fragment_shopping) {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        var productList = mutableListOf<ProductData>(
            ProductData("Item 1","700$", "Nothing"),
            ProductData("Item 2","7300$", "Nothing"),
            ProductData("Item 3","7400$", "Nothing"),
            ProductData("Item 4","7300$", "Nothing"),
            ProductData("Item 5","7100$", "Nothing"),
            ProductData("Item 6","7400$", "Nothing"),
            ProductData("Item 7","7050$", "Nothing"),
            )

        val adapter = ShoppingAdapter(productList)
        shoppingRV.adapter = adapter
        shoppingRV.layoutManager = LinearLayoutManager(this)

    }
}

这是我的产品在 recyclerview [xml] 中

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="130dp">

    <ImageView
        android:id="@+id/productPhoto"
        android:layout_width="80dp"
        android:layout_height="80dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        android:layout_marginStart="20dp"
        app:srcCompat="@drawable/ic_shopping" />

    <TextView
        android:id="@+id/productTitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Product Name | Nama Produk"
        android:textSize="17sp"
        android:textStyle="bold"
        android:textColor="@color/black"
        android:layout_marginStart="40dp"
        app:layout_constraintStart_toEndOf="@+id/productPhoto"
        app:layout_constraintTop_toTopOf="@+id/productPhoto" />

    <TextView
        android:id="@+id/productPrice"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@color/black"
        android:layout_marginTop="6dp"
        android:text="RM1 000 000"
        app:layout_constraintStart_toStartOf="@+id/productTitle"
        app:layout_constraintTop_toBottomOf="@+id/productTitle" />

    <TextView
        android:id="@+id/productDescription"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/productDescription"
        android:textSize="11sp"
        android:layout_marginTop="6dp"
        app:layout_constraintStart_toStartOf="@+id/productPrice"
        app:layout_constraintTop_toBottomOf="@+id/productPrice" />


</androidx.constraintlayout.widget.ConstraintLayout>

这是我的 ProductData.kt

package com.haziqharis.golivetvmalaysia.data

data class ProductData(
    val product_name: String,
    val product_price: String,
    val product_description: String
)

这是我的适配器

package com.haziqharis.golivetvmalaysia.adapter

import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.haziqharis.golivetvmalaysia.R
import com.haziqharis.golivetvmalaysia.data.ProductData

class ShoppingAdapter(
    var product: List<ProductData>
    ) : RecyclerView.Adapter<ShoppingAdapter.ProductView>(){

    inner class ProductView(productView: View) : RecyclerView.ViewHolder(productView)

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ProductView {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.shopping_product, parent, false)
        return ProductView(view)
    }

    override fun onBindViewHolder(holder: ProductView, position: Int) {
        holder.itemView.apply{
            val productTitle = findViewById<TextView>(R.id.productTitle)
            val productDescription = findViewById<TextView>(R.id.productDesciption)
            val productPrice = findViewById<TextView>(R.id.productPrice)

            productTitle.text = product[position].product_name
            productDescription.text = product[position].product_description
            productPrice.text = product[position].product_price
        }
    }

    override fun getItemCount(): Int {
        return product.size
    }
}

【问题讨论】:

    标签: kotlin android-fragments android-recyclerview


    【解决方案1】:

    activity this 中考虑context,因为它是Activity 的超类。在fragments 中情况不一样。所以你需要从activity 传递context。所以像这样更改代码

    activity.context// posible null
    

    还有

    activity.requireContext() //not null
    

    【讨论】:

    • 你的意思是像 shoppingRV.layoutManager = LinearLayoutManager(Activity.context)
    • 是 perfer requireContext() 不为空
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-29
    • 1970-01-01
    • 2018-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多