具有嵌套哈希图的 Baseadapter 在运行时崩溃

Baseadapter with nested hashmap crash on runnig

我正在尝试扩展基本适配器以将更复杂的模型结构发送到视图。当应用程序必须显示附加适配器的列表项时崩溃,尽管不通过适配器对视图进行任何更改。

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;
    }
}

这是 activity 的 oncreate 中的初始化:

// 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);

错误日志:

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)

在您的 getView 函数中,添加一个检查 convertView 是否为 null

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