简体   繁体   中英

NullPointerException in custom ListView adapter

I'm working with a listview which on click opens a dialog box which contains an edittext and a button. On button click, the value entered in the editText is saved in a textView from listview item which had been pressed before. The problem is that the value wasn't saved anymore if I reopened the application. I tried to make it save using sharedPrefences but it's crashing and shows nullpointerexception and can't deal with it. Thanks !!!

NoteAdapter.java:

 package com.cngcnasaud.orar;

    import java.util.Arrays;

    import android.app.Dialog;
    import android.content.Context;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.ImageView;
    import android.widget.TextView;

    public class NoteAdapter extends BaseAdapter {

        String[] result;
        Context context;
        int[] imageId;
        private static LayoutInflater inflater = null;
        private Dialog dialog;
        String[] savedEntries;
        String[] saved = null;

        public NoteAdapter(Note note, String[] saved, String[] prgmNameList) {
            // TODO Auto-generated constructor stub
            result = prgmNameList;
            context = note;
            inflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

            if (saved == null) {
                savedEntries = new String[result.length];
                Arrays.fill(savedEntries, "");
            } else
                savedEntries = saved;

        }

        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return result.length;
        }

        @Override
        public Object getItem(int position) {
            // TODO Auto-generated method stub
            return savedEntries[position];
        }

        @Override
        public long getItemId(int position) {
            // TODO Auto-generated method stub
            return position;
        }

        public class Holder {
            TextView tv;
            ImageView img;
            public TextView text;
        }

        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
            // TODO Auto-generated method stub

            final Holder holder = new Holder();
            View rowView;
            rowView = inflater.inflate(R.layout.note_items, null);
            holder.tv = (TextView) rowView.findViewById(R.id.textView1);
            holder.text = (TextView) rowView.findViewById(R.id.textView2);
            holder.text.setText(savedEntries[position]);
            holder.img = (ImageView) rowView.findViewById(R.id.imageView1);

            rowView.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    dialog = new Dialog(context);
                    dialog.setContentView(R.layout.dialog);
                    dialog.setTitle("Materie:" + result[position]);

                    final EditText txtMode = (EditText) dialog
                            .findViewById(R.id.dialog);
                    Button btnSave = (Button) dialog.findViewById(R.id.bsave);

                    btnSave.setOnClickListener(new OnClickListener() {

                        @Override
                        public void onClick(View v) {

                            String data = txtMode.getText().toString();
                            holder.text.setText(data);

                            savedEntries[position] = data;

                            dialog.dismiss();
                            Log.d("data", data);
                        }
                    });
                    dialog.show();
                }

            });
            return rowView;
        }

    }

logcat:

