Below is the code which i am using:
private static final int TYPE_HEADER = 0;
private static final int TYPE_ITEM = 1;
public Context context;
private List<CustomerAndAmount> customerAndAmountList = new ArrayList<>();
private PaymentAndReceiptItemClickListener paymentAndReceiptItemClickListener;
private Map<Long, Double> chartMap;
public PaymentAndReceiptAdapter(final Context context, final List<CustomerAndAmount> customerAndAmountList, final Map<Long, Double> chartMap, final PaymentAndReceiptItemClickListener paymentAndReceiptItemClickListener) {
this.context = context;
setResult(customerAndAmountList, chartMap);
this.paymentAndReceiptItemClickListener = paymentAndReceiptItemClickListener;
}
public void setResult(final List<CustomerAndAmount> customerAndAmountList, final Map<Long, Double> chartMap) {
this.customerAndAmountList.clear();
if (null != customerAndAmountList) {
this.customerAndAmountList.addAll(customerAndAmountList);
}
this.chartMap = chartMap;
notifyDataSetChanged();
}
public List<CustomerAndAmount> getItemResult() {
return this.customerAndAmountList;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int i) {
if (i == TYPE_HEADER) {
final View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.view_barchart, parent, false);
return new PaymentAndReceiptAdapter.HeaderViewHolder(view);
} else if (i == TYPE_ITEM) {
final View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.view_transaction_item, parent, false);
return new CustomerCustomerAndAmountViewHolder(view, customerAndAmountList, paymentAndReceiptItemClickListener);
}
throw new RuntimeException("there is no type that matches the type " + i + " make sure your using types correctly");
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (holder instanceof PaymentAndReceiptAdapter.HeaderViewHolder) {
PaymentAndReceiptAdapter.HeaderViewHolder headerHolder = (PaymentAndReceiptAdapter.HeaderViewHolder) holder;
if (null != chartMap) {
headerHolder.mChart.setVisibility(View.VISIBLE);
headerHolder.setData(context, chartMap);
} else {
headerHolder.mChart.setVisibility(View.GONE);
}
} else if (holder instanceof PaymentAndReceiptAdapter.CustomerCustomerAndAmountViewHolder) {
PaymentAndReceiptAdapter.CustomerCustomerAndAmountViewHolder customerCustomerAndAmountViewHolder = (PaymentAndReceiptAdapter.CustomerCustomerAndAmountViewHolder) holder;
final CustomerAndAmount customerAndAmount = customerAndAmountList.get(position - 1);
customerCustomerAndAmountViewHolder.customerName.setText(customerAndAmount.customerName);
customerCustomerAndAmountViewHolder.customerAndAmountValue.setText(Utils.formatCommaSeperatedNumber(context, customerAndAmount.value));
customerCustomerAndAmountViewHolder.date.setVisibility(View.GONE);
if (position == (customerAndAmountList.size() - 1)) {
customerCustomerAndAmountViewHolder.separator.setVisibility(View.GONE);
} else {
customerCustomerAndAmountViewHolder.separator.setVisibility(View.VISIBLE);
}
}
}
@Override
public int getItemViewType(int position) {
if (isPositionHeader(position)) {
return TYPE_HEADER;
}
return TYPE_ITEM;
}
private boolean isPositionHeader(int position) {
return position == 0;
}
@Override
public int getItemCount() {
int sz = 0;
if (null != customerAndAmountList) {
sz = customerAndAmountList.size();
}
return sz + 1;
}
public interface PaymentAndReceiptItemClickListener {
void onPaymentAndReceiptItemClickListener(final CustomerAndAmount customerAndAmount);
}
protected static class CustomerCustomerAndAmountViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
@BindView(R.id.customer_name)
protected TextView customerName;
@BindView(R.id.transaction_value)
protected TextView customerAndAmountValue;
@BindView(R.id.date)
protected TextView date;
@BindView(R.id.separator)
protected View separator;
private List<CustomerAndAmount> customerAndAmountList;
private PaymentAndReceiptItemClickListener PaymentAndReceiptItemClickListener;
public CustomerCustomerAndAmountViewHolder(final View itemView, final List<CustomerAndAmount> customerAndAmountList, final PaymentAndReceiptItemClickListener PaymentAndReceiptItemClickListener) {
super(itemView);
ButterKnife.bind(this, itemView);
itemView.setOnClickListener(this);
this.customerAndAmountList = customerAndAmountList;
this.PaymentAndReceiptItemClickListener = PaymentAndReceiptItemClickListener;
}
@Override
public void onClick(View view) {
if (Utils.isNotEmpty(customerAndAmountList)) {
final CustomerAndAmount customerAndAmount = customerAndAmountList.get(getLayoutPosition() - 1);
PaymentAndReceiptItemClickListener.onPaymentAndReceiptItemClickListener(customerAndAmount);
}
}
}
public interface BarItemClickListener {
void onBarItemClick(final SearchRequest searchRequest);
}
public static class HeaderViewHolder extends RecyclerView.ViewHolder {
@BindView(R.id.chart)
protected BarChart mChart;
private PaymentAndReceiptAdapter.BarItemClickListener listener;
public HeaderViewHolder(final View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
}
public void setData(final Context context, final Map<Long, Double> chartMap) {
mChart.setMaxVisibleValueCount(60);
mChart.setDrawGridBackground(false);
mChart.setDragEnabled(true);
mChart.getDescription().setEnabled(false);
mChart.setFitBars(true);
mChart.setPinchZoom(false);
mChart.setDoubleTapToZoomEnabled(false);
XAxis xAxis = mChart.getXAxis();
xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
xAxis.setDrawGridLines(false);
xAxis.setGranularity(0.5f);
xAxis.setGranularityEnabled(true);
xAxis.setValueFormatter(new IAxisValueFormatter() {
@Override
public String getFormattedValue(float value, AxisBase axis) {
Float dfloat = value;
long dateInMillis = dfloat.longValue();
return ChartUtils.getMonthYearFromMillis(dateInMillis);
}
});
YAxis leftAxis = mChart.getAxisLeft();
leftAxis.setValueFormatter(new ChartUtils.YAxisValueRsFormatter(context));
leftAxis.setPosition(YAxis.YAxisLabelPosition.OUTSIDE_CHART);
leftAxis.setSpaceTop(15f);
leftAxis.setDrawGridLines(false);
YAxis rightAxis = mChart.getAxisRight();
rightAxis.setEnabled(false);
Legend l = mChart.getLegend();
l.setVerticalAlignment(Legend.LegendVerticalAlignment.BOTTOM);
l.setHorizontalAlignment(Legend.LegendHorizontalAlignment.LEFT);
l.setOrientation(Legend.LegendOrientation.HORIZONTAL);
l.setDrawInside(false);
l.setForm(Legend.LegendForm.SQUARE);
l.setFormSize(9f);
l.setTextSize(11f);
l.setXEntrySpace(4f);
final Map<Long, Double> monthMap = new HashMap<>();
for (Map.Entry<Long, Double> cMap : chartMap.entrySet()) {
long month = ChartUtils.getFirstDateMonthYear(cMap.getKey());
Double amount = monthMap.get(month);
if (null == amount) {
amount = cMap.getValue();
} else {
amount += cMap.getValue();
}
monthMap.put(month, amount);
}
final Map<Long, Double> treeMap = new TreeMap<>(monthMap);
final ArrayList<BarEntry> yVals1 = new ArrayList<>();
for (Map.Entry<Long, Double> cMap : treeMap.entrySet()) {
yVals1.add(new BarEntry(cMap.getKey(), cMap.getValue().floatValue()));
}
final BarDataSet set1;
if (mChart.getData() != null && mChart.getData().getDataSetCount() > 0) {
set1 = (BarDataSet) mChart.getData().getDataSetByIndex(0);
set1.setValues(yVals1);
mChart.getData().notifyDataChanged();
mChart.notifyDataSetChanged();
} else {
set1 = new BarDataSet(yVals1, "Amounts");
set1.setValueTextColor(context.getResources().getColor(R.color.dark_gray_primary));
set1.setColor(context.getResources().getColor(R.color.colorPrimaryLight));
set1.setHighLightColor(context.getResources().getColor(R.color.colorPrimaryLight));
set1.setDrawValues(false);
ArrayList<IBarDataSet> dataSets = new ArrayList<>();
dataSets.add(set1);
BarData data = new BarData(dataSets);
data.setValueTextSize(10f);
if (monthMap.size() >= 4) {
data.setBarWidth(2000000000f);
} else {
data.setBarWidth(2500000000f);
}
mChart.setData(data);
}
final CustomBarChartMarkerView mv = new CustomBarChartMarkerView(context, R.layout.view_custom_marker);
mChart.setMarker(mv);
mChart.setHighlightFullBarEnabled(true);
if (monthMap.size() > 1) {
if (monthMap.size() >= 4) {
xAxis.setLabelCount(4);
} else {
xAxis.setLabelCount(monthMap.size());
}
mChart.setVisibility(View.VISIBLE);
} else {
mChart.setVisibility(View.GONE);
}
}
}
The crash log report:
Fatal Exception: java.lang.RuntimeException: there is no type that matches the type 7 make sure your using types correctly at in.bizanalyst.adapter.PaymentAndReceiptAdapter.onCreateViewHolder(PaymentAndReceiptAdapter.java:79) at android.support.v7.widget.RecyclerView$Adapter.createViewHolder(RecyclerView.java:6685) at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5869) at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5752) at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5748) at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2232) at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1559) at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1519) at android.support.v7.widget.LinearLayoutManager.scrollBy(LinearLayoutManager.java:1333) at android.support.v7.widget.LinearLayoutManager.scrollVerticallyBy(LinearLayoutManager.java:1077) at android.support.v7.widget.RecyclerView.scrollByInternal(RecyclerView.java:1815) at android.support.v7.widget.RecyclerView.onTouchEvent(RecyclerView.java:3076) at android.view.View.dispatchTouchEvent(View.java:12534) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3153) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2829) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3159) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2844) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3159) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2844) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3159) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2844) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3159) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2844) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3159) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2844) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3159) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2844) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3159) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2844) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3159) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2844) at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:600) at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1871) at android.app.Activity.dispatchTouchEvent(Activity.java:3384) at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:68) at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:68) at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:562) at android.view.View.dispatchPointerEvent(View.java:12782) at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:5662) at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:5457) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4950) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5003) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4969) at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:5106) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4977) at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:5163) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4950) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5003) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4969) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4977) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4950) at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:7719) at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:7659) at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:7620) at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:7830) at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185) at android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(InputEventReceiver.java) at android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:176) at android.view.ViewRootImpl.doConsumeBatchedInput(ViewRootImpl.java:7793) at android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run(ViewRootImpl.java:7857) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:911) at android.view.Choreographer.doCallbacks(Choreographer.java:723) at android.view.Choreographer.doFrame(Choreographer.java:652) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:897) at android.os.Handler.handleCallback(Handler.java:789) at android.os.Handler.dispatchMessage(Handler.java:98) at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:6938) at java.lang.reflect.Method.invoke(Method.java) at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
from RecyclerView adapter getItemViewType method sometimes returns 2, 8, etc etc instead of 0 or 1
No comments:
Post a Comment