Как я могу динамически добавлять CardView в RecyclerView?

Так что я впервые использую RecyclerView.

Я пытаюсь получить данные из базы данных, а затем создать экземпляр класса Услуга, который будет использоваться для динамического создания CardView, который будет отображаться в RecyclerView как элемент. RecyclerView является частью класса Fragment.

Класс Fragment:

package com.alsowaygh.getitdone.view.services;

import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.widget.CardView;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

import com.alsowaygh.getitdone.R;
import com.alsowaygh.getitdone.controller.service.QueryServices;
import com.alsowaygh.getitdone.controller.service.Service;

import java.util.ArrayList;

public class ServicesListFragment extends Fragment {
    private RecyclerView mRecyclerView;
    private RecyclerView.Adapter mAdapter;
    private CardView mServiceCardView;
    private RecyclerView.LayoutManager mLayoutManager;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View rootView = inflater.inflate(R.layout.services_list_fragment, container, false);

        mRecyclerView = rootView.findViewById(R.id.services_recycler_view);
        mServiceCardView = rootView.findViewById(R.id.service_card_view);
        mLayoutManager = new LinearLayoutManager(rootView.getContext());
        mRecyclerView.setLayoutManager(mLayoutManager);

        //retreive argument from CategoriesListFragment (selected)
        String selectedCategory = getArguments().getString("category");

        //Query services for selected category
        QueryServices queryServices = new QueryServices();
        ArrayList<Service> services = queryServices.getServicesForCategory(selectedCategory);


        mAdapter = new ServiceListAdapter(services);
        mRecyclerView.setAdapter(mAdapter);

        return rootView;
    }

}

Макет фрагмента включает в себя просмотр Recycler:

<LinearLayout android:id = "@+id/categories_list_fragment"
    android:name = "com.alsowaygh.getitdone.view.services.ServicesListFragment"
    android:layout_width = "match_parent"
    android:layout_height = "match_parent"
    android:layout_marginBottom = "8dp"
    android:layout_marginTop = "8dp"
    xmlns:android = "http://schemas.android.com/apk/res/android">

    <android.support.v7.widget.RecyclerView
        android:id = "@+id/services_recycler_view"
        android:scrollbars = "vertical"
        android:layout_width = "match_parent"
        android:layout_height = "match_parent"/>

</LinearLayout> 

Класс адаптера, вот где я застрял, и код не завершен:

package com.alsowaygh.getitdone.view.services;

import android.support.annotation.NonNull;
import android.support.v7.widget.CardView;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.alsowaygh.getitdone.R;
import com.alsowaygh.getitdone.controller.service.Service;

import java.util.ArrayList;

public class ServiceListAdapter extends RecyclerView.Adapter {


    private ArrayList<Service> mServices;

    public static class ViewHolder extends RecyclerView.ViewHolder{

        public ViewHolder(View itemView) {
            super(itemView);
        }
    }

    public ServiceListAdapter(ArrayList<Service> services){
        mServices = services;
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        // create a new view
        CardView v = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.list_item_service, parent, false);
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {

    }

    @Override
    public int getItemCount() {
        return 0;
    }
}

Макет, включая CardView, который необходимо добавить в RecyclerView

<?xml version = "1.0" encoding = "utf-8"?>
<LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
    xmlns:app = "http://schemas.android.com/apk/res-auto"
    android:orientation = "vertical" android:layout_width = "match_parent"
    android:layout_height = "match_parent">

    <android.support.v7.widget.CardView xmlns:card_view = "http://schemas.android.com/apk/res-auto"
        android:id = "@+id/service_card_view"
        android:layout_width = "match_parent"
        android:layout_height = "140dp"
        android:layout_gravity = "center"
        card_view:cardBackgroundColor = "@color/defaultActivityBackground"
        card_view:cardCornerRadius = "10dp"
        card_view:contentPadding = "5dp">

        <TextView
            android:id = "@+id/title"
            style = "@style/item_list_service_title_text_style"
            android:layout_width = "221dp"
            android:layout_height = "40dp"
            android:layout_gravity = "top"
            android:layout_marginLeft = "10dp"
            android:gravity = "center_vertical"
            android:text = "Service Title" />

        <TextView
            android:id = "@+id/providerName"
            style = "@style/item_list_service_detail_text_style"
            android:layout_width = "221dp"
            android:layout_height = "40dp"
            android:layout_gravity = "center_vertical"
            android:layout_marginLeft = "10dp"
            android:gravity = "center_vertical"
            android:text = "Provider Name" />

        <TextView
            android:id = "@+id/price"
            style = "@style/item_list_service_detail_text_style"
            android:layout_width = "221dp"
            android:layout_height = "38dp"
            android:layout_gravity = "bottom"
            android:layout_marginLeft = "10dp"
            android:gravity = "center_vertical"
            android:text = "Price" />

        <ImageView
            android:id = "@+id/imageView"
            android:layout_width = "141dp"
            android:layout_height = "140dp"
            android:layout_gravity = "right"
            android:tint = "@color/colorAccent"
            android:background = "@android:color/white"
            app:srcCompat = "@drawable/service_image_placeholder" />
    </android.support.v7.widget.CardView>
</LinearLayout>

Я не знаю, как собрать все вместе, чтобы динамически встраивать CardView в RecyclerView

Ваша помощь очень ценится ..

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
1 223
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Позвольте мне начать помогать вам с первыми onCreateViewHolder() и onBindViewHolder()

@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    // create a new view
    View v = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.list_item_service, parent, false);
    return new MyViewHolder(v);
    }

Также,

@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
    MyViewHolder holder1 = (MyViewHolder) holder;
    holder1.titleTextView.setText("...");
    //Set the rest of UI elements the same way
    }

Теперь замените имеющийся у вас класс ViewHolder на MyViewHolder следующим образом

public static class MyViewHolder extends RecyclerView.ViewHolder{

    TextView titleTextView;
    //Create the other UI elements here for use in onBindViewHolder()

    public ViewHolder(View itemView) {
        super(itemView);

        titleTextView = itemView.findViewById(R.id.text_view_title);
        //Initialise other UI elements here
    }
}

Не стесняйтесь спрашивать, не застряли ли вы где-нибудь.

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

Abdullah Alsowaygh 07.06.2018 02:34

Установите высоту recyclerview на wrap_content

Shashwat 07.06.2018 02:41

Если этот ответ вам помог, отметьте его как правильный.

Shashwat 07.06.2018 02:55

Другие вопросы по теме