0

I have converted Many Activities to Fragment, all are working fine except one. It gives Null Pointer Exception on setOnItemClickListener. I have checked many similar questions, but unable to figure out the problem. If anyone can provide correct code with explanation for problem.

Problem is at this line as given by debugger:

 lv.setOnItemClickListener(new OnItemClickListener() {

Following is Code:

import java.text.DecimalFormat;
import java.util.ArrayList;
        import java.util.HashMap;
        import org.json.JSONArray;
        import org.json.JSONException;
        import org.json.JSONObject;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;

import android.app.ListActivity;
        import android.app.ProgressDialog;
        import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.GradientDrawable;
import android.os.AsyncTask;
        import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
        import android.widget.AdapterView.OnItemClickListener;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListAdapter;
        import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.SimpleAdapter;
        import android.widget.TextView;
import java.io.InputStreamReader;
import java.net.URL;
import java.io.BufferedReader;
import java.net.URLConnection;
import android.support.v4.app.Fragment;


public class listtojson extends Fragment  {

    private ProgressDialog pDialog;

     public static String url = "http://www.newsvoice.in/upload_audio_sawdhan/listnews.php";

    // JSON Node names
    private static final String TAG_CONTACTS = "contacts";
    private static final String TAG_ID = "id";
    private static final String TAG_NAME = "name";
    private static final String TAG_SIZE = "size";
    private static final String TAG_PHONE_URL = "url";
    private static final String TAG_FILETYPE = "filetype";
    private static final String TAG_FILETYPETXT = "filetypetxt";
    private static final String TAG_DETAILS = "details";
    private static final String TAG_FILEPATH = "filepath";
    private static final String TAG_LOCATION = "location";
    private static final String TAG_DATETIME = "datetime";
    private static final String TAG_USERNAME = "username";
    private static final String TAG_HIGHALERT= "highalert";

    public int ssid ;
    // contacts JSONArray
    JSONArray contacts = null;
    public TextView view1;
    ListView lv;
    // Hashmap for ListView
    ArrayList<HashMap<String, String>> contactList;

    RelativeLayout llLayout;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        FragmentActivity faActivity = (FragmentActivity) super.getActivity();
        llLayout = (RelativeLayout) inflater.inflate(R.layout.listnewsjson, container, false);

        contactList = new ArrayList<HashMap<String, String>>();

       lv = (ListView) llLayout.findViewById(R.id.list); //getListView();
       // ListView lv = getActivity().getListView();

        // Listview on item click listener
        lv.setOnItemClickListener(new OnItemClickListener() {

            public void onItemClick(AdapterView<?> parent, View view,
                                    int position, long id) {
                String name = ((TextView) view.findViewById(R.id.name))
                        .getText().toString();
                String size = ((TextView) view.findViewById(R.id.size))
                        .getText().toString();
                String description = ((TextView) view.findViewById(R.id.url))
                        .getText().toString();
                String details = ((TextView) view.findViewById(R.id.details))
                        .getText().toString();
                String location = ((TextView) view.findViewById(R.id.location))
                        .getText().toString();
                String datetime = ((TextView) view.findViewById(R.id.datetime))
                        .getText().toString();
                String filetype = ((TextView) view.findViewById(R.id.filetypetxt))
                        .getText().toString();
                String username = ((TextView) view.findViewById(R.id.username))
                        .getText().toString();

                Intent in = new Intent(getActivity().getApplicationContext(), jsondetailActivity.class);
                // passing sqlite row id
                //= in.putExtra(TAG_ID, sqlite_id);
                in.putExtra(TAG_ID, String.valueOf(id));
                in.putExtra(TAG_NAME, name);
                in.putExtra(TAG_DETAILS, details);
                in.putExtra(TAG_LOCATION, location);
                in.putExtra(TAG_DATETIME, datetime);
                in.putExtra(TAG_FILETYPE, filetype);
                in.putExtra(TAG_PHONE_URL, description);
                in.putExtra(TAG_SIZE, size);
                in.putExtra(TAG_USERNAME, username);
                startActivity(in);

            }
        });

        // Calling async task to get json
        new GetContacts().execute();
        return llLayout;
    }

    /**
     * Async task class to get json by making HTTP call
     * */
    private class GetContacts extends AsyncTask<Void, Void, Void> {

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

        }

        @Override
        protected Void doInBackground(Void... arg0) {
            // Creating service handler class instance
            ServiceHandler sh = new ServiceHandler();
            try {

                // Making a request to url and getting response
                // String jsonStr = sh.makeServiceCall(url, ServiceHandler.GET);

                URL requestUrl = new URL(url);
                Log.e("Debug", " Sapp 1 : " + requestUrl.toString());
                URLConnection con = requestUrl.openConnection();
                BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));

                StringBuilder sb=new StringBuilder();
            //Reader rd=new Readable(in);
            int cp;
            try {
                    while((cp=in.read())!=-1){
                    sb.append((char)cp);
                }}
                catch(Exception e){
                }
                String jsonStr=sb.toString();
            Log.e("Response: ", "> " + jsonStr);

            if (jsonStr != null) {
                try {
                    JSONObject jsonObj = new JSONObject(jsonStr);

                    // Getting JSON Array node
                    contacts = jsonObj.getJSONArray(TAG_CONTACTS);

                    // looping through All Contacts
                    for (int i = 0; i < contacts.length(); i++) {
                        JSONObject c = contacts.getJSONObject(i);

                        String id = c.getString(TAG_ID);
                        String name = c.getString(TAG_NAME);
                        String size = c.getString(TAG_SIZE);
                        String url = c.getString(TAG_PHONE_URL);
                        String details = c.getString(TAG_DETAILS);
                        String location = c.getString(TAG_LOCATION);
                        String datetime = c.getString(TAG_DATETIME);
                        String filetype = c.getString(TAG_FILETYPE);
                        String username = c.getString(TAG_USERNAME);
                        String highalert = c.getString(TAG_HIGHALERT);

                        HashMap<String, String> contact = new HashMap<String, String>();

                        // adding each child node to HashMap key => value
                        contact.put(TAG_ID, id);
                        contact.put(TAG_NAME, name);
                        contact.put(TAG_SIZE, size);
                        contact.put(TAG_PHONE_URL, url);
                        contact.put(TAG_DETAILS, details);
                        contact.put(TAG_LOCATION, location);
                        contact.put(TAG_DATETIME, datetime);
                        contact.put(TAG_FILETYPE, filetype);
                        contact.put(TAG_FILETYPETXT, filetype);
                        contact.put(TAG_USERNAME, username);
                        contact.put(TAG_HIGHALERT, highalert);
                        // adding contact to contact list
                        contactList.add(contact);

                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            } else {
                Log.e("ServiceHandler", "Couldn't get any data from the url");
            }
            }catch(Exception ec){
            }
            return null;
        }

        @Override
        protected 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(), contactList,
                    R.layout.list_selector, new String[] { TAG_NAME, TAG_SIZE,
                    TAG_PHONE_URL,TAG_FILETYPE, TAG_FILETYPETXT,TAG_DETAILS,TAG_LOCATION,TAG_DATETIME, TAG_USERNAME, TAG_HIGHALERT}, new int[] { R.id.name,
                    R.id.size, R.id.url, R.id.filetype,R.id.filetypetxt, R.id.details, R.id.location, R.id.datetime, R.id.username, R.id.highalert });
            Log.e("Debug", " Sapp 10"+TAG_NAME);

            SimpleAdapter.ViewBinder viewBinder = new SimpleAdapter.ViewBinder() {

                @Override
                public boolean setViewValue(View view, Object data,
                                            String textRepresentation) {
                    if (view.getId() == R.id.name) {
                        ((TextView) view).setText((String) data);
                        return true;
                    } else if (view.getId() == R.id.size) {
                        ((TextView) view).setText((String) data);
                    }  else if (view.getId() == R.id.url) {
                        ((TextView) view).setText((String) data);
                    }  else if (view.getId() == R.id.details) {
                        ((TextView) view).setText((String) data);
                    }  else if (view.getId() == R.id.location) {
                        ((TextView) view).setText((String) data);
                    }  else if (view.getId() == R.id.datetime) {
                        ((TextView) view).setText((String) data);
                    }  else if (view.getId() == R.id.filetypetxt) {
                        ((TextView) view).setText((String) data);
                    }  else if (view.getId() == R.id.username) {
                        ((TextView) view).setText((String) data);
                    }  else if (view.getId() == R.id.highalert) {
                        GradientDrawable gd = new GradientDrawable();
                        gd.setColor(0xffff0000); // Changes this drawbale to use a single color instead of a gradient
                        gd.setCornerRadius(0);
                        gd.setSize(10,20);

                       // view.findViewById(R.id.name).setBackgroundDrawable(gd);
                        String halert=(String.valueOf((String) data));
                        if(halert.equals("1")) {

                            ((TextView) view).setText("  ");
                            ((TextView) view).setBackgroundDrawable(gd);

                            return true;
                            }
                        else {  return  true; }


                    } else if (view.getId() == R.id.filetype) {
                       // (view1 = (TextView) findViewById(R.id.filetypetxt)).setText((String) data);
                         Resources res =getResources();
                       String tnew=(String.valueOf((String) data));
                        String tst=tnew;
                        int sidd=0;
                       // Log.e("Debug", " Sapp 7:"+(String)data+":");
                        if(tst.equals("c")) {  ssid =  R.drawable.ca; }
                        else if(tst.equals("d")) {  ssid =  R.drawable.da; }
                        else if(tst.equals("e")) {  ssid =  R.drawable.ea; }
                      //  Log.e("Debug", " Sapp 8 :"+ssid+":");
                        Bitmap bmp = BitmapFactory.decodeResource(res, ssid);
                        BitmapDrawable ob = new BitmapDrawable(getResources(), bmp);
                       ((ImageView) view).setImageDrawable(ob);
                        ((ImageView) view).setImageBitmap(bmp);
                        return true;
                    }
                    return false;
                }
            };
            ((SimpleAdapter) adapter).setViewBinder(viewBinder);
            lv.setAdapter(adapter);
            registerForContextMenu(lv);
        }
    }
    public static String getFileSize(long size) {
        if (size <= 0)
            return "0";
        final String[] units = new String[] { "B", "KB", "MB", "GB", "TB" };
        int digitGroups = (int) (Math.log10(size) / Math.log10(1024));
        return new DecimalFormat("#,##0.#").format(size / Math.pow(1024, digitGroups)) + " " + units[digitGroups];
    }

}

