Monday, 8 October 2018

RecyclerView adapter getItemViewType method sometimes returns 2, 8, etc etc instead of 0 or 1

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