java - getView 方法导致 NullPointerException

标签 java android android-studio

我收到 NullPointerException,当我尝试从数据库获取一些图像时,我认为我的 getter 和 setter 方法是错误的,非常感谢任何帮助。

这是我的 Activity

   public class ViewMoreDetailsImages extends Activity{

    ProgressBar progressbar_01;

    ListView lv_images;
    ImageAdapter imageAdapter;
    List<ImageInformation> imageInformationList = new ArrayList<ImageInformation>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.view_more_details_images);
        this.setTitle("LandDev Images");

        lv_images = (ListView)findViewById(R.id.lv_images);
        progressbar_01 = (ProgressBar) findViewById(R.id.progress_bar_01);

        displayImage();

        imageAdapter = new ImageAdapter(this, imageInformationList);

        lv_images.setAdapter(imageAdapter);
    }
    private class viewMoreImages extends AsyncTask<String, Void, List<String>>{
        Statement st;
        ResultSet rs;
        Connection con;
        byte[] img;
        Bitmap theImage;
        @Override
        protected void onPreExecute(){
                lv_images.setVisibility(View.GONE);
                progressbar_01.setVisibility(View.VISIBLE);
            super.onPreExecute();
        }
        @Override
        protected List<String> doInBackground(String... params) {
            List<String> result = new ArrayList<String>();
            try{
                String query_image = "SELECT Image FROM tbl_task_image WHERE Task_Id ='"+ ListOfTask.task_id +"'";
                con = MyConnection.connect();
                st = con.createStatement();
                rs = st.executeQuery(query_image);
                while(rs.next()){
                    img = rs.getBytes(1);
                    BitmapFactory.Options options = new BitmapFactory.Options();
                    options.inSampleSize = 2;
                    options.inPurgeable = true;// is deprecated
                    theImage = Bitmap.createScaledBitmap(BitmapFactory.decodeByteArray(img, 0, img.length, options), 200, 200, true);
                    ByteArrayOutputStream buf = new ByteArrayOutputStream();
                    theImage.compress(Bitmap.CompressFormat.PNG, 0, buf);

                    ImageInformation imageInformation = new ImageInformation(theImage);
                    imageInformationList.add(imageInformation);
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
            return result;
        }
        @Override
        protected void onPostExecute(List<String> result){
                lv_images.setVisibility(View.VISIBLE);
                progressbar_01.setVisibility(View.GONE);
            super.onPostExecute(result);
        }
    }
    public void displayImage() {
        viewMoreImages vmi = new viewMoreImages();
        vmi.execute();
    }
}

这是我的构造函数:

public class ImageInformation {
    private Bitmap img;

    public ImageInformation(Bitmap img){
        this.img = img;
    }
       public Bitmap getImg() {
        return img;
    }

    public void setImg(Bitmap img) {
        this.img = img;
    }

这是我的适配器:

public class ImageAdapter extends ArrayAdapter<ImageInformation> {

    List<ImageInformation> imageInformationList;

    public ImageAdapter(Context context, List<ImageInformation> imageInformationList) {
        super(context, R.layout.more_details_images, imageInformationList);
    }

    static class ImageHolder{
        ImageView more_details_images;
    }

    @Override
    public View getView(final int position, View convertView, final ViewGroup parent) {
        ImageHolder holder = null;
        View v = convertView;
        if(v == null) {
            LayoutInflater inflater = LayoutInflater.from(getContext());
            v = inflater.inflate(R.layout.more_details_images, parent, false);
            holder = new ImageHolder();
            holder.more_details_images = (ImageView) v.findViewById(R.id.images);
            v.setTag(holder);
        }else{
            holder = (ImageHolder) v.getTag();
        }
        holder.more_details_images.setImageBitmap(imageInformationList.get(position).getImg()); // causing NullPointerException
        holder.more_details_images.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ((ListView) parent).performItemClick(v, position,0);
            }
        });
        return v;
    }
}

这是我的日志猫

6-22 21:43:04.012  18024-18024/com.juanito.itdepartment.landdevtaskmonitoring E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.juanito.itdepartment.landdevtaskmonitoring, PID: 18024
    java.lang.NullPointerException
            at com.juanito.itdepartment.landdevtaskmonitoring.ImageAdapter.getView(ImageAdapter.java:45)
            at android.widget.AbsListView.obtainView(AbsListView.java:2263)
            at android.widget.ListView.makeAndAddView(ListView.java:1790)
            at android.widget.ListView.fillDown(ListView.java:691)
            at android.widget.ListView.fillFromTop(ListView.java:752)
            at android.widget.ListView.layoutChildren(ListView.java:1630)
            at android.widget.AbsListView.onLayout(AbsListView.java:2091)
            at android.view.View.layout(View.java:14817)
            at android.view.ViewGroup.layout(ViewGroup.java:4631)
            at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671)
            at android.widget.LinearLayout.layoutHorizontal(LinearLayout.java:1660)
            at android.widget.LinearLayout.onLayout(LinearLayout.java:1436)
            at android.view.View.layout(View.java:14817)
            at android.view.ViewGroup.layout(ViewGroup.java:4631)
            at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
            at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
            at android.view.View.layout(View.java:14817)
            at android.view.ViewGroup.layout(ViewGroup.java:4631)
            at com.android.internal.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:374)
            at android.view.View.layout(View.java:14817)
            at android.view.ViewGroup.layout(ViewGroup.java:4631)
            at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
            at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
            at android.view.View.layout(View.java:14817)
            at android.view.ViewGroup.layout(ViewGroup.java:4631)
            at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1987)
            at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1744)
            at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1000)
            at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5670)
            at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
            at android.view.Choreographer.doCallbacks(Choreographer.java:574)
            at android.view.Choreographer.doFrame(Choreographer.java:544)
            at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5017)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
            at dalvik.system.NativeStart.main(Native Method)

最佳答案

看起来您只需要在 ImageAdapter 类的构造函数中设置 imageInformationList 的本地引用即可。

由于您从未将其设置为传递给构造函数的引用,因此当您在 getView()< 内调用 imageInformationList.get(position).getImg() 时,它仍然为 null/.

要解决此问题,只需将本地引用分配给传递给构造函数的引用(并重命名参数,以便在同一范围内不会有多个同名变量)。

public class ImageAdapter extends ArrayAdapter<ImageInformation> {

    List<ImageInformation> imageInformationList;

    //rename parameter name:
    public ImageAdapter(Context context, List<ImageInformation> imageInformationListParameter) {
        super(context, R.layout.more_details_images, imageInformationListParameter);

        imageInformationList = imageInformationListParameter; //added
    }

   //.................

关于java - getView 方法导致 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30992687/

相关文章:

Android Studio AVD Linux AMDGPU 驱动程序

java - Expandable list-view-Android Studio 中的可点击(将您引导至网站)文本

android - Fragment OnResume 未在 backpress 上调用

java - 网络提供商生成一个位置的 2 个副本

java - android.support.v4.app.fragment 和 androidx.fragment.app.FragmentActivity 有什么区别

java - 如何在 Spring MVC 应用程序中分别处理多个子域?

android - Fragment 被替换和再次可见时的回调

android-studio - 禁用缩进注释掉的代码

java - 向用户数据添加方法

java - Spring mvc 项目中的 org.springframework.beans.factory.CannotLoadBeanClassException