And here is the Logcat:

10-14 00:46:53.900  18286-18286/com.sjssoft.sawdhan E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.sjssoft.sawdhan, PID: 18286
    java.lang.NullPointerException
            at com.sjssoft.sawdhan.listtojson.onCreateView(listtojson.java:87)
            at android.support.v4.app.Fragment.performCreateView(Fragment.java:1789)
            at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:955)
            at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1138)
            at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:740)
            at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1501)
            at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:490)
            at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141)
            at android.support.v4.view.ViewPager.populate(ViewPager.java:1072)
            at android.support.v4.view.ViewPager.populate(ViewPager.java:918)
            at android.support.v4.view.ViewPager$3.run(ViewPager.java:248)
            at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
            at android.view.Choreographer.doCallbacks(Choreographer.java:574)
            at android.view.Choreographer.doFrame(Choreographer.java:543)
            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:5052)
            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:793)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:609)
            at dalvik.system.NativeStart.main(Native Method)

And here is XML

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical">
    <!-- Main ListView 
         Always give id value as list(@android:id/list)
    -->
    <ListView
        android:id="@android:id/list"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:divider="#b5b5b5"
        android:dividerHeight="1dp"
        android:listSelector="@drawable/list_selector"
        />
</RelativeLayout>
SJSSoft
  • 723
  • 2
  • 10
  • 28
  • Could you post `listnewsjson.xml`, and make sure the `ListView` is declared with the id `list`? – mbmc Oct 13 '15 at 19:37
  • @SJSoft : can you try to set click listener on listview inside onViewCreated Method of fragment because till now it is not guaranteed whether list view is actually present in view hierarchy or not, but onViewCreated() will give the guarantee – dex Oct 13 '15 at 19:38
  • Yes, sure. Just a sec – SJSSoft Oct 13 '15 at 19:38
  • @dex: I tried, but I was unable write proper code. If you can do this for me. I am totally helpless. – SJSSoft Oct 13 '15 at 19:41
  • @SJSSoft : please replace your fragment file with this http://pastebin.com/zrbzNPuG hope fully it will work for you – dex Oct 13 '15 at 20:30
  • @SJSSoft will that work for you ?? – dex Oct 13 '15 at 21:09
  • Nope.. Same Problem. – SJSSoft Oct 13 '15 at 21:12

