Android onitemselectedlistener хвърля изключение за nullpointer във фрагмент

Опитах много начини да успея onitemselectedlistener в моя фрагментен изглед, но непрекъснато получавам фатално изключение java.lang.NullPointerException и то винаги сочи към един и същ ред в кода, който е за задаване на onitemselectedlistener метод за spinner.

Изходът за грешка на android studio logcat е:

07-21 13:55:06.544 17277-17277/com.vaibhavtech.indoreveg E/AndroidRuntime﹕ ФАТАЛНО ИЗКЛЮЧЕНИЕ: главен процес: com.vaibhavtech.indoreveg, PID: 17277
java.lang.NullPointerException в com.vaibhavtech.indoreveg .activity.VegetablesFragment.onCreateView(VegetablesFragment.java:91) в android.support.v4.app.Fragment.performCreateView(Fragment.java:1786) в android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:953 ) в android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1136) в android.support.v4.app.BackStackRecord.run(BackStackRecord.java:739) в android.support.v4.app.FragmentManagerImpl. execPendingActions(FragmentManager.java:1499) в android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:456) в android.os.Handler.handleCallback(Handler.java:808) в android.os.Handler. dispatchMessage(Handler.java:103) в android.os.Looper.loop(Looper.java:193) в android.app.ActivityThread.main(ActivityThread.java:5395) в java.lang.reflect.Method.invokeNative(Native Метод) в java.lang.reflect.Method.invoke(Method.java:515) в com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:837) в com.android.internal.os.ZygoteInit .main(ZygoteInit.java:653) в dalvik.system.NativeStart.main(Native метод)

клас фрагмент:

public class VegetablesFragment extends Fragment {
// Log tag
private static final String TAG = MainActivity.class.getSimpleName();
private Spinner spinnerPacking;
// array list for spinner adapter
private ArrayList<Packing> spinnerList;
// Product json url
private static final String url = "http://www.indoreveg.com/androidapi1/products.php?category=vegetable";
private ProgressDialog pDialog;
private List<Products> productsList = new ArrayList<Products>();
private ListView listView;
private CustomListAdapter adapter;
public VegetablesFragment() {
    // Required empty public constructor
}
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View layout = inflater.inflate(R.layout.fragment_vegetables, container, false);
    listView = (ListView) layout.findViewById(R.id.list);
    spinnerPacking = (Spinner) layout.findViewById(R.id.packingList);
    spinnerList = new ArrayList<Packing>();
    /* spinner item select listener */
    spinnerPacking.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> arg0, View arg1,
                                   int arg2, long arg3) {
            // TODO Auto-generated method stub
            String msupplier=spinnerPacking.getSelectedItem().toString();
            Log.e("Selected item : ",msupplier);
        }
        @Override
        public void onNothingSelected(AdapterView<?> arg0) {
            // TODO Auto-generated method stub
        }
    });
    adapter = new CustomListAdapter(getActivity(), productsList);
    listView.setAdapter(adapter);
    pDialog = new ProgressDialog(getActivity());
    // Showing progress dialog before making http request
    pDialog.setMessage("Loading...");
    pDialog.show();
    populateSpinner();
    // Creating volley request obj
    JsonArrayRequest productsReq = new JsonArrayRequest(url, new Response.Listener<JSONArray>() {
        @Override
        public void onResponse(JSONArray response) {
            Log.d(TAG, response.toString());
            hidePDialog();
            // Parsing json
            for (int i = 0; i < response.length(); i++) {
                try {
                    JSONObject obj = response.getJSONObject(i);
                    Products products = new Products();
                    products.setTitle(obj.getString("name"));
                    products.setThumbnailUrl(obj.getString("image"));
                    products.setOurPrice(obj.getString("our_price"));
                    products.setMarketPrice(obj.getString("market_price"));
                    // Packing is json array
                    JSONArray packingArry = obj.getJSONArray("packing");
                    ArrayList<String> packings = new ArrayList<String>();
                    for (int j = 0; j < packingArry.length(); j++) {
                        packings.add((String) packingArry.get(j));
                    }
                    products.setPacking(packings);
                    // adding products to products array
                    productsList.add(products);
                    JSONArray mpackingArray = obj.getJSONArray("packing");
                    for (int m = 0; m < mpackingArray.length(); m++) {
                    JSONObject packObj = (JSONObject) mpackingArray.get(m);
                    Packing pack = new Packing(packObj.getString("pack"));
                        spinnerList.add(pack);
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }

            }
            // notifying list adapter about data changes
            // so that it renders the list view with updated data
            adapter.notifyDataSetChanged();
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            VolleyLog.d(TAG, "Error: " + error.getMessage());
            hidePDialog();
        }
    });
    // Adding request to request queue
    AppController.getInstance().addToRequestQueue(productsReq);
    return layout;
}
@Override
public void onDestroy() {
    super.onDestroy();
    hidePDialog();
}

private void hidePDialog() {
    if (pDialog != null) {
        pDialog.dismiss();
        pDialog = null;
    }
}
private void populateSpinner() {
    List<String> lables = new ArrayList<String>();

    for (int i = 0; i < spinnerList.size(); i++) {
        lables.add(spinnerList.get(i).getPackingnm());
    }
    // Creating adapter for spinner
ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<String>(getActivity().getBaseContext(), android.R.layout.simple_spinner_item, lables);
// Drop down layout style - list view with radio button  spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
// attaching data adapter to spinner
spinnerPacking.setAdapter(spinnerAdapter);
}
}

