NullPointerException on onCreateView when using Fragment and listview

你说的曾经没有我的故事 提交于 2019-12-25 06:01:57

问题


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>

回答1:


@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.




回答2:


Try this:

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



回答3:


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));
...


来源:https://stackoverflow.com/questions/33111034/nullpointerexception-on-oncreateview-when-using-fragment-and-listview

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!