04-19 04:14:32.130: E/AndroidRuntime(947): FATAL EXCEPTION: main
04-19 04:14:32.130: E/AndroidRuntime(947): Process: com.cngcnasaud.orar, PID: 947
04-19 04:14:32.130: E/AndroidRuntime(947): java.lang.NullPointerException
04-19 04:14:32.130: E/AndroidRuntime(947):  at com.cngcnasaud.orar.NoteAdapter.getView(NoteAdapter.java:76)
04-19 04:14:32.130: E/AndroidRuntime(947):  at android.widget.AbsListView.obtainView(AbsListView.java:2263)
04-19 04:14:32.130: E/AndroidRuntime(947):  at android.widget.ListView.makeAndAddView(ListView.java:1790)
04-19 04:14:32.130: E/AndroidRuntime(947):  at android.widget.ListView.fillDown(ListView.java:691)
04-19 04:14:32.130: E/AndroidRuntime(947):  at android.widget.ListView.fillFromTop(ListView.java:752)
04-19 04:14:32.130: E/AndroidRuntime(947):  at android.widget.ListView.layoutChildren(ListView.java:1630)
04-19 04:14:32.130: E/AndroidRuntime(947):  at android.widget.AbsListView.onLayout(AbsListView.java:2091)
04-19 04:14:32.130: E/AndroidRuntime(947):  at android.view.View.layout(View.java:14817)
04-19 04:14:32.130: E/AndroidRuntime(947):  at android.view.ViewGroup.layout(ViewGroup.java:4631)
04-19 04:14:32.130: E/AndroidRuntime(947):  at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671)
04-19 04:14:32.130: E/AndroidRuntime(947):  at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1525)
04-19 04:14:32.130: E/AndroidRuntime(947):  at android.widget.LinearLayout.onLayout(LinearLayout.java:1434)
04-19 04:14:32.130: E/AndroidRuntime(947):  at android.view.View.layout(View.java:14817)
04-19 04:14:32.130: E/AndroidRuntime(947):  at android.view.ViewGroup.layout(ViewGroup.java:4631)
04-19 04:14:32.130: E/AndroidRuntime(947):  at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
04-19 04:14:32.130: E/AndroidRuntime(947):  at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
04-19 04:14:32.130: E/AndroidRuntime(947):  at android.view.View.layout(View.java:14817)
04-19 04:14:32.130: E/AndroidRuntime(947):  at android.view.ViewGroup.layout(ViewGroup.java:4631)
04-19 04:14:32.130: E/AndroidRuntime(947):  at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671)
04-19 04:14:32.130: E/AndroidRuntime(947):  at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1525)
04-19 04:14:32.130: E/AndroidRuntime(947):  at android.widget.LinearLayout.onLayout(LinearLayout.java:1434)
04-19 04:14:32.130: E/AndroidRuntime(947):  at android.view.View.layout(View.java:14817)
04-19 04:14:32.130: E/AndroidRuntime(947):  at android.view.ViewGroup.layout(ViewGroup.java:4631)
04-19 04:14:32.130: E/AndroidRuntime(947):  at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
04-19 04:14:32.130: E/AndroidRuntime(947):  at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
04-19 04:14:32.130: E/AndroidRuntime(947):  at android.view.View.layout(View.java:14817)
04-19 04:14:32.130: E/AndroidRuntime(947):  at android.view.ViewGroup.layout(ViewGroup.java:4631)
04-19 04:14:32.130: E/AndroidRuntime(947):  at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
04-19 04:14:32.130: E/AndroidRuntime(947):  at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
04-19 04:14:32.130: E/AndroidRuntime(947):  at android.view.View.layout(View.java:14817)
04-19 04:14:32.130: E/AndroidRuntime(947):  at android.view.ViewGroup.layout(ViewGroup.java:4631)
04-19 04:14:32.130: E/AndroidRuntime(947):  at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671)
04-19 04:14:32.130: E/AndroidRuntime(947):  at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1525)
04-19 04:14:32.130: E/AndroidRuntime(947):  at android.widget.LinearLayout.onLayout(LinearLayout.java:1434)
04-19 04:14:32.130: E/AndroidRuntime(947):  at android.view.View.layout(View.java:14817)
04-19 04:14:32.130: E/AndroidRuntime(947):  at android.view.ViewGroup.layout(ViewGroup.java:4631)
04-19 04:14:32.130: E/AndroidRuntime(947):  at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
04-19 04:14:32.130: E/AndroidRuntime(947):  at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
04-19 04:14:32.130: E/AndroidRuntime(947):  at android.view.View.layout(View.java:14817)
04-19 04:14:32.130: E/AndroidRuntime(947):  at android.view.ViewGroup.layout(ViewGroup.java:4631)
04-19 04:14:32.130: E/AndroidRuntime(947):  at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
04-19 04:14:32.130: E/AndroidRuntime(947):  at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
04-19 04:14:32.130: E/AndroidRuntime(947):  at android.view.View.layout(View.java:14817)
04-19 04:14:32.130: E/AndroidRuntime(947):  at android.view.ViewGroup.layout(ViewGroup.java:4631)
04-19 04:14:32.130: E/AndroidRuntime(947):  at com.android.internal.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:374)
04-19 04:14:32.130: E/AndroidRuntime(947):  at android.view.View.layout(View.java:14817)
04-19 04:14:32.130: E/AndroidRuntime(947):  at android.view.ViewGroup.layout(ViewGroup.java:4631)
04-19 04:14:32.130: E/AndroidRuntime(947):  at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
04-19 04:14:32.130: E/AndroidRuntime(947):  at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
04-19 04:14:32.130: E/AndroidRuntime(947):  at android.view.View.layout(View.java:14817)
04-19 04:14:32.130: E/AndroidRuntime(947):  at android.view.ViewGroup.layout(ViewGroup.java:4631)
04-19 04:14:32.130: E/AndroidRuntime(947):  at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1987)
04-19 04:14:32.130: E/AndroidRuntime(947):  at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1744)
04-19 04:14:32.130: E/AndroidRuntime(947):  at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1000)
04-19 04:14:32.130: E/AndroidRuntime(947):  at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5670)
04-19 04:14:32.130: E/AndroidRuntime(947):  at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
04-19 04:14:32.130: E/AndroidRuntime(947):  at android.view.Choreographer.doCallbacks(Choreographer.java:574)
04-19 04:14:32.130: E/AndroidRuntime(947):  at android.view.Choreographer.doFrame(Choreographer.java:544)
04-19 04:14:32.130: E/AndroidRuntime(947):  at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
04-19 04:14:32.130: E/AndroidRuntime(947):  at android.os.Handler.handleCallback(Handler.java:733)
04-19 04:14:32.130: E/AndroidRuntime(947):  at android.os.Handler.dispatchMessage(Handler.java:95)
04-19 04:14:32.130: E/AndroidRuntime(947):  at android.os.Looper.loop(Looper.java:136)
04-19 04:14:32.130: E/AndroidRuntime(947):  at android.app.ActivityThread.main(ActivityThread.java:5017)
04-19 04:14:32.130: E/AndroidRuntime(947):  at java.lang.reflect.Method.invokeNative(Native Method)
04-19 04:14:32.130: E/AndroidRuntime(947):  at java.lang.reflect.Method.invoke(Method.java:515)
04-19 04:14:32.130: E/AndroidRuntime(947):  at com.android.internal.os.

