Android: проблема с использованием представления переработчика во фрагменте - PullRequest
0 голосов
/ 08 октября 2019

Я использую RecyclerView во Фрагменте ImagesliderFragment Во-первых, он дает исключение "повторное представление не должно быть пустым", поэтому при обработке стека я получил ответ, что вы должны инициализировать свое повторное представление с помощью следующей строки

  frag_rv = view.findViewById(R.id.frag_rv) as RecyclerView

Но проблема в том, что это дает мне ошибку при просмотре. что only safe or non null asserted calls are allowed также не разрешает мой RecyclerView, может кто-нибудь объяснить мне, в чем проблема?

code screenshot

ImagesliderFragment

class ImagesliderFragment : Fragment() {

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

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    inflater.inflate(R.layout.fragment_imageslider, container, false)
    frag_rv = view.findViewById(R.id.frag_rv) as RecyclerView
    frag_rv.layoutManager = LinearLayoutManager(context, LinearLayout.HORIZONTAL, false)
    return view
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {

}

Ответы [ 4 ]

2 голосов
/ 08 октября 2019

Попробуйте это

class ImagesliderFragment : Fragment() {

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

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {


    val myView = inflater.inflate(R.layout.fragment_imageslider, container, false)
    val frag_rv = myView.findViewById(R.id.frag_rv) as RecyclerView
    frag_rv.layoutManager = LinearLayoutManager(context, LinearLayout.HORIZONTAL, false)

    return myView
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {

}

Также теперь не нужно делать findViewById()

SAMPLE CODE

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.LinearLayout
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.LinearLayoutManager
// import here your layout file like this
import kotlinx.android.synthetic.main.fragment_imageslider.view.*

class ImagesliderFragment : Fragment() {

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

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {


        val myView = inflater.inflate(R.layout.fragment_imageslider, container, false)

        myView.frag_rv.layoutManager = LinearLayoutManager(context, LinearLayout.HORIZONTAL, false)

        return myView
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {

    }

}
0 голосов
/ 08 октября 2019

Вы должны использовать метод onCreateView только для надувания представления и привязки iew в методе onViewCreated

class ImagesliderFragment : Fragment() {

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

    }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?) = inflater.inflate(R.layout.fragment_imageslider, container, false)!!

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {

        val frag_rv = view.findViewById<RecyclerView>(R.id.frag_rv)            frag_rv.layoutManager = LinearLayoutManager(context, LinearLayout.HORIZONTAL, 
            false)
    }
}
0 голосов
/ 08 октября 2019

Прежде чем использовать view.findViewById, вы должны его инициализировать, также используйте val перед frag_rv, как показано ниже.

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {

  // here you have to initialize your view
  View view = inflater.inflate(R.layout.fragment_imageslider, container, false)
  val frag_rv = view.findViewById(R.id.frag_rv) as RecyclerView
  frag_rv.layoutManager = LinearLayoutManager(context, LinearLayout.HORIZONTAL, false)

  return view
}
0 голосов
/ 08 октября 2019

Вы можете изменить свой метод onCreateView на:

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
) = 
    inflater.inflate(R.layout.fragment_imageslider, container, false).apply {
    frag_rv = findViewById(R.id.frag_rv) as RecyclerView //val frag_rv if it's not declared elsewhere 
    frag_rv.layoutManager = LinearLayoutManager(context, LinearLayout.HORIZONTAL, false)
}

Таким образом, представление будет раздуто (через inflater.inflate), и вы используете его для поиска RecyclerView.

...