我的一个RecyclerView有点问题。 实际上,它在每个项目中都包含另一个RecyclerView,当我尝试在我的全局RecyclerView(侦听器onClick on行)上使用LinearLayoutManager滚动时,第一个和最后一个项目的第二个RecyclerView项目之间出现一个空白区域
A screen of the problem (sorry for my crappy english).
我的第一个RecyclerView适配器:
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) {
}
}
我的内部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;
}
}
我的函数定义了Protocole RecyclerView和滚动行:
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);
}
}
});
}
提前致谢:)