簡體   English   中英

Android-使用SimpleDateFormat時ListView適配器上出現NullPointerException

[英]Android - NullPointerException on ListView adapter when using SimpleDateFormat

在選項卡(片段)上顯示自定義ListView時遇到麻煩。 如果我只是設置適配器(這是擴展BaseAdapter的一個單獨的類)和從服務器下載的字段,它就可以正常工作。 如果我將應用程序設置為使用自定義的DateFormat類並以dd / MM / aaaa格式格式化從服務器獲取的日期,則會得到與“ childMeasure”相關的NullPointerException(以下錯誤的完整日志)。

IndicatorsListAdapter.java (ListView的適配器)

package android.palharini.myhealth.fragments.tabs.adapters;

import java.util.List;

import android.app.Activity;
import android.content.Context;
import android.palharini.myhealth.R;
import android.palharini.myhealth.date_time.DateFormat;
import android.palharini.myhealth.db.entities.Indicator;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class IndicatorsListAdapter extends BaseAdapter {

    static class ViewHolder {
        public TextView tvMeasure;
        public TextView tvUnit;
        public TextView tvDate;
        public TextView tvTime;
        public int position;
    }

    private  ViewHolder holder;

    private Context context;

    private Indicator indicator;
    private List<Indicator> lsIndicators;

    private DateFormat df;

    public IndicatorsListAdapter(Context context, List<Indicator> lsIndicators) {
        this.context = context;
        this.lsIndicators = lsIndicators;
    }

    @Override
    public int getCount() {
        return lsIndicators.size();
    }

    @Override
    public Object getItem(int id) {
        return lsIndicators.get(id);
    }

    @Override
    public long getItemId(int id) {
        return lsIndicators.get(id).getId();
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        if (convertView == null) {
            LayoutInflater inflater = ((Activity) context).getLayoutInflater();
            convertView = inflater.inflate(R.layout.list_indicators, parent, false);

            holder = new ViewHolder();

            holder.tvMeasure = (TextView) convertView.findViewById(R.id.lvTvMeasure);
            holder.tvUnit = (TextView) convertView.findViewById(R.id.lvTvUnit);
            holder.tvDate = (TextView) convertView.findViewById(R.id.lvTvDate);
            holder.tvTime = (TextView) convertView.findViewById(R.id.lvTvTime);

            convertView.setTag(holder);

        }else{
            holder = (ViewHolder) convertView.getTag();
        }

        indicator = lsIndicators.get(position);

        if (indicator != null) {
            holder.tvMeasure.setText(indicator.getMedida1().toString());
            holder.tvUnit.setText(indicator.getUnidade());

            String stDate = df.getDataAndroid(indicator.getData());

            holder.tvDate.setText(stDate);
            holder.tvTime.setText(indicator.getHora());

        }

        return convertView;
    }

}

WeekTab.java (必須顯示ListView以及AndroidPlot圖形的選項卡)

package android.palharini.myhealth.fragments.tabs;

import java.util.Arrays;
import java.util.List;

import com.androidplot.ui.SizeLayoutType;
import com.androidplot.ui.SizeMetrics;
import com.androidplot.xy.LineAndPointFormatter;
import com.androidplot.xy.PointLabelFormatter;
import com.androidplot.xy.SimpleXYSeries;
import com.androidplot.xy.XYPlot;
import com.androidplot.xy.XYSeries;
import com.androidplot.xy.XYStepMode;

import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.palharini.myhealth.R;
import android.palharini.myhealth.activities.edit.IndicatorEdit;
import android.palharini.myhealth.activities.register.IndicatorRegister;
import android.palharini.myhealth.date_time.DateFormat;
import android.palharini.myhealth.db.dao.IndicatorDAO;
import android.palharini.myhealth.db.entities.Indicator;
import android.palharini.myhealth.fragments.tabs.adapters.IndicatorsListAdapter;
import android.palharini.myhealth.session.SessionManager;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.ListView;

public class WeekTab extends Fragment {

    private static Integer  difData = 7;
    private static String periodo = "DAY";

    private SessionManager sessao;
    private DateFormat ts;

    private IndicatorDAO indDAO;

    private ListView lvIndicadores;
    private Button btCadastrarInd;
    private Integer intTipoIndicador;
    private int x, y=0;

    private String stDataBusca;
    private Double dbMedia, vtMedias1[], vtMedias2[];
    private Integer intIdUsuario, vtDatas[];
    private List<Indicator> lsIndicators;
    private IndicatorsListAdapter adIndicators;

    private XYPlot grafico;
    private XYSeries grafSerie1, grafSerie2;
    private LineAndPointFormatter grafFormat;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        View view = inflater.inflate(R.layout.fragment_tab, container, false);

        sessao = new SessionManager(getActivity());
        ts = new DateFormat();
        indDAO = new IndicatorDAO();

        lvIndicadores = (ListView) view.findViewById(R.id.listViewInd);
        btCadastrarInd = (Button) view.findViewById(R.id.btCadastrarInd);