Line 76 in NoteAdapter.java:

holder.text.setText(savedEntries[position]);

LE:

Adapter's constructor - Note.java:

package com.cngcnasaud.orar;

import java.util.ArrayList;

import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.view.Menu;

import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.TextView;

public class Note extends Activity {

    public static final ListAdapter NoteAdapter = null;
    ListView lv;
    Context context;
    ArrayList<?> prgmName;
    TextView text;

    public static String[] prgmNameList = { "Romana   - ", "Matematica   - ",
            "Lb. Engleza   - ", "Lb. Germana/Franceza - ", "Istorie   - ",
            "Geografie   - ", "Biologie   - ", "Fizica   - ", "Ed. Fizica   - " };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.note_listview);

        text = (TextView) findViewById(R.id.textView2);

        context = this;

        lv = (ListView) findViewById(R.id.listView);
        lv.setAdapter(new NoteAdapter(this, prgmNameList, null));

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    protected void onStop() {
        // TODO Auto-generated method stub

        NoteAdapter adapter = (NoteAdapter) lv.getAdapter();

        // Variable is public for clarity.
        String toSave = EncodeDecode.encode(adapter.savedEntries);
        SharedPreferences.Editor editor = getSharedPreferences("LV Data",
                MODE_PRIVATE).edit();
        editor.putString("TVEntries", toSave);
        editor.commit();
    }

    @Override
    protected void onResume() {
        // TODO Auto-generated method stub

        SharedPreferences prefs = getSharedPreferences("LV Data", MODE_PRIVATE);
        String encoded = prefs.getString("TVEntries", "");

        String[] entries;
        if (encoded.equals(""))
            entries = null;
        else
            entries = EncodeDecode.decode(encoded);

        NoteAdapter adapter = (NoteAdapter) lv.getAdapter();
        adapter.savedEntries = entries;
        lv.setAdapter(adapter);

        super.onResume();
    }

}

Did you debug it at line 76. What is included inside the savedEntries[] array. Is the array completely null ?

Instead of using rowView directly, make it equal to convertView first and then bind widgets to it.

View rowView = convertView;
holder   = new Holder();
rowView      = mInflator.inflate(R.layout.note_items, null);
holder.text  = (TextView) rowView .findViewById(R.id.textView2);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM