I have implemented the nested recyclerview inside the list.how to fetch data from the inner recyclerview in the main class or doing calculation of the int value provided for the inner recyclerview.
1.Heterogeneous Recyclerview with multiple views.
package com.myvestige.vestigedeal.adapter.bundle;
import android.content.Context;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.text.InputFilter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import com.myvestige.vestigedeal.R;
import com.myvestige.vestigedeal.adapter.DailyDealAdapterPagination;
import com.myvestige.vestigedeal.helper.Logger;
import com.myvestige.vestigedeal.interfaces.CanChangeQty;
import com.myvestige.vestigedeal.interfaces.ClickListenerView;
import com.myvestige.vestigedeal.model.bundle.BundleOptionDatum;
import com.myvestige.vestigedeal.model.bundle.BundleOptionValue;
import com.myvestige.vestigedeal.utility.NothingSelectedSpinnerAdapter;
import com.myvestige.vestigedeal.utils.InputFilterMinMax;
import java.util.List;
public class AdapterBundleMain extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements CanChangeQty {
Context mContext;
List<BundleOptionDatum> bundleOptionData;
public static final int VIEW_TYPE_RADIO = 0;
public static final int VIEW_TYPE_CHECKBOX = 1;
public static final int VIEW_TYPE_SELECT = 2;
RecyclerView.ViewHolder viewHolder;
public static final int VIEW_TYPE_MULTI_SELECT = 3;
SpinnerAdapter spinnerAdapter;
AdapterBundleInner adapterBundleInner;
AdapterBundleInnerCheckBox adapterBundleInnerCheckBox1;
AdapterBundleInnerCheckBox adapterBundleInnerCheckBox;
ClickListenerView clickListenerView;
NothingSelectedSpinnerAdapter nothingSelectedSpinnerAdapter;
public AdapterBundleMain(Context mContext, List<BundleOptionDatum> bundleOptionData) {
this.mContext = mContext;
this.bundleOptionData = bundleOptionData;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
switch (viewType) {
case VIEW_TYPE_RADIO:
View view1 = LayoutInflater.from(parent.getContext()).inflate(R.layout.bundle_item_row, parent, false);
return new RadioViewHolder(view1);
case VIEW_TYPE_CHECKBOX:
View view2 = LayoutInflater.from(parent.getContext()).inflate(R.layout.bundle_item_row_check_main, parent, false);
return new CheckViewHolder(view2);
case VIEW_TYPE_SELECT:
View view3 = LayoutInflater.from(parent.getContext()).inflate(R.layout.bundle_item_spinner, parent, false);
return new SelectViewHolder(view3);
case VIEW_TYPE_MULTI_SELECT:
View view4 = LayoutInflater.from(parent.getContext()).inflate(R.layout.bundle_item_row_check_main, parent, false);
return new MultiSelectViewHolder(view4);
}
return null;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
final BundleOptionDatum bundleOptionDatum = bundleOptionData.get(position);
switch (holder.getItemViewType()) {
case VIEW_TYPE_RADIO:
RadioViewHolder radioViewHolder = (RadioViewHolder) holder;
radioViewHolder.mainTitle.setText(bundleOptionDatum.getTitle() + "");
radioViewHolder.innerRecycler.setHasFixedSize(true);
radioViewHolder.innerRecycler.setNestedScrollingEnabled(false);
radioViewHolder.innerRecycler.setLayoutManager(new LinearLayoutManager(mContext, LinearLayoutManager.VERTICAL, false));
adapterBundleInner = new AdapterBundleInner(mContext, bundleOptionDatum.getBundleOptionValues(), this);
radioViewHolder.innerRecycler.setAdapter(adapterBundleInner);
adapterBundleInner.notifyDataSetChanged();
break;
case VIEW_TYPE_CHECKBOX:
CheckViewHolder checkViewHolder = (CheckViewHolder) holder;
checkViewHolder.checkText.setText(bundleOptionDatum.getTitle() + "");
checkViewHolder.QTY.setText("Qty");
checkViewHolder.checkRecycler.setHasFixedSize(true);
checkViewHolder.checkRecycler.setNestedScrollingEnabled(false);
checkViewHolder.checkRecycler.setLayoutManager(new LinearLayoutManager(mContext, LinearLayoutManager.VERTICAL, false));
adapterBundleInnerCheckBox = new AdapterBundleInnerCheckBox(mContext, bundleOptionDatum.getBundleOptionValues(), this);
checkViewHolder.checkRecycler.setAdapter(adapterBundleInnerCheckBox);
adapterBundleInnerCheckBox.notifyDataSetChanged();
break;
case VIEW_TYPE_SELECT:
int mCheckedPos = -1;
final SelectViewHolder selectViewHolder = (SelectViewHolder) holder;
selectViewHolder.spinnerText.setText(bundleOptionDatum.getTitle() + "");
for (int a = 0; a < bundleOptionDatum.getBundleOptionValues().size(); a++) {
if (bundleOptionDatum.getBundleOptionValues().get(a).getIsDefault().equalsIgnoreCase("1")) {
mCheckedPos = a;
}
}
spinnerAdapter = new SpinnerAdapter(mContext, bundleOptionDatum.getBundleOptionValues(), this, clickListenerView);
spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
nothingSelectedSpinnerAdapter = new NothingSelectedSpinnerAdapter(spinnerAdapter, R.layout.view_normal_spinner, mContext);
selectViewHolder.spinnerView.setAdapter(nothingSelectedSpinnerAdapter);
selectViewHolder.spinnerView.setSelection(mCheckedPos);
selectViewHolder.spinnerView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
boolean isManual = false;
@Override
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
if (!isManual) {
isManual = true;
return;
}
BundleOptionValue bundleOptionValue = spinnerAdapter.getItem(pos);
selectViewHolder.qtyValue.setEnabled(true);
Logger.error("BundleValues", bundleOptionValue.getSelectionQty() + bundleOptionValue.getName());
selectViewHolder.qtyValue.setText(bundleOptionValue.getInventoryQty());
selectViewHolder.qtyValue.setFilters(new InputFilter[]{new InputFilterMinMax(bundleOptionValue.getSelectionQty(), bundleOptionValue.getInventoryQty(), mContext)});
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
break;
case VIEW_TYPE_MULTI_SELECT:
MultiSelectViewHolder multiSelectViewHolder = (MultiSelectViewHolder) holder;
multiSelectViewHolder.checkText.setText(bundleOptionDatum.getTitle() + "");
multiSelectViewHolder.QTY.setText("Qty");
multiSelectViewHolder.checkRecycler.setHasFixedSize(true);
multiSelectViewHolder.checkRecycler.setNestedScrollingEnabled(false);
multiSelectViewHolder.checkRecycler.setLayoutManager(new LinearLayoutManager(mContext, LinearLayoutManager.VERTICAL, false));
adapterBundleInnerCheckBox1 = new AdapterBundleInnerCheckBox(mContext, bundleOptionDatum.getBundleOptionValues(), this);
multiSelectViewHolder.checkRecycler.setAdapter(adapterBundleInnerCheckBox1);
adapterBundleInnerCheckBox1.notifyDataSetChanged();
break;
}
viewHolder = holder;
}
@Override
public int getItemViewType(int position) {
switch (bundleOptionData.get(position).getType()) {
case "radio":
return VIEW_TYPE_RADIO;
case "checkbox":
return VIEW_TYPE_CHECKBOX;
case "select":
return VIEW_TYPE_SELECT;
case "multi":
return VIEW_TYPE_MULTI_SELECT;
default:
return -1;
}
}
@Override
public int getItemCount() {
return bundleOptionData.size();
}
@Override
public void isChanged(boolean value) {
if (value) {
if (viewHolder instanceof CheckViewHolder) {
((CheckViewHolder) viewHolder).QTY.setVisibility(View.VISIBLE);
} else if (viewHolder instanceof RadioViewHolder) {
((RadioViewHolder) viewHolder).QTY.setVisibility(View.VISIBLE);
} else if (viewHolder instanceof SelectViewHolder) {
((SelectViewHolder) viewHolder).QTY.setVisibility(View.VISIBLE);
((SelectViewHolder) viewHolder).qtyValue.setVisibility(View.VISIBLE);
}
} else {
if (viewHolder instanceof CheckViewHolder) {
((CheckViewHolder) viewHolder).QTY.setVisibility(View.GONE);
} else if (viewHolder instanceof RadioViewHolder) {
((RadioViewHolder) viewHolder).QTY.setVisibility(View.GONE);
} else if (viewHolder instanceof SelectViewHolder) {
((SelectViewHolder) viewHolder).QTY.setVisibility(View.GONE);
((SelectViewHolder) viewHolder).qtyValue.setVisibility(View.GONE);
}
}
}
private class RadioViewHolder extends RecyclerView.ViewHolder {
RecyclerView innerRecycler;
TextView mainTitle, QTY;
public RadioViewHolder(View view) {
super(view);
mainTitle = itemView.findViewById(R.id.mainTitle);
innerRecycler = itemView.findViewById(R.id.innerRecycler);
QTY = itemView.findViewById(R.id.QTY);
}
}
private class CheckViewHolder extends RecyclerView.ViewHolder {
TextView checkText, QTY;
RecyclerView checkRecycler;
public CheckViewHolder(View view) {
super(view);
checkText = itemView.findViewById(R.id.checkText);
QTY = itemView.findViewById(R.id.QTY);
checkRecycler = itemView.findViewById(R.id.checkRecycler);
}
}
private class SelectViewHolder extends RecyclerView.ViewHolder {
Spinner spinnerView;
TextView spinnerText, QTY;
EditText qtyValue;
public SelectViewHolder(View view) {
super(view);
spinnerText = itemView.findViewById(R.id.spinnerText);
spinnerView = itemView.findViewById(R.id.spinnerView);
QTY = itemView.findViewById(R.id.QTY);
qtyValue = itemView.findViewById(R.id.qtyValue);
}
}
private class MultiSelectViewHolder extends RecyclerView.ViewHolder {
TextView checkText, QTY;
RecyclerView checkRecycler;
public MultiSelectViewHolder(View view) {
super(view);
checkText = itemView.findViewById(R.id.checkText);
QTY = itemView.findViewById(R.id.QTY);
checkRecycler = itemView.findViewById(R.id.checkRecycler);
}
}
}
2.Heterogeneous Recyclerview inner recycler adapter
public class AdapterBundleInner extends RecyclerView.Adapter<AdapterBundleInner.ViewHolderRadio> {
Context mContext;
String type;
Integer mCheckedPostion;
ArrayList<BundleOptionValue> bundleOptionValues;
CanChangeQty canChangeQty;
boolean canChanges = false;
public AdapterBundleInner(Context mContext, ArrayList<BundleOptionValue> bundleOptionValues, CanChangeQty canChangeQty) {
this.mContext = mContext;
this.bundleOptionValues = bundleOptionValues;
this.canChangeQty = canChangeQty;
for (int a = 0; a < bundleOptionValues.size(); a++) {
if (bundleOptionValues.get(a).getIsDefault().equalsIgnoreCase("1")) {
mCheckedPostion = a;
}
}
}
@Override
public AdapterBundleInner.ViewHolderRadio onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
View v1 = inflater.inflate(R.layout.bundle_item_row_radio, parent, false);
ViewHolderRadio viewHolder = new ViewHolderRadio(v1);
return viewHolder;
}
@Override
public void onBindViewHolder(final AdapterBundleInner.ViewHolderRadio viewHolder, final int position) {
final BundleOptionValue bundleOptionValue = bundleOptionValues.get(position);
viewHolder.innerTitle.setText(bundleOptionValue.getName());
viewHolder.radioButton.setChecked(position == mCheckedPostion);
viewHolder.radioButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (position == mCheckedPostion) {
} else {
mCheckedPostion = position;
viewHolder.radioButton.setChecked(position == mCheckedPostion);
notifyDataSetChanged();
}
}
});
if (bundleOptionValue.getSelectionCanChangeQty().equalsIgnoreCase("1")) {
viewHolder.qtyValue.setVisibility(View.VISIBLE);
viewHolder.qtyValue.setText(bundleOptionValue.getSelectionQty());
viewHolder.qtyValue.setFilters(new InputFilter[]{new InputFilterMinMax(bundleOptionValue.getSelectionQty(), bundleOptionValue.getInventoryQty(), mContext)});
} else {
viewHolder.qtyValue.setVisibility(View.GONE);
}
if (isCanChangeQTY()) {
canChangeQty.isChanged(true);
} else {
canChangeQty.isChanged(false);
}
}
public boolean isCanChangeQTY() {
for (BundleOptionValue item : bundleOptionValues) {
if (item.getSelectionCanChangeQty().equalsIgnoreCase("1")) {
canChanges = true;
break;
}
}
return canChanges;
}
@Override
public int getItemCount() {
return bundleOptionValues.size();
}
public class ViewHolderRadio extends RecyclerView.ViewHolder {
TextView innerTitle;
RadioButton radioButton;
EditText qtyValue;
public ViewHolderRadio(View view) {
super(view);
innerTitle = view.findViewById(R.id.innerTitle);
radioButton = view.findViewById(R.id.radioButton);
qtyValue = view.findViewById(R.id.qtyValue);
}
}
}
how to fetch value of the inner recyclerview inside the class in which main recyclerview is inflated.