0

I want to make something like Spotify home view with Retrofit but I cannot understand how to do it. please help him I am very confused. please help him these are my XML code look like these. First Is the Main Layout Recyclerview, Second Layout Is Recyclerview RowItem List and another one is innerItem row list. I want to get something like these how to get actual output like Spotify. I want to show these but they give me the same data but I have got different data with different arraylist.. then how to show different data.

enter image description here

enter image description here

enter image description here

Main Recyclerview.xml

            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical">

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


            </RelativeLayout>

RecyclerviewItem.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <android.support.v7.widget.CardView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="@dimen/_10sdp">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:layout_margin="@dimen/_5sdp">

            <TextView
                android:id="@+id/tvCatName"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:padding="@dimen/_10sdp"
                android:text="cat name"/>

            <android.support.v7.widget.RecyclerView
                android:id="@+id/catProductList"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">
            </android.support.v7.widget.RecyclerView>
        </LinearLayout>
    </android.support.v7.widget.CardView>

</LinearLayout>

Inneritem.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical">

    <android.support.v7.widget.CardView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="@dimen/_10sdp">

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <android.support.v7.widget.CardView
                android:layout_width="@dimen/_160sdp"
                android:layout_height="@dimen/_170sdp"
                app:cardPreventCornerOverlap="false">

            <ImageView
                android:id="@+id/imgProduct"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:src="@drawable/ic_bags"/>
            </android.support.v7.widget.CardView>


            <TextView
                android:id="@+id/tvProductName"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Yello New Shirt"
                android:layout_gravity="center"
                android:padding="@dimen/_5sdp"
                android:textStyle="bold"
                android:layout_marginTop="@dimen/_2sdp"
                android:textSize="@dimen/_16ssp"
                android:singleLine="true"/>

            <TextView
                android:id="@+id/tvProductPrice"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="15.00"
                android:layout_gravity="center"
                android:padding="@dimen/_5sdp"
                android:textStyle="bold"
                android:layout_marginTop="@dimen/_2sdp"
                android:textSize="@dimen/_13ssp"
                android:singleLine="true"/>

        </LinearLayout>
    </android.support.v7.widget.CardView>

</LinearLayout>

My Code I don't know What is Problem

Data.java
public class Data {

    String categoryName;
    ArrayList<ProductsModel> productsModels;

    public Data() {
    }

    public Data(String categoryName, ArrayList<ProductsModel> productsModels) {
        this.categoryName = categoryName;
        this.productsModels = productsModels;
    }

    public ArrayList<ProductsModel> getProductsModels() {
        return productsModels;
    }

    public void setProductsModels(ArrayList<ProductsModel> productsModels) {
        this.productsModels = productsModels;
    }

    public String getCategoryName() {
        return categoryName;
    }

    public void setCategoryName(String categoryName) {
        this.categoryName = categoryName;
    }
}

InCategoryProductAdapter.java

public class InCategoryProductAdapter extends RecyclerView.Adapter<InCategoryProductAdapter.ViewHolder> {

    private Context context;
    private ArrayList<Data> dataArrayList;
    private RecyclerView.RecycledViewPool recycledViewPool;

    public InCategoryProductAdapter(Context context, ArrayList<Data> dataArrayList) {
        this.context = context;
        this.dataArrayList = dataArrayList;

        recycledViewPool = new RecyclerView.RecycledViewPool();
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {

        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.main_row_list,viewGroup,false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) {

        viewHolder.tvCatName.setText(dataArrayList.get(i).getCategoryName());
        LinearLayoutManager manager = new LinearLayoutManager(context,LinearLayoutManager.HORIZONTAL,false);
        viewHolder.catProductList.setLayoutManager(manager);

        InnerItemAdapter innerItemAdapter = new InnerItemAdapter(context,dataArrayList.get(i).getProductsModels());
        viewHolder.catProductList.setAdapter(innerItemAdapter);

    }

    @Override
    public int getItemCount() {
        return dataArrayList.size();

    }

    class ViewHolder extends RecyclerView.ViewHolder{

        TextView tvCatName;
        RecyclerView catProductList;

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

            tvCatName = itemView.findViewById(R.id.tvCatName);
            catProductList = itemView.findViewById(R.id.catProductList);
        }
    }
}

Fragment.java