3 Answers3

0

@android:id/list uses the ID "list" from the Android package, so you need to reference it as findViewById(android.R.id.list) in your Java code.

Clint Deygoo
  • 261
  • 3
  • 10
  • Where I have to use it. Can you please post the correct code? – SJSSoft Oct 13 '15 at 19:50
  • lv = (ListView) fragment.findViewById(android.R.id.list); – Clint Deygoo Oct 13 '15 at 19:51
  • Using this, Error has been removed, but list view is empty. – SJSSoft Oct 13 '15 at 20:11
  • The listview being empty could be another issue, like for instance your doInBackground throwing an error and not populating the contactList. Also I'll point out that you should disconnect your URLConnection object as well as any Streams you open. – Clint Deygoo Oct 13 '15 at 20:18
  • I have printed json in log, it it working fine. Just unable to populate data to listview. Is it possible that it is inflating listview before any data in it? – SJSSoft Oct 13 '15 at 20:21
0

Try this:

View fragment = inflater.inflate(R.layout.your_fragment_layout, container, false);
lv = (ListView) fragment.findViewById(android.R.id.list);
SuperFrog
  • 7,631
  • 9
  • 51
  • 81
0

Your ArrayList needs to be like this:

ArrayList<HashMap<String, String>> contactList = new ArrayList<HashMap<String, String>>

