Wang'l Pakhrin
Wang'l Pakhrin

Reputation: 868

Show external Image using async task

i want to call an external picture and show it in a listview. My code works for one second and crashes giving null pointer error. The code logic is like this 1.I have called First async task to fetch Json objects from outside. Then created a custom adapter to set that objects in custom layout. 2.second async task gets one of the object(which contains the url for the image) and returns Bitmap image.

Could you identify what i did wrong ?

Eroor: Attempt to invoke virtual method 'void android.widget.ImageView.setImageBitmap(android.graphics.Bitmap)' on a null object referenc

My Fragment class

public class NewsFragment extends Fragment{

    private ProgressDialog pDialog;// Progress Dialog
    String my_url;
    ListView newsList;
    ArrayList<HashMap<String, String>> postList; //Declare Array
    private static String url = "http://wangeltmg.com/GKN_ADMIN/GET_POSTS/get_news.php";
    GetNews.CustomAdapter CA;
    View ImageView;

    // JSON Node names
    private static final String TAG_ID = "id";
    private static final String POST_ALLPOSTS = "posts";
    private static final String POST_ID = "ID";
    private static final String POST_TITLE = "post_title";
    private static final String POST_CONTENT = "post_content";
    private static final String GUID = "guid";


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.news, container, false);
        newsList = (ListView) view.findViewById(R.id.newsListView);
        TextView topic = (TextView) view.findViewById(R.id.topic);
        postList = new ArrayList<HashMap<String, String>>();
        //Get arguments
        Bundle args = getArguments();
        String mytopic = args.getString("Topic");
        //Set topic
        topic.setText(mytopic.toUpperCase());
        //Execute getContacts
        new GetNews().execute();
        newsList.setOnItemClickListener(new newsListClick());


        return view;
    }

    public class newsListClick implements ListView.OnItemClickListener{

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Log.d("News List","Clicked " + id);
            android.support.v4.app.FragmentManager fragmentManager = getFragmentManager();
            android.support.v4.app.FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
            SinglePost singleFrag = new SinglePost();
            fragmentTransaction.replace(R.id.content_frame, singleFrag);
            fragmentTransaction.commit();
        }
    }


    //Async Task
    private class GetNews extends AsyncTask<Void, Void, Void> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            // Showing progress dialog
            pDialog = new ProgressDialog(getActivity());
            pDialog.setMessage("Please wait...");
            pDialog.setCancelable(false);
            pDialog.show();

        }

        @Override
        protected Void doInBackground(Void... arg0) {

            // Creating service handler class instance
            ServiceHandler sh = new ServiceHandler();

            // Making a request to url and getting response
            String jsonStr = sh.makeServiceCall(url, ServiceHandler.GET);
            Log.d("Strings","Checking Json");
            Log.d("Response: ", "> " + jsonStr);

            if (jsonStr != null) {
                try {
                    JSONObject jsonObj = new JSONObject(jsonStr);
                    // contacts JSONArray
                    JSONArray posts = null;
                    // Getting JSON Array node
                    posts = jsonObj.getJSONArray(POST_ALLPOSTS);

                    // looping through All Contacts
                    for (int i = 0; i < posts.length(); i++) {

                        JSONObject c = posts.getJSONObject(i);
                        Log.d("Post->",posts.getJSONObject(i).toString());

                        String id = c.getString(POST_ID);

                        Log.d("Post->ID",id);
                        String post_title = c.getString(POST_TITLE);
                        String post_content = c.getString(POST_CONTENT);
                        String guid = c.getString(GUID);
                        Log.d("GUID->",guid);
                        //String gender = c.getString(TAG_GENDER);

                        // tmp hashmap for single post
                        HashMap<String, String> post = new HashMap<String, String>();
                        int count = 1;

                        // adding each child node to HashMap key => value
                        post.put(POST_ID, id);
                        post.put(POST_TITLE, post_title);
                        post.put(POST_CONTENT, post_content);
                        post.put(GUID, guid);
                        post.put("ListCount",String.valueOf(i));

                        // adding contact to contact list
                        postList.add(post);
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            } else {
                Log.e("ServiceHandler", "Couldn't get any data from the url");
            }

            //get the bitmap url


            return null;
        }

        @Override
        public void onPostExecute(Void result) {
            super.onPostExecute(result);
            // Dismiss the progress dialog
            if (pDialog.isShowing())
                pDialog.dismiss();

             // Updating parsed JSON data into ListView
            /*
            ListAdapter adapter = new SimpleAdapter(getActivity(), postList, R.layout.list_item,
                    new String[] { POST_TITLE,POST_CONTENT, GUID },
                    new int[] {R.id.email, R.id.mobile, R.id.guid });
            */

            CA = new CustomAdapter( getActivity(), R.layout.list_item, postList);
            newsList.setAdapter(CA);
        }

        public class CustomAdapter extends ArrayAdapter<HashMap<String, String>>{

            private final ArrayList<HashMap<String, String>> objects;

            public CustomAdapter(Context context, int resource, ArrayList<HashMap<String, String>> objects) {
                //something is wrong with super
                super(context, resource, objects);

                this.objects = objects;
            }
            public View getView(int position, View convertView, ViewGroup Parent){
                //convertView = new ImageView();
                if(convertView == null){
                    LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                    convertView = inflater.inflate(R.layout.list_item,null);

                }
                TextView thisview = (TextView) convertView.findViewById(R.id.email);
                int getListPos = newsList.getFirstVisiblePosition();
                //i set the count starting 0 and saved in the hashmap array
                //to compare the first result with the first position of listview
                int count = Integer.parseInt(objects.get(position).get("ListCount"));

                if(getListPos == count) {
                    LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                    convertView = inflater.inflate(R.layout.list_item_header,null);
                    TextView HeaderText = (TextView) convertView.findViewById(R.id.headertext);
                    TextView HeaderContent = (TextView) convertView.findViewById(R.id.headercontent);
                    HeaderText.setText(objects.get(position).get(POST_TITLE).toUpperCase());
                    HeaderContent.setText(objects.get(position).get(POST_CONTENT));

                }else{
                    thisview.setText("Normal line");
                }
                my_url = objects.get(position).get(GUID);
                new DownloadImageTask((ImageView) convertView.findViewById(R.id.img)).execute(my_url);

                return convertView;
            }


        }//



    }// end async task

    private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
        ImageView bmImage;

        public DownloadImageTask(ImageView bmImage) {
            this.bmImage = bmImage;
        }

        protected Bitmap doInBackground(String... urls) {
            String urldisplay = urls[0];
            Bitmap mIcon11 = null;
            try {
                InputStream in = new java.net.URL(urldisplay).openStream();
                mIcon11 = BitmapFactory.decodeStream(in);
            } catch (Exception e) {
                Log.e("Error", e.getMessage());
                e.printStackTrace();
            }
            return mIcon11;
        }

        protected void onPostExecute(Bitmap result) {
            bmImage.setImageBitmap(result);
        }
    }//
}

