I'm having trouble when displaying a custom ListView on a tab (fragment). If I just set the adapter (which is a separate class that extends BaseAdapter) and the fields downloaded from the server, it works just fine. If I set the application to use my custom DateFormat class and format the date taken from the server in dd/MM/aaaa, I get a NullPointerException related to "childMeasure" (full logcat of the error below).
IndicatorsListAdapter.java (the adapter for the 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 (a tab which has to display the ListView, along with an AndroidPlot graph)
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)
Can someone help me on this? (if additional code samples are needed, I'll be glad to provide)
Thanks in advance!
change
private DateFormat df;
to
private DateFormat df = new SimpleDateFormat("MM-dd kk:mm:ss");