        grafico = (XYPlot) view.findViewById(R.id.xyPlot);

        grafico.getBackgroundPaint().setColor(Color.WHITE);
        grafico.getGraphWidget().getBackgroundPaint().setColor(Color.WHITE);
        grafico.getGraphWidget().getGridBackgroundPaint().setColor(Color.WHITE);
        grafico.setDomainStep(XYStepMode.INCREMENT_BY_VAL, 1);
        grafico.setPlotMargins(0, 0, 0, 0);
        grafico.setPlotPadding(25, 10, 20, 0);
        grafico.setGridPadding(30, 30, 30, 10);
        grafico.getGraphWidget().setSize(new SizeMetrics(0, SizeLayoutType.FILL, 0, SizeLayoutType.FILL));
        grafico.getLayoutManager().remove(grafico.getLegendWidget());
        grafico.getLayoutManager().remove(grafico.getDomainLabelWidget());
        grafico.getLayoutManager().remove(grafico.getRangeLabelWidget());
        grafico.getLayoutManager().remove(grafico.getTitleWidget());  
        grafico.getLayoutManager().getPaddingPaint().setColor(Color.TRANSPARENT);
        grafico.setTicksPerRangeLabel(5);
        grafico.setTicksPerDomainLabel(1);
        grafico.getGraphWidget().setMarginBottom(15);

        Intent intent = getActivity().getIntent();
        intTipoIndicador = intent.getIntExtra("tipoSelecionado", 0);

        intIdUsuario = sessao.getIdUsuario();
        stDataBusca = ts.getDataAtualBusca();

        vtMedias1 = new Double[difData+1];
        vtMedias2 = new Double[difData+1];

        vtDatas = new Integer[difData+1];

        for (x = difData; x>=0; x--) {
            dbMedia = indDAO.buscarMedia1Periodo(
                    intTipoIndicador, intIdUsuario, periodo, stDataBusca, x);
            if (dbMedia > 0) {
                vtMedias1[x] = dbMedia;
                vtDatas[x] = x;
                y = x;
            }
            else {
                vtMedias1[x] = vtMedias1[y];
                vtDatas[x] = x;

            }
        }

        grafSerie1 = new SimpleXYSeries (Arrays.asList(vtDatas), Arrays.asList(vtMedias1), "Médias");

        grafFormat = new LineAndPointFormatter(
                Color.RED, 
                Color.RED, 
                Color.TRANSPARENT, 
                null);
        grafFormat.setPointLabelFormatter(new PointLabelFormatter());
        grafFormat.configure(getActivity(), R.xml.formato_serie_medias);

        grafico.addSeries(grafSerie1, grafFormat);

        if (intTipoIndicador == 3) {
            for (int x = difData; x>=0; x--) {
                dbMedia = indDAO.buscarMedia2Periodo(
                        intTipoIndicador, intIdUsuario, periodo, stDataBusca, x);
                if (dbMedia > 0) {
                    vtMedias2[x] = dbMedia;
                    vtDatas[x] = x;
                    y = x;
                }
                else {
                    vtMedias2[x] = vtMedias2[y];
                    vtDatas[x] = x;

                }
            }
            grafSerie2 = new SimpleXYSeries (Arrays.asList(vtDatas), Arrays.asList(vtMedias2), "Médias");
            grafico.addSeries(grafSerie2, grafFormat);          
        }

        lsIndicators = indDAO.buscarIndicadoresPeriodoTipo(
                intIdUsuario, intTipoIndicador, periodo, stDataBusca, difData);

        adIndicators = new IndicatorsListAdapter(getActivity(), lsIndicators);

        lvIndicadores.setAdapter(adIndicators);

        lvIndicadores.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> adapter, View view, int position, long arg3) {
                // TODO Auto-generated method stub
                Indicator indicSelecionado = new Indicator();
                indicSelecionado = (Indicator) lvIndicadores.getItemAtPosition(position);
                Intent irTelaEdicaoIndicador = new Intent(getActivity(), IndicatorEdit.class);
                irTelaEdicaoIndicador.putExtra("idIndicador", indicSelecionado.getId());
                startActivity(irTelaEdicaoIndicador);
            }
        });

        btCadastrarInd.setOnClickListener(new Button.OnClickListener () {
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Intent irTelaCadIndicador = new Intent(getActivity(), IndicatorRegister.class);
                irTelaCadIndicador.putExtra("tipoSelecionado", intTipoIndicador);
                startActivity(irTelaCadIndicador);
            }
        });
        return view;
    }

}

Logcat