The custom layout:

?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#444444"
    android:padding="10dp">
    <ImageView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/img"/>

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="Large Text"
        android:id="@+id/headertext"
        android:layout_gravity="center_horizontal"
        android:textColor="#FFFFFF"
        android:textStyle="bold"
        android:textSize="20dp"
        android:fontFamily="http://fonts.googleapis.com/css?family=Roboto:700"/>

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="New Text"
        android:id="@+id/headercontent"
        android:layout_gravity="center_horizontal"
        android:textColor="#ffffff"
        android:maxLines="2"/>
</LinearLayout>

Upvotes: 1

Views: 465

Answers (3)

Wang&#39;l Pakhrin
Wang&#39;l Pakhrin

Reputation: 868

Some Tweak in the condition - and works. It was conflict in which view i wanted to set.

  if(getListPos == count) {
                        LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                        convertView = inflater.inflate(R.layout.list_item_header,null);
                        TextView HeaderText = (TextView) convertView.findViewById(R.id.headertext);
                        TextView HeaderContent = (TextView) convertView.findViewById(R.id.headercontent);
                        HeaderText.setText(objects.get(position).get(POST_TITLE).toUpperCase());
                        HeaderContent.setText(objects.get(position).get(POST_CONTENT));
                        new DownloadImageTask((ImageView) convertView.findViewById(R.id.img)).execute(my_url);
                    }

Upvotes: 0

bonnyz
bonnyz

Reputation: 13548

I can suppose the following problem: you have 2 different custom layout:

  1. R.layout.list_item_header
  2. R.layout.list_item

And, according to your code, you are calling for both of them:

  new DownloadImageTask((ImageView) convertView.findViewById(R.id.img)).execute(my_url);

If the ImageView R.id.img is NOT in both these layouts, your app will crash. If I'm right, you just need to fix your if/else and invoke the DownloadImageTask only when needed.

Upvotes: 1

Msk
Msk

Reputation: 857

Eroor: Attempt to invoke virtual method 'void android.widget.ImageView.setImageBitmap(android.graphics.Bitmap)' on a null object reference clearly says that the ImageView parameter that you are passing in the constructor is NULL.
You are initializing this graphical unit at the runtime. Why not initialize it in the beginning like

Variable_name = (ImageView) convertView.findViewById(R.id.img)

in the OnCreateView..

and pass the created object where you are currently using it. This might solve your error.

Upvotes: 0

Related Questions