Search code examples
androidhashmapadapterbaseadapter

Baseadapter with nested hashmap crash on runnig


Im triyng to extend a base adapter to send a more complicated model structure to the view. The application crashes when it have to show the listitem to which is attached the adapter, notwithstanding a dont make any change to the view trough the adapter.

public class UtilityHashMapAdapter extends BaseAdapter {

    private Context context = null;
    private HashMap<String, HashMap<String, String>> mData = new HashMap<String, HashMap<String, String>>();
    private String[] mKeys;


    public UtilityHashMapAdapter(HashMap<String, HashMap<String, String>> data, Context context){
        //>> CONTEXT
        this.context = context;
        //>> MAPPA
        mData  = data;
        //>> INDICE
        mKeys = mData.keySet().toArray(new String[data.size()]);

    }

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

    @Override
    public Object getItem(int position) {
        return mData.get(mKeys[position]);
    }

    @Override
    public long getItemId(int arg0) {
        return arg0;
    }

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


        String key = mKeys[pos];
        String Value = getItem(pos).toString();

        //Toast.makeText(context, ""+key, Toast.LENGTH_SHORT).show();
        //Toast.makeText(context, ""+Value, Toast.LENGTH_SHORT).show();
        //do your view stuff here

        return convertView;
    }
}

and this is the initialization in the oncreate of the activity:

// CREATE AND LOAD HASHMAP
HashMap<String, HashMap<String, String>> map = new HashMap<String, HashMap<String, String>>();
map.put("ME", new HashMap<String,String>());
map.get("ME").put("Università degli studi di Messina", "#FF0000");
map.put("BA", new HashMap<String,String>());
map.get("BA").put("Università degli studi di Bari", "#FFFF00");

// SET DATA TO ADAPTER

UtilityHashMapAdapter customAdapter = new UtilityHashMapAdapter(map, getApplicationContext());

ListView listViewUni = (ListView) findViewById(R.id.scrollUniListLW);

listViewUni.setAdapter(customAdapter);

ERROR LOG:

Process: design.ubris.myuni, PID: 1169
                  java.lang.NullPointerException: Attempt to invoke virtual method 'int android.view.View.getImportantForAccessibility()' on a null object reference
                      at android.widget.AbsListView.obtainView(AbsListView.java:2436)
                      at android.widget.ListView.makeAndAddView(ListView.java:1986)
                      at android.widget.ListView.fillDown(ListView.java:709)
                      at android.widget.ListView.fillFromTop(ListView.java:770)
                      at android.widget.ListView.layoutChildren(ListView.java:1749)
                      at android.widget.AbsListView.onLayout(AbsListView.java:2210)
                      at android.view.View.layout(View.java:17702)
                      at android.view.ViewGroup.layout(ViewGroup.java:5631)
                      at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1762)
                      at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1606)
                      at android.widget.LinearLayout.onLayout(LinearLayout.java:1515)
                      at android.view.View.layout(View.java:17702)
                      at android.view.ViewGroup.layout(ViewGroup.java:5631)
                      at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1079)
                      at android.view.View.layout(View.java:17702)
                      at android.view.ViewGroup.layout(ViewGroup.java:5631)
                      at android.widget.FrameLayout.layoutChildren(FrameLayout.java:325)
                      at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
                      at android.view.View.layout(View.java:17702)
                      at android.view.ViewGroup.layout(ViewGroup.java:5631)
                      at android.widget.FrameLayout.layoutChildren(FrameLayout.java:325)
                      at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
                      at android.view.View.layout(View.java:17702)
                      at android.view.ViewGroup.layout(ViewGroup.java:5631)
                      at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1762)
                      at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1606)
                      at android.widget.LinearLayout.onLayout(LinearLayout.java:1515)
                      at android.view.View.layout(View.java:17702)
                      at android.view.ViewGroup.layout(ViewGroup.java:5631)
                      at android.widget.FrameLayout.layoutChildren(FrameLayout.java:325)
                      at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
                      at com.android.internal.policy.DecorView.onLayout(DecorView.java:774)
                      at android.view.View.layout(View.java:17702)
                      at android.view.ViewGroup.layout(ViewGroup.java:5631)
                      at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2519)
                      at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2234)
                      at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1372)
                      at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6774)
                      at android.view.Choreographer$CallbackRecord.run(Choreographer.java:926)
                      at android.view.Choreographer.doCallbacks(Choreographer.java:735)
                      at android.view.Choreographer.doFrame(Choreographer.java:667)
                      at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:912)
                      at android.os.Handler.handleCallback(Handler.java:761)
                      at android.os.Handler.dispatchMessage(Handler.java:98)
                      at android.os.Looper.loop(Looper.java:156)
                      at android.app.ActivityThread.main(ActivityThread.java:6523)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:942)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832)

Solution

  • Inside your getView function, add a check if convertView is null

    if (convertView == null) {
            convertView = LayoutInflater.from(context).
                inflate(R.layout.layout_list_view_item, parent, false);
    }