Моля помогнете. Благодаря

fragment_vegetable.xml

<?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout 
       xmlns:android="http://schemas.android.com/apk/res/android"
       xmlns:tools="http://schemas.android.com/tools"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       tools:context=".MainActivity" >
    <ListView
       android:id="@+id/list"
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       android:divider="@color/list_divider"
       android:dividerHeight="1dp"
       android:listSelector="@drawable/list_row_selector" />
    </RelativeLayout>

Метод на адаптер GetView:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (inflater == null)
inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (convertView == null) convertView = inflater.inflate(R.layout.list_row, null);
TextView title = (TextView) convertView.findViewById(R.id.title);
if (imageLoader == null)
    imageLoader = AppController.getInstance().getImageLoader();
    NetworkImageView thumbNail = (NetworkImageView) convertView.findViewById(R.id.thumbnail);
    TextView ourPrice = (TextView) convertView.findViewById(R.id.ourPrice);
    TextView packing = (TextView) convertView.findViewById(R.id.packing);
    TextView marketPrice = (TextView) convertView.findViewById(R.id.marketPrice);
    Spinner packingSpinner = (Spinner) convertView.findViewById(R.id.packingList);
    packingSpinner.setOnItemSelectedListener(this);
    // getting products data for the row
    Products p = productsItems.get(position);
    // thumbnail image
    thumbNail.setImageUrl(p.getThumbnailUrl(), imageLoader);
    // title
    title.setText(p.getTitle());
    // ourPrice
    ourPrice.setText("Our Price: " + String.valueOf(p.getOurPrice()));
    // packing
    List<String> lables = new ArrayList<String>();
    for (int i = 0; i < p.getPacking().size(); i++) {
        lables.add(p.getPacking().get(i));
    }
    // Creating adapter for spinner
    ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<String>(context,android.R.layout.simple_spinner_item, lables);
    // Drop down layout style - list view with radio button
spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    // attaching data adapter to spinner
    packingSpinner.setAdapter(spinnerAdapter);
    String packingStr = "";
    for (String str : p.getPacking()) {
        packingStr += str + ", ";
    }
    packingStr = packingStr.length() > 0 ? packingStr.substring(0,
            packingStr.length() - 2) : packingStr;
    packing.setText(packingStr);
    // marketPrice
    marketPrice.setText("Market Price: " + String.valueOf(p.getMarketPrice()));
    marketPrice.setPaintFlags(marketPrice.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
    return convertView;
}

person shivendra1046    schedule 21.07.2015    source източник
comment
Кога получавате грешката? не добавяйте толкова много код в Oncreate.   -  person Anoop M Maddasseri    schedule 21.07.2015
comment
грешката идва точно след изпълнението на json, когато инициализира onitemselected слушател за spinner.   -  person shivendra1046    schedule 21.07.2015


Отговори (1)


Уверете се, че вашето оформление „fragment_vegetables“ съдържа Spinner с ID „R.id.packingList“, в противен случай layout.findViewById(R.id.packingList) връща null и ще получите NullPointerException на ред spinnerPacking.setOnItemSelectedListener.

person Berťák    schedule 21.07.2015
comment
Използвам моделен клас за получаване и настройка на данни заедно с персонализиран клас адаптер за изглед на списък, който разширява baseadapter, този адаптер на списък съдържа R.id.packingList, след това как да приложа onitemselected слушател в персонализиран адаптер за изглед на списък - person shivendra1046; 21.07.2015
comment
здравей, промених програмата си според твоето предложение, но все още дава nullpointerexception. - person shivendra1046; 22.07.2015
comment
Би било хубаво, ако можете да публикувате вашето XML оформление fragment_vegetables. Все още ли е същият ред - ред setOnItemSelectedListener? - person Berťák; 22.07.2015
comment
здравейте, добавих xml файла за зеленчуков фрагмент - person shivendra1046; 23.07.2015
comment
Както предложих, във вашето оформление XML няма Spinner елемент с android:id=@+id/packingList, следователно не може да бъде намерен с layout.findViewById(R.id.packingList). Добавете Spinner в оформлението си! - person Berťák; 23.07.2015
comment
Но аз използвам персонализиран адаптер за изглед на списък и този xml съдържа функцията за въртене - person shivendra1046; 24.07.2015
comment
Така че настройте спинера в getView на вашия адаптер, а не във вашата активност. - person Berťák; 25.07.2015
comment
Опитах го, но винаги дава изключение за нулев указател, като сочи somespinner.setOnItemSelectedListener(getActivity()); - person shivendra1046; 25.07.2015
comment
Можете ли да публикувате метода getView на вашия адаптер, моля? - person Berťák; 25.07.2015
comment
Здравейте, компилирах го отново и сега той сочи към този ред ArrayAdapter‹String› spinnerAdapter = new ArrayAdapter‹String›(context,android.R.layout.simple_spinner_item, lables); - person shivendra1046; 25.07.2015