Instead of :

llLayout = (RelativeLayout) inflater.inflate(R.layout.listnewsjson, container, false);

insert this:

View v = inflater.inflate(R.layout.listnewsjson, container, false);
lv = (ListView) v.findViewById(android.R.id.list);


...
new GetContacts().execute();
return v;

Your AsyncTask needs to be like this:

AsyncTask<Void, Void, ArrayList<HashMap<String, String>>

Your doInBackground needs to be like this:

ArrayList<HashMap<String, String>> doInBackground(Void... params)

Your onPostExecute needs to be like this:

onPostExecute(ArrayList<HashMap<String, String>> result)

set adapter:

lv.setAdapter(new SomeAdapter(getActivity().getApplicationContext(), result));
...
Stanojkovic
  • 1,612
  • 1
  • 17
  • 24
  • Unable to Implement this: lv.setAdapter(new SomeAdapter(getActivity().getApplicationContext(), result)); It is not accepting SimpleAdapter, ListAdapter, LazyAdapter.. Any idea? – SJSSoft Oct 14 '15 at 09:55
  • You need to create your own, custom adapter, override methods getCount(), Object getItem(int position), getItemId(int position), View getView()... create view holder with custom rows.... – Stanojkovic Oct 14 '15 at 12:10
  • Thanks for your time. While debugging I am getting all the values in adapter, but it is not populating in listview. Snapshot of debug info is at this link. I am wandering around, but unable to write exact code. I ll be thankful to you if you can save my day. Already spent 3 days on it. – SJSSoft Oct 14 '15 at 13:30
  • You can use some references from [this](http://www.vogella.com/tutorials/AndroidListView/article.html) link. – Stanojkovic Oct 14 '15 at 14:03