1

I have a little problem with one of my RecyclerView. In fact, it contains another RecyclerView in each of his items, and when I tried to scroll using LinearLayoutManager on my global RecyclerView (listener onClick on row), a blank space appears between second RecyclerView's item of the first and last item.

A screen of the problem (sorry for my crappy english).

My first RecyclerView adapter :

 package com.ylly.hypred.process.adapter; /** * Created by YLLY on 24/06/2015. */ import android.content.Context; import android.support.v7.widget.RecyclerView; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.Toast; import com.ylly.hypred.R; import com.ylly.hypred.custom.HypredToast; import com.ylly.hypred.custom.MyTextView; import com.ylly.hypred.custom.RecyclerItemClickListener; import com.ylly.hypred.dao.Etape; import com.ylly.hypred.dao.Produit; import com.ylly.hypred.dao.Protocole; import com.ylly.hypred.db.HypredDbManager; import com.ylly.hypred.process.atelierProcess.AtelierProcessModeleUn; import com.ylly.hypred.process.recyclerView.SpacesItemDecoration; import org.solovyev.android.views.llm.LinearLayoutManager; import java.util.ArrayList; import java.util.List; public class AdapterProtocole extends RecyclerView.Adapter<AdapterProtocole.ViewHolder> implements AdapterEtape.clickOnProductListener { private ArrayList<Protocole> protocoleArrayList; private Context context; private clickOnProductListener mCallback; public AdapterProtocole(ArrayList<Protocole> protocoleArrayList, Context context) { this.protocoleArrayList = protocoleArrayList; this.context = context; } public interface clickOnProductListener { void appelProduit(long productId); void ajouterAllProduit(ArrayList<Produit> produitArrayList); void ajouterProduit(Produit produit); } // Create new views (invoked by the layout manager) @Override public AdapterProtocole.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { // create a new view View itemLayoutView = LayoutInflater.from(parent.getContext()) .inflate(R.layout.item_layout_process_protocole, null); // create ViewHolder ViewHolder viewHolder = new ViewHolder(itemLayoutView); return viewHolder; } // Replace the contents of a view (invoked by the layout manager) @Override public void onBindViewHolder(ViewHolder viewHolder, int position) { // - get data from your itemsData at this position // - replace the contents of the view with that itemsData View view = new View(context); viewHolder.labelProtocoleTextView.setText(protocoleArrayList.get(position).getName()); viewHolder.produitsRecyclerView.addItemDecoration(new SpacesItemDecoration(0, 0, 0, 10)); viewHolder.produitsRecyclerView.setLayoutManager(new LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)); final ArrayList<Etape> fEtapeArrayList = new ArrayList<>(); Log.d("AdapterProtocole", "id des étapes du protocole " + protocoleArrayList.get(position).getName() + " = " + protocoleArrayList.get(position).getEtapeId() + "," + protocoleArrayList.get(position).getEtapeTwoId() + "," + protocoleArrayList.get(position).getEtapeThreeId() + "," + protocoleArrayList.get(position).getEtapeFourId() + "," + protocoleArrayList.get(position).getEtapeFiveId() + "," + protocoleArrayList.get(position).getEtapeSixId() + "."); String test = "listes etapes dispo :"; List<Etape> etapes = HypredDbManager.getDbManager().getEtapeDbManager().getAllEtape(); for(int i=0; i<etapes.size(); i++) { test += etapes.get(i).getId() + ","; } Log.d("AdapterProtocole", test); if (HypredDbManager.getDbManager().getEtapeDbManager() .getEtapeById(protocoleArrayList.get(position).getEtapeId()) != null) { fEtapeArrayList.add(HypredDbManager.getDbManager().getEtapeDbManager() .getEtapeById(protocoleArrayList.get(position).getEtapeId())); } if (HypredDbManager.getDbManager().getEtapeDbManager() .getEtapeById(protocoleArrayList.get(position).getEtapeTwoId()) != null) { fEtapeArrayList.add(HypredDbManager.getDbManager().getEtapeDbManager() .getEtapeById(protocoleArrayList.get(position).getEtapeTwoId())); } if (HypredDbManager.getDbManager().getEtapeDbManager() .getEtapeById(protocoleArrayList.get(position).getEtapeThreeId()) != null) { fEtapeArrayList.add(HypredDbManager.getDbManager().getEtapeDbManager() .getEtapeById(protocoleArrayList.get(position).getEtapeThreeId())); } if (HypredDbManager.getDbManager().getEtapeDbManager() .getEtapeById(protocoleArrayList.get(position).getEtapeFourId()) != null) { fEtapeArrayList.add(HypredDbManager.getDbManager().getEtapeDbManager() .getEtapeById(protocoleArrayList.get(position).getEtapeFourId())); } if (HypredDbManager.getDbManager().getEtapeDbManager() .getEtapeById(protocoleArrayList.get(position).getEtapeFiveId()) != null) { fEtapeArrayList.add(HypredDbManager.getDbManager().getEtapeDbManager() .getEtapeById(protocoleArrayList.get(position).getEtapeFiveId())); } if (HypredDbManager.getDbManager().getEtapeDbManager() .getEtapeById(protocoleArrayList.get(position).getEtapeSixId()) != null) { fEtapeArrayList.add(HypredDbManager.getDbManager().getEtapeDbManager() .getEtapeById(protocoleArrayList.get(position).getEtapeSixId())); } Log.d("AdapterProtocole", Integer.toString(fEtapeArrayList.size())); final AdapterEtape etapeAdapter = new AdapterEtape(fEtapeArrayList, view.getContext()); etapeAdapter.setClickOnProductListener(new AdapterEtape.clickOnProductListener() { @Override public void appelerProduit(long produitId) { mCallback.appelProduit(produitId); } @Override public void ajouterProduitSelection(Produit produit) { mCallback.ajouterProduit(produit); } }); viewHolder.produitsRecyclerView.setAdapter(etapeAdapter); viewHolder.imageViewPanierSelectionAll.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ArrayList<Produit> produits = new ArrayList<>(); for (int i = 0; i < fEtapeArrayList.size(); i++) { produits.add((fEtapeArrayList.get(i).getProduit())); } mCallback.ajouterAllProduit(produits); HypredToast.makeText(context, "Produits ajoutés au panier avec succès.", Toast.LENGTH_SHORT).show(); } }); } // inner class to hold a reference to each item of RecyclerView public static class ViewHolder extends RecyclerView.ViewHolder { public MyTextView labelProtocoleTextView; public RecyclerView produitsRecyclerView; public ImageView imageViewPanierSelectionAll; public ViewHolder(View itemLayoutView) { super(itemLayoutView); labelProtocoleTextView = (MyTextView) itemLayoutView.findViewById(R.id.item_layout_protocole_label_text_view); produitsRecyclerView = (RecyclerView) itemLayoutView.findViewById(R.id.item_layout_protocole_recycler_view); imageViewPanierSelectionAll = (ImageView) itemLayoutView.findViewById(R.id.item_layout_process_protocole_panier_rouge); } } // Return the size of your itemsData (invoked by the layout manager) @Override public int getItemCount() { return protocoleArrayList.size(); } @Override public void appelerProduit(long produitId) { } public void setClickOnProductListener(clickOnProductListener callback) { mCallback = callback; } @Override public void ajouterProduitSelection(Produit produit) { } } 

My inside RecyclerView :

 package com.ylly.hypred.process.adapter; /** * Created by YLLY on 20/07/2015. */ import android.content.Context; import android.graphics.Paint; import android.support.v4.content.ContextCompat; import android.support.v7.widget.RecyclerView; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.Toast; import com.ylly.hypred.R; import com.ylly.hypred.custom.HypredToast; import com.ylly.hypred.custom.MyTextView; import com.ylly.hypred.dao.Etape; import com.ylly.hypred.dao.Produit; import com.ylly.hypred.db.HypredDbManager; import com.ylly.hypred.process.atelierProcess.AtelierProcessModeleUn; import java.util.ArrayList; public class AdapterEtape extends RecyclerView.Adapter<AdapterEtape.ViewHolder> { private ArrayList<Etape> etapeArrayList; private Context context; private clickOnProductListener mCallback; public interface clickOnProductListener { void appelerProduit(long produitId); void ajouterProduitSelection(Produit produit); } public AdapterEtape(ArrayList<Etape> etapeArrayList, Context context) { this.etapeArrayList = etapeArrayList; this.context = context; } // Create new views (invoked by the layout manager) @Override public AdapterEtape.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { // create a new view View itemLayoutView = LayoutInflater.from(parent.getContext()) .inflate(R.layout.item_layout_process_etape, null); // create ViewHolder ViewHolder viewHolder = new ViewHolder(itemLayoutView); return viewHolder; } // Replace the contents of a view (invoked by the layout manager) @Override public void onBindViewHolder(final ViewHolder viewHolder, final int position) { // - get data from your itemsData at this position // - replace the contents of the view with that itemsData viewHolder.labelEtapeTextView.setText(etapeArrayList.get(position).getTexte_etape()); if(HypredDbManager.getDbManager().getProductDbManager(). getProduitById(etapeArrayList.get(position).getProduitId())!=null) { viewHolder.labelProduitTextView .setText(HypredDbManager.getDbManager().getProductDbManager(). getProduitById(etapeArrayList.get(position).getProduitId()).getNom_produit()); } viewHolder.labelProduitTextView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mCallback.appelerProduit(etapeArrayList.get(position).getProduitId()); } }); viewHolder.descriptifTextView.setText(etapeArrayList.get(position).getTemps() + "/" + etapeArrayList.get(position).getConcentration() + "/" + etapeArrayList.get(position).getTemperature()); int temp = 1 + position; if (etapeArrayList.size() == temp && etapeArrayList.get(position).getRincage()) { viewHolder.imageViewEtapeSuivante.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.hypred_protocole_vague_finale)); } else if(etapeArrayList.get(position).getRincage()) { viewHolder.imageViewEtapeSuivante.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.hypred_protocole_vague)); } viewHolder.imageViewPanierSelection.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mCallback.ajouterProduitSelection(etapeArrayList.get(position).getProduit()); HypredToast.makeText(context, "Produit ajouté au panier avec succès.", Toast.LENGTH_SHORT).show(); } }); } // inner class to hold a reference to each item of RecyclerView public static class ViewHolder extends RecyclerView.ViewHolder { public MyTextView labelEtapeTextView; public MyTextView labelProduitTextView; public MyTextView descriptifTextView; public ImageView imageViewEtapeSuivante; public ImageView imageViewPanierSelection; public ViewHolder(View itemLayoutView) { super(itemLayoutView); labelEtapeTextView = (MyTextView) itemLayoutView.findViewById(R.id.item_layout_etape_label_etape_text_view); labelProduitTextView = (MyTextView) itemLayoutView.findViewById(R.id.item_layout_etape_label_produit_text_view); descriptifTextView = (MyTextView) itemLayoutView.findViewById(R.id.item_layout_etape_descriptif_text_view); labelProduitTextView.setPaintFlags(labelProduitTextView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG); imageViewEtapeSuivante = (ImageView) itemLayoutView.findViewById(R.id.item_layout_etape_vague_image_view); imageViewPanierSelection = (ImageView) itemLayoutView.findViewById(R.id.item_layout_etape_panier_image_view); } } public Etape getEtape(int position) { Etape etape = etapeArrayList.get(position); return etape; } // Return the size of your itemsData (invoked by the layout manager) @Override public int getItemCount() { return etapeArrayList.size(); } public void setClickOnProductListener(clickOnProductListener callback) { mCallback = callback; } } 

My function which define the Protocole RecyclerView and the rows for scrolling :

public void initProtocole(View v, final FragmentProtocoles protocoleFragment, ArrayList<Protocole> protocoleArrayList) { super.initProtocole(v, protocoleFragment, protocoleArrayList); initFrameLayout(v, R.id.fragment_protocole_container, R.layout.view_process_protocole_rep); ArrayList<Protocole> fProtocoleArrayList = new ArrayList<>(); for (int i = 0; i < protocoleArrayList.size(); i++) { fProtocoleArrayList.add(protocoleArrayList.get(i)); } final RecyclerView recyclerView = (RecyclerView) v.findViewById(R.id.protocole_rep_recycler_view); recyclerView.addItemDecoration(new SpacesItemDecoration(25, 25, 25, 25)); final LinearLayoutManager mLayoutManager = new LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false); recyclerView.setLayoutManager(mLayoutManager); AdapterProtocole adapterProtocole = new AdapterProtocole(fProtocoleArrayList, v.getContext()); adapterProtocole.setClickOnProductListener(new AdapterProtocole.clickOnProductListener() { @Override public void appelProduit(long productId) { protocoleFragment.appelProduit(HypredDbManager.getDbManager().getProductDbManager().getProduitById(productId)); } @Override public void ajouterAllProduit(ArrayList<Produit> produitArrayList) { for (int i = 0; i < produitArrayList.size(); i++) { SelectionManager.getInstance().addProductToSelection(produitArrayList.get(i)); } } @Override public void ajouterProduit(Produit produit) { SelectionManager.getInstance().addProductToSelection(produit); } }); recyclerView.setAdapter(adapterProtocole); ImageView imageViewProtocoleFlecheGauche = (ImageView) v.findViewById(R.id.protocole_rep_fleche_gauche); imageViewProtocoleFlecheGauche.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { RecyclerViewPositionHelper recyclerViewPositionHelper = RecyclerViewPositionHelper.createHelper(recyclerView); int firstVisibleItem = recyclerViewPositionHelper.findFirstCompletelyVisibleItemPosition(); if (firstVisibleItem != 0) { mLayoutManager.scrollToPositionWithOffset(firstVisibleItem - 1, 0); } } }); ImageView imageViewProtocoleFlecheDroite = (ImageView) v.findViewById(R.id.protocole_rep_fleche_droite); imageViewProtocoleFlecheDroite.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { RecyclerViewPositionHelper recyclerViewPositionHelper = RecyclerViewPositionHelper.createHelper(recyclerView); int lastVisibleItem = recyclerViewPositionHelper.findLastCompletelyVisibleItemPosition(); int firstVisibleItem = recyclerViewPositionHelper.findFirstCompletelyVisibleItemPosition(); if (lastVisibleItem != recyclerViewPositionHelper.getItemCount() - 1) { mLayoutManager.scrollToPositionWithOffset(firstVisibleItem + 1, 0); } } }); } 

Thanks in advance :)

1 Answer 1

1

I also face the same problem, you need to change your RecyclerView adapter::

Now it is like this in your code::

 // Create new views (invoked by the layout manager) @Override public AdapterEtape.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { // create a new view View itemLayoutView = LayoutInflater.from(parent.getContext()) .inflate(R.layout.item_layout_process_etape, null); // create ViewHolder ViewHolder viewHolder = new ViewHolder(itemLayoutView); return viewHolder; } 

You need to change like this::

 // Create new views (invoked by the layout manager) @Override public AdapterEtape.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { // create a new view View itemLayoutView = LayoutInflater.from(parent.getContext()) .inflate(R.layout.item_layout_process_etape, parent, false); // create ViewHolder ViewHolder viewHolder = new ViewHolder(itemLayoutView); return viewHolder; } 
Sign up to request clarification or add additional context in comments.

3 Comments

Thanks for your fast reply, I tried your code but the same problem appears :(
Oops !! Sorry to hear that :( Let me check
I don't really understand why it only affect the first and last item of the RecyclerView. And I don't apply an itemdecoration on my Etape's item for spacing so...

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.