11-28 13:14:17.177: E/AndroidRuntime(1152): FATAL EXCEPTION: main
11-28 13:14:17.177: E/AndroidRuntime(1152): Process: android.palharini.myhealth, PID: 1152
11-28 13:14:17.177: E/AndroidRuntime(1152): java.lang.NullPointerException
11-28 13:14:17.177: E/AndroidRuntime(1152):     at android.palharini.myhealth.fragments.tabs.adapters.IndicatorsListAdapter.getView(IndicatorsListAdapter.java:81)
11-28 13:14:17.177: E/AndroidRuntime(1152):     at android.widget.AbsListView.obtainView(AbsListView.java:2255)
11-28 13:14:17.177: E/AndroidRuntime(1152):     at android.widget.ListView.measureHeightOfChildren(ListView.java:1263)
11-28 13:14:17.177: E/AndroidRuntime(1152):     at android.widget.ListView.onMeasure(ListView.java:1175)
11-28 13:14:17.177: E/AndroidRuntime(1152):     at android.view.View.measure(View.java:16497)
11-28 13:14:17.177: E/AndroidRuntime(1152):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
11-28 13:14:17.177: E/AndroidRuntime(1152):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
11-28 13:14:17.177: E/AndroidRuntime(1152):     at android.view.View.measure(View.java:16497)
11-28 13:14:17.177: E/AndroidRuntime(1152):     at android.widget.LinearLayout.measureVertical(LinearLayout.java:847)
11-28 13:14:17.177: E/AndroidRuntime(1152):     at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
11-28 13:14:17.177: E/AndroidRuntime(1152):     at android.view.View.measure(View.java:16497)
11-28 13:14:17.177: E/AndroidRuntime(1152):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
11-28 13:14:17.177: E/AndroidRuntime(1152):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
11-28 13:14:17.177: E/AndroidRuntime(1152):     at android.view.View.measure(View.java:16497)
11-28 13:14:17.177: E/AndroidRuntime(1152):     at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1456)
11-28 13:14:17.177: E/AndroidRuntime(1152):     at android.view.View.measure(View.java:16497)
11-28 13:14:17.177: E/AndroidRuntime(1152):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
11-28 13:14:17.177: E/AndroidRuntime(1152):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
11-28 13:14:17.177: E/AndroidRuntime(1152):     at android.view.View.measure(View.java:16497)
11-28 13:14:17.177: E/AndroidRuntime(1152):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
11-28 13:14:17.177: E/AndroidRuntime(1152):     at com.android.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:327)
11-28 13:14:17.177: E/AndroidRuntime(1152):     at android.view.View.measure(View.java:16497)
11-28 13:14:17.177: E/AndroidRuntime(1152):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
11-28 13:14:17.177: E/AndroidRuntime(1152):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
11-28 13:14:17.177: E/AndroidRuntime(1152):     at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2291)
11-28 13:14:17.177: E/AndroidRuntime(1152):     at android.view.View.measure(View.java:16497)
11-28 13:14:17.177: E/AndroidRuntime(1152):     at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1912)
11-28 13:14:17.177: E/AndroidRuntime(1152):     at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1109)
11-28 13:14:17.177: E/AndroidRuntime(1152):     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1291)
11-28 13:14:17.177: E/AndroidRuntime(1152):     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:996)
11-28 13:14:17.177: E/AndroidRuntime(1152):     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5600)
11-28 13:14:17.177: E/AndroidRuntime(1152):     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
11-28 13:14:17.177: E/AndroidRuntime(1152):     at android.view.Choreographer.doCallbacks(Choreographer.java:574)
11-28 13:14:17.177: E/AndroidRuntime(1152):     at android.view.Choreographer.doFrame(Choreographer.java:544)
11-28 13:14:17.177: E/AndroidRuntime(1152):     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
11-28 13:14:17.177: E/AndroidRuntime(1152):     at android.os.Handler.handleCallback(Handler.java:733)
11-28 13:14:17.177: E/AndroidRuntime(1152):     at android.os.Handler.dispatchMessage(Handler.java:95)
11-28 13:14:17.177: E/AndroidRuntime(1152):     at android.os.Looper.loop(Looper.java:136)
11-28 13:14:17.177: E/AndroidRuntime(1152):     at android.app.ActivityThread.main(ActivityThread.java:5001)
11-28 13:14:17.177: E/AndroidRuntime(1152):     at java.lang.reflect.Method.invokeNative(Native Method)
11-28 13:14:17.177: E/AndroidRuntime(1152):     at java.lang.reflect.Method.invoke(Method.java:515)
11-28 13:14:17.177: E/AndroidRuntime(1152):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
11-28 13:14:17.177: E/AndroidRuntime(1152):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
11-28 13:14:17.177: E/AndroidRuntime(1152):     at dalvik.system.NativeStart.main(Native Method)

有人可以幫我嗎? (如果需要其他代碼示例,我將很樂意提供)

提前致謝!

更改

private DateFormat df;

private DateFormat df = new SimpleDateFormat("MM-dd kk:mm:ss");

我看到private DateFormat df; IndicatorsListAdapter -class的頂部,但是在進入getView行81之前,我看不到它會在任何地方初始化它:

String stDate = df.getDataAndroid(indicator.getData());

也許將其更改為:

if(df != null)
    String stDate = df.getDataAndroid(indicator.getData());

或直接在此之前的某個位置設置df ,例如直接在變量處設置:

private final DateFormat df = new SimpleDateFormat("dd-MM-yyyy");
// replace dd-MM-yyyy with your desired Date format

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM