android - 使用 Glide 时图像未显示在 Recyclerview 上

标签 android android-recyclerview kotlin android-glide

我有一个使用 recyclerview 的帖子列表。该列表很棒,但是当我尝试在回收器 View 中添加图像时出现问题。我正在使用 Glide 添加图像。我已成功在抽屉导航中使用 glide 添加图像,但是当我尝试使用 Recyclerview 时,它只显示我获取的默认图像。

这是我的 kotlin

class InformationListActivity : MainActivity() {
private val glide: RequestManager? = null

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_information_list)

    val toolbar = findViewById<View>(R.id.toolbar) as Toolbar
    setSupportActionBar(toolbar)
    supportActionBar!!.setDisplayHomeAsUpEnabled(true)
    supportActionBar!!.setDisplayShowHomeEnabled(true)

    val user = FirebaseAuth.getInstance().currentUser
    val uName = user?.displayName
    val uEmail = user?.email
    val uPhotoUrl = user?.photoUrl
    user?.uid

    val navigationView = findViewById<View>(R.id.nav_view) as NavigationView
    navigationView.setNavigationItemSelectedListener(this)
    val headerView = navigationView.getHeaderView(0)

    val navName = headerView.findViewById<TextView>(R.id.navName)
    navName.text = uName
    val navEmail = headerView.findViewById<TextView>(R.id.navEmail)
    navEmail.text = uEmail
    val navImage = headerView.findViewById<ImageView>(R.id.navImage)
    Glide.with(this).load(uPhotoUrl).into(navImage)

    window.clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS)

    val signOut = findViewById<View>(R.id.btnSignOut) as LinearLayout
    signOut.setOnClickListener {
        FirebaseAuth.getInstance().signOut()
        val goToLogin = Intent(this@InformationListActivity, LoginActivity::class.java)
        startActivity(goToLogin)
    }


    val recyclerView = findViewById<View>(R.id.recycler_view) as RecyclerView
    recyclerView.setHasFixedSize(true)
    recyclerView.layoutManager = LinearLayoutManager(this)
    val myref = FirebaseDatabase.getInstance().reference.child("/posts")
    val recyclerAdapter = object : FirebaseRecyclerAdapter<Post, InformationListActivity.PostViewHolder>(
            Post::class.java,
            R.layout.information_model,
            InformationListActivity.PostViewHolder::class.java,
            myref
    ) {
        override fun populateViewHolder(viewHolder: InformationListActivity.PostViewHolder, model: Post, position: Int) {
            val data_empty = findViewById<View>(R.id.data_empty) as TextView
            data_empty.visibility = View.GONE
            viewHolder.run {
                glide?.let { setmPostImageUrl(it,model.getmPostImageUrl()) }
                setmPostTitle(model.getmPostTitle())
                setmPostDescription(model.getmPostDescription())
                viewHolder.setItemClickListener(object : ItemClickListener {
                    override fun onItemClick(pos: Int) {
                        //OPEN DETAIL ACTIVITY
                        openInformationDetail(model.getmPostImageUrl(), model.getmPostTitle(), model.getmPostDescription())
                    }
                })
            }
        }
    }
    recyclerView.adapter = recyclerAdapter
}

private fun openInformationDetail(vararg details: String) {
    val i = Intent(this, InformationDetailActivity::class.java)
    i.putExtra("POSTIMAGEURL_KEY", details[0])
    i.putExtra("POSTTITLE_KEY", details[1])
    i.putExtra("POSTDESCRIPTION_KEY", details[2])
    startActivity(i)
}

class PostViewHolder(mView: View) : RecyclerView.ViewHolder(mView), View.OnClickListener {
    private var modelImgPost: ImageView = mView.findViewById(R.id.imgPost)
    private var modelPostTitle: TextView = mView.findViewById(R.id.modelPostTitle)
    private var modelPostDescription: TextView = mView.findViewById(R.id.modelPostDescription)
    private var btnMore: Button = mView.findViewById(R.id.btnMore)
    private lateinit var itemClickListener: ItemClickListener

    init {
        btnMore.setOnClickListener(this)
    }

    fun setItemClickListener(itemClickListener: ItemClickListener) {
        this.itemClickListener = itemClickListener
    }

    override fun onClick(view: View) {
        this.itemClickListener.onItemClick(this.layoutPosition)
    }

    fun setmPostImageUrl(glide: RequestManager, mPostImageUrl: String) {
        glide.load(Uri.parse(mPostImageUrl)).into(modelImgPost)
    }

    fun setmPostTitle(mPostTitle: String) {
        modelPostTitle.text = mPostTitle
    }

    fun setmPostDescription(mPostDescription: String) {
        modelPostDescription.text = mPostDescription
    }
}

最佳答案

if (glide != null) {
    setmPostImageUrl(glide, model.getmPostImageUrl())
}

Glide 是 null 因为你从未分配/实例化它。

替换这一行:

private val glide: RequestManager? = null

与:

private var glide: RequestManager? = null

并在onCreate()中执行:

glide = Glide.with(this)

关于android - 使用 Glide 时图像未显示在 Recyclerview 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46013255/

相关文章:

android - 如何使用ffmpeg进行多线程?

当子元素展开/折叠时,Android RecyclerView 滚动到顶部

android - 无法滚动 RecyclerView,当尝试在滚动时隐藏工具栏

android - 错误 :Execution failed for task ':app:compileDebugKotlin' . > 编译错误。有关详细信息,请参阅日志

kotlin - Map withDefault 无法在 kotlin 中工作?

android - Dokka - 跳过为默认的 android 包生成 javadoc

android - 从 WebView 抓取图片

java - 返回使用 jsoup 从 url 检索到的图像数组

java - 所有 com.android.support 库和 SDK 版本都必须相同、更高还是更低?

android - 更新回收器 View 来自不同 Activity 的项目