Reputation: 47
I'm getting a NullPointerException, when I'm trying to get some image from database I think my getter and setter method is wrong, any help is much appreciated.
This is my 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();
}
}
This is my Constructor:
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;
}
This my Adapter:
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;
}
}
This is my logcat
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)
Upvotes: 0
Views: 391
Reputation: 43322
It looks like you just need to set your local reference of imageInformationList
in the constructor of your ImageAdapter
class.
Since you never set it to the reference that is passed into the constructor, it is still null when you call imageInformationList.get(position).getImg()
inside getView()
.
To fix it, just assign the local reference to the one passed into the constructor (and also rename the paramater so that you don't have multiple variables of the same name in the same scope).
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
}
//.................
Upvotes: 1