/*set Catgeory  Api if get department ID*/
    private void setCategory(int dept_id) {
        models = new ArrayList<>();
        RetrofitInterface retrofitInterface = RetrfitClient.getRetrofitClient().create(RetrofitInterface.class);
        Call<ArrayList<CategoryModel>> arrayListCall = retrofitInterface.Category_Call(dept_id);
        arrayListCall.enqueue(new Callback<ArrayList<CategoryModel>>() {
            @Override
            public void onResponse(Call<ArrayList<CategoryModel>> call, Response<ArrayList<CategoryModel>> response) {

                models = response.body();
                for (int i = 0; i < models.size(); i++) {
                    catId = models.get(i).getCategory_id();
                    setCategoryProduct(catId, models);
                }
                //Log.d("ModelsSize", "" + models.size());
            }

            @Override
            public void onFailure(Call<ArrayList<CategoryModel>> call, Throwable t) {

                Toast.makeText(getActivity(), t.toString(), Toast.LENGTH_SHORT).show();
            }
        });
    }

    /*get category wise product From Server*/

enter image description here private void setCategoryProduct(int catId, final ArrayList categoryModels, final String catName) {

Log.d("getSingleCat", "" + catId);

productsModels = new ArrayList<>();
RetrofitInterface anInterface = RetrfitClient.getRetrofitClient().create(RetrofitInterface.class);
Call<ProductInCategoryResponse> inCategoryResponseCall = anInterface.IN_CATEGORY_RESPONSE_CALL(catId, 1);
inCategoryResponseCall.enqueue(new Callback<ProductInCategoryResponse>() {
    @Override
    public void onResponse(Call<ProductInCategoryResponse> call, Response<ProductInCategoryResponse> response) {

        productsModels = response.body().getRows();
        Log.d("productCat", "" + productsModels.size());

        data.setCategoryName(catName);
        data.setProductsModels(productsModels);

        dataArrayList = new ArrayList<>();



        HashMap<String,ArrayList<ProductsModel>> listHashMap = new HashMap<String, ArrayList<ProductsModel>>();
        for (int j=0;j<categoryModels.size();j++){
            dataArrayList.add(data);
            listHashMap.put(categoryModels.get(j).getName(), productsModels);
            Log.d("ListMap",""+listHashMap.put(categoryModels.get(j).getName(),productsModels));
        }

        Log.d("CatName",""+catName);

        /*Gson gson  = new Gson();
        String pList = gson.toJson(productsModels);*/


        LinearLayoutManager manager = new LinearLayoutManager(getActivity());
        mainRecyclerView.setLayoutManager(manager);

        InCategoryProductAdapter inCategoryProductAdapter = new InCategoryProductAdapter(getActivity(), dataArrayList);
        mainRecyclerView.setAdapter(inCategoryProductAdapter);

        /*
        Log.d("DataArray", "" + dataArrayList.size());
        Log.d("GetCat", "" + data.getCategoryName());*/
        // Log.d("DataList",""+dataArrayList.get(i).getCategoryName() + " :"+ dataArrayList.get(i).getProductsModels());

    }

    @Override
    public void onFailure(Call<ProductInCategoryResponse> call, Throwable t) {

        Toast.makeText(getActivity(), t.toString(), Toast.LENGTH_SHORT).show();
    }
});

}

axar
  • 539
  • 2
  • 17
  • Take parent `RecyclerView` in your layout, then in **item layout** take another child `RecyclerView`. – Jeel Vankhede Jul 19 '19 at 04:43
  • I have to make one main Recyclerview layout and another one with a text view and recycler view layout make both adapter class but I have two different API how to join us. – axar Jul 19 '19 at 04:49
  • You can wrap your child list of child adapter into parent list. *I.e. Your parent list item model class contains only one string to bind title then take one array list object of your child model class type and then pass it to your child adapter by position.* – Jeel Vankhede Jul 19 '19 at 04:54

4 Answers4

0

SnapHelper

SnapHelper is a helper class that helps in snapping any child view of the RecyclerView. For example, you can snap the firstVisibleItem of the RecyclerView as you must have seen in the play store application that the firstVisibleItem will be always completely visible when scrolling comes to the idle position.

https://blog.mindorks.com/using-snaphelper-in-recyclerview-fc616b6833e8

import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.LinearSnapHelper;
import android.support.v7.widget.OrientationHelper;
import android.support.v7.widget.RecyclerView;
import android.view.View;

/**
 * Created by Mayur patel on 15/01/17.
 */

public class StartSnapHelper extends LinearSnapHelper {

    private OrientationHelper mVerticalHelper, mHorizontalHelper;

    public StartSnapHelper() {

    }

    @Override
    public void attachToRecyclerView(@Nullable RecyclerView recyclerView)
            throws IllegalStateException {
        super.attachToRecyclerView(recyclerView);
    }

    @Override
    public int[] calculateDistanceToFinalSnap(@NonNull RecyclerView.LayoutManager layoutManager,
                                              @NonNull View targetView) {
        int[] out = new int[2];

        if (layoutManager.canScrollHorizontally()) {
            out[0] = distanceToStart(targetView, getHorizontalHelper(layoutManager));
        } else {
            out[0] = 0;
        }

        if (layoutManager.canScrollVertically()) {
            out[1] = distanceToStart(targetView, getVerticalHelper(layoutManager));
        } else {
            out[1] = 0;
        }
        return out;
    }

    @Override
    public View findSnapView(RecyclerView.LayoutManager layoutManager) {

        if (layoutManager instanceof LinearLayoutManager) {

            if (layoutManager.canScrollHorizontally()) {
                return getStartView(layoutManager, getHorizontalHelper(layoutManager));
            } else {
                return getStartView(layoutManager, getVerticalHelper(layoutManager));
            }
        }

        return super.findSnapView(layoutManager);
    }

    private int distanceToStart(View targetView, OrientationHelper helper) {
        return helper.getDecoratedStart(targetView) - helper.getStartAfterPadding();
    }

    private View getStartView(RecyclerView.LayoutManager layoutManager,
                              OrientationHelper helper) {

        if (layoutManager instanceof LinearLayoutManager) {
            int firstChild = ((LinearLayoutManager) layoutManager).findFirstVisibleItemPosition();

            boolean isLastItem = ((LinearLayoutManager) layoutManager)
                    .findLastCompletelyVisibleItemPosition()
                    == layoutManager.getItemCount() - 1;

            if (firstChild == RecyclerView.NO_POSITION || isLastItem) {
                return null;
            }

            View child = layoutManager.findViewByPosition(firstChild);

            if (helper.getDecoratedEnd(child) >= helper.getDecoratedMeasurement(child) / 2
                    && helper.getDecoratedEnd(child) > 0) {
                return child;
            } else {
                if (((LinearLayoutManager) layoutManager).findLastCompletelyVisibleItemPosition()
                        == layoutManager.getItemCount() - 1) {
                    return null;
                } else {
                    return layoutManager.findViewByPosition(firstChild + 1);
                }
            }
        }

        return super.findSnapView(layoutManager);
    }

    private OrientationHelper getVerticalHelper(RecyclerView.LayoutManager layoutManager) {
        if (mVerticalHelper == null) {
            mVerticalHelper = OrientationHelper.createVerticalHelper(layoutManager);
        }
        return mVerticalHelper;
    }

    private OrientationHelper getHorizontalHelper(RecyclerView.LayoutManager layoutManager) {
        if (mHorizontalHelper == null) {
            mHorizontalHelper = OrientationHelper.createHorizontalHelper(layoutManager);
        }
        return mHorizontalHelper;
    }
}

Now, attach this to your RecyclerView.

SnapHelper startSnapHelper = new StartSnapHelper();
startSnapHelper.attachToRecyclerView(yourRecyclerView);
Mayur Patel
  • 2,300
  • 11
  • 30
0

You can create a fragment that contains a header and a horizontal recyclerView and whenever you get the response frome the server add this Fragment in the count of your List somthing like this code:

    for (ViewModel items : model.getViewList()) {
        TextView textView = new TextView(activity);
        textView.setText(items.getTitle());
        textView.setPadding(UnitUtil.dpToPx(16), UnitUtil.dpToPx(4), UnitUtil.dpToPx(16), UnitUtil.dpToPx(4));

        RecyclerView recyclerView = new RecyclerView(activity);
        recyclerView.setLayoutManager(new LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, true));
        recyclerView.setHasFixedSize(true);
        recyclerView.setAdapter(new ContentAdapter(items.getContentList(), (anEnum, position, item, viewId) -> startActivity(new ContentFactory().getActivity(ActivityType.fromId(((ContentSimilarModel) item).getType())
                , activity, item)), false));
        recyclerView.addItemDecoration(new ContentDecoration());
        binding.homeViewLy.addView(textView);
        binding.homeViewLy.addView(recyclerView);
    }
Payam Kokabi
  • 222
  • 1
  • 2
  • 15
0

I'm doing something similar in an app at the moment, but it's early days yet and the way I'm attempting this, is by using a LinearLayout wrapped with a scroll view, within my recycler view. I'm programatically adding to the list and so far it works really well for vertical scrolling. There is a Horizontal scroll view available that I'm yet to try but that should work the same.

sean le roy
  • 571
  • 1
  • 7
  • 19
  • you can use recyclerview View pool easily can create sub item also... Please Visit The Code https://github.com/alghifari/RecycledViewPoolExample – axar Feb 25 '21 at 11:46
-1

Use Nested recyler view and read this, it will tell you to how to implement this

 > https://android.jlelse.eu/easily-adding-nested-recycler-view-in-android-a7e9f7f04047
jins joseph
  • 271
  • 1
  • 11