Recycler View не отображает список - PullRequest
0 голосов
/ 20 марта 2020

Мой recyclerview не работает и не отображает список, который я ему установил. Не могли бы вы помочь мне выяснить проблему? Ниже приведены созданные мной Fragment и Adapter.

Класс фрагмента ->

class HomeFragment : Fragment() {

    lateinit var recyclerViewHomeHome: RecyclerView
    lateinit var layoutManager: RecyclerView.LayoutManager

    private val restaurantsInfoList = arrayListOf<Restaurant>(
        Restaurant("rohh", "4.5", "560/person", R.id.imgLogoLogin),
        Restaurant("rohh", "4.5", "560/person", R.id.imgLogoLogin),
        Restaurant("rohh", "4.5", "560/person", R.id.imgLogoLogin),
        Restaurant("rohh", "4.5", "560/person", R.id.imgLogoLogin),
        Restaurant("rohh", "4.5", "560/person", R.id.imgLogoLogin),
        Restaurant("rohh", "4.5", "560/person", R.id.imgLogoLogin),
        Restaurant("rohh", "4.5", "560/person", R.id.imgLogoLogin)

    )

    lateinit var recyclerAdapter: HomeRecyclerAdapter

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

        val view = inflater.inflate(R.layout.fragment_home, container, false)
        recyclerViewHomeHome = view.findViewById(R.id.recyclerViewHomeHome)
        layoutManager = LinearLayoutManager(activity)
        recyclerAdapter = HomeRecyclerAdapter(activity as Context, restaurantsInfoList)

    }
return view
}

Класс адаптера ->

class HomeRecyclerAdapter(val context: Context, val itemList: ArrayList<Restaurant>) :
    RecyclerView.Adapter<HomeRecyclerAdapter.homeViewHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): homeViewHolder {

        val view = LayoutInflater.from(parent.context)
            .inflate(R.layout.recycler_view_single_row_item, parent, false)
        return homeViewHolder(view)
    }

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

    override fun onBindViewHolder(holder: homeViewHolder, position: Int) {
        val restaurant = itemList[position]
        holder.txtRestaurantNameSingle.text = restaurant.name
        holder.txtPriceSingle.text = restaurant.cost_for_one
        holder.imgRecyclerViewSingle.setBackgroundResource(restaurant.image_url)
        holder.ratingRecyclerViewSingle.text = restaurant.rating

    }

    class homeViewHolder(view: View) : RecyclerView.ViewHolder(view) {
        val txtRestaurantNameSingle: TextView = view.findViewById(R.id.txtRestaurantNameSingle)
        val txtPriceSingle: TextView = view.findViewById(R.id.txtPriceSingle)
        val ratingRecyclerViewSingle: TextView = view.findViewById(R.id.ratingRecyclerViewSingle)
        val imgRecyclerViewSingle: ImageView = view.findViewById(R.id.imgRecyclerViewSingle)
    }
}

Ответы [ 3 ]

0 голосов
/ 20 марта 2020

Прежде всего, вы должны провести рефакторинг своего кода и взглянуть на recyclerview

Вот что я предлагаю в рефакторинге. Вам не нужно иметь контекст в вашем HomeRecyclerAdapter, поэтому просто удалите его.

Так что это должно выглядеть примерно так:

class HomeFragment : Fragment() {

    lateinit var recyclerViewHomeHome: RecyclerView
    lateinit var layoutManager: RecyclerView.LayoutManager
    lateinit var recyclerAdapter: HomeRecyclerAdapter

    private val restaurantsInfoList = arrayListOf<Restaurant>(
            Restaurant("rohh", "4.5", "560/person", R.id.imgLogoLogin),
            Restaurant("rohh", "4.5", "560/person", R.id.imgLogoLogin),
            Restaurant("rohh", "4.5", "560/person", R.id.imgLogoLogin),
            Restaurant("rohh", "4.5", "560/person", R.id.imgLogoLogin),
            Restaurant("rohh", "4.5", "560/person", R.id.imgLogoLogin),
            Restaurant("rohh", "4.5", "560/person", R.id.imgLogoLogin),
            Restaurant("rohh", "4.5", "560/person", R.id.imgLogoLogin)

    )

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

        val view = inflater.inflate(R.layout.fragment_home, container, false)
        recyclerViewHomeHome = view.findViewById(R.id.recyclerViewHomeHome)
        layoutManager = LinearLayoutManager(this)
        recyclerAdapter = HomeRecyclerAdapter(restaurantsInfoList)
        recyclerViewHomeHome.layout = layoutManager
        recyclerViewHomeHome.adapter = recyclerAdapter
        return view
    }

}

и для вашего адаптера вы можете использовать много kotlin прочность:

class HomeRecyclerAdapter(val itemList: ArrayList<Restaurant>) :
    RecyclerView.Adapter<HomeRecyclerAdapter.homeViewHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): homeViewHolder {
        homeViewHolder.from(parent)
    }

    override fun getItemCount(): Int = itemList.size

    override fun onBindViewHolder(holder: homeViewHolder, position: Int) {
        val restaurant = itemList[position]
        holder.bind(restaurant)
    }

    class homeViewHolder private constructor(view: View) : RecyclerView.ViewHolder(view) {
        val txtRestaurantNameSingle: TextView = view.findViewById(R.id.txtRestaurantNameSingle)
        val txtPriceSingle: TextView = view.findViewById(R.id.txtPriceSingle)
        val ratingRecyclerViewSingle: TextView = view.findViewById(R.id.ratingRecyclerViewSingle)
        val imgRecyclerViewSingle: ImageView = view.findViewById(R.id.imgRecyclerViewSingle)

        fun bind(item: Restaurant){
            txtRestaurantNameSingle.text = item.name
            txtPriceSingle.text = item.cost_for_one
            imgRecyclerViewSingle.setBackgroundResource(item.image_url)
            ratingRecyclerViewSingle.text = item.rating
        }

        companion object {
            fun from(parent: ViewGroup): ViewHolder {
                val view = LayoutInflater.from(parent.context).inflate(R.layout.recycler_view_single_row_item, parent, false)
                return homeViewHolder(view)
            }
        }

    }
}
0 голосов
/ 21 марта 2020

Я исправил это. Была одна простая ошибка, которую вы сделали. Проблема с вылетом состояла в том, что вы неправильно использовали инфлятор. Я скачал ваш проект и удалил все ненужные методы и переменные, чтобы выделить проблему. Я предполагаю, что вы новичок, но это нормально, поэтому я добавил несколько советов к комментариям.

Обратите внимание, что репо содержит только файлы java.

https://github.com/MicroRJ/BenzinpreiseApp-fixed

//Here was the problem 
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.list_row_prices, parent, false));
}

Если вам нужна дополнительная помощь, дайте мне знать. Кстати, для чего нужно приложение? Кажется круто.

0 голосов
/ 20 марта 2020

Вам необходимо установить менеджер раскладки и адаптер на RecyclerView:

    recyclerViewHomeHome = view.findViewById(R.id.recyclerViewHomeHome)
    layoutManager = LinearLayoutManager(activity)
    recyclerAdapter = HomeRecyclerAdapter(activity as Context, restaurantsInfoList)
    recyclerViewHomeHome.layoutManager = layoutManager
    recyclerViewHomeHome.adapter = recyclerAdapter
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...