2014-09-06 16 views
10

मैं एक टुकड़ा करने के लिए एक पहले से गतिविधि आधारित ट्यूटोरियल परिवर्तित करने का प्रयास कर रहा हूँ, लेकिन मैं अपने एडाप्टर पर NullPointerException त्रुटि प्राप्त करने के लिए जारी।एंड्रॉयड वॉली नल पॉइंटर एक्सेप्शन

ट्यूटोरियल this पर आधारित है और मैंने एडाप्टर के लिए कन्स्ट्रक्टर को घटा दिया है क्योंकि यह एक गतिविधि को कॉल करता था।

एक संभावित समाधान here है लेकिन कोई भी नहीं जानता कि कैसे एक ही संभावित प्रश्न के साथ आगे बढ़ना है।

मैं एक काम टुकड़ा करने के लिए सब कुछ परिवर्तित करना चाहते हैं। अगर आपको मुझसे अधिक जानकारी चाहिए तो कृपया मुझे बताएं।

मुख्य परिवर्तित वर्ग:

public class mainViewController2 extends Fragment { 
    private static final String TAG = mainViewController2.class.getSimpleName(); 
    private ListView listView; 
    private FeedListAdapter listAdapter; 
    private List<FeedItem> feedItems; 
    private String URL_FEED = "http://api.androidhive.info/feed/feed.json"; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
        Bundle savedInstanceState) { 

     View v = inflater.inflate(R.layout.mainviewcontroller2_fragment, container, false); 

     listView = (ListView) v.findViewById(R.id.list); 

     feedItems = new ArrayList<FeedItem>(); 


     //where the error shows up? 
     listAdapter = new FeedListAdapter(feedItems); 
     listView.setAdapter(listAdapter); 



     // We first check for cached request 
     Cache cache = AppController.getInstance().getRequestQueue().getCache(); 
     Entry entry = cache.get(URL_FEED); 
     if (entry != null) { 
      // fetch the data from cache 
      try { 
       String data = new String(entry.data, "UTF-8"); 
       try { 
        parseJsonFeed(new JSONObject(data)); 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 
      } catch (UnsupportedEncodingException e) { 
       e.printStackTrace(); 
      } 

     } else { 
      // making fresh volley request and getting json 
      JsonObjectRequest jsonReq = new JsonObjectRequest(Method.GET, 
        URL_FEED, null, new Response.Listener<JSONObject>() { 

         @Override 
         public void onResponse(JSONObject response) { 
          VolleyLog.d(TAG, "Response: " + response.toString()); 
          if (response != null) { 
           parseJsonFeed(response); 
          } 
         } 
        }, new Response.ErrorListener() { 

         @Override 
         public void onErrorResponse(VolleyError error) { 
          VolleyLog.d(TAG, "Error: " + error.getMessage()); 
         } 
        }); 

      // Adding request to volley request queue 
      AppController.getInstance().addToRequestQueue(jsonReq); 
     } 

     return v; 
    } 

    /** 
    * Parsing json reponse and passing the data to feed view list adapter 
    * */ 
    private void parseJsonFeed(JSONObject response) { 
     try { 
      JSONArray feedArray = response.getJSONArray("feed"); 

      for (int i = 0; i < feedArray.length(); i++) { 
       JSONObject feedObj = (JSONObject) feedArray.get(i); 

       FeedItem item = new FeedItem(); 
       item.setId(feedObj.getInt("id")); 
       item.setName(feedObj.getString("name")); 

       // Image might be null sometimes 
       String image = feedObj.isNull("image") ? null : feedObj 
         .getString("image"); 
       item.setImge(image); 
       item.setStatus(feedObj.getString("status")); 
       item.setProfilePic(feedObj.getString("profilePic")); 
       item.setTimeStamp(feedObj.getString("timeStamp")); 

       // url might be null sometimes 
       String feedUrl = feedObj.isNull("url") ? null : feedObj 
         .getString("url"); 
       item.setUrl(feedUrl); 

       feedItems.add(item); 
      } 

      // notify data changes to list adapater 
      listAdapter.notifyDataSetChanged(); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

FeedListAdapter:

public class FeedListAdapter extends BaseAdapter { 
    private Activity activity; 
    private LayoutInflater inflater; 
    private List<FeedItem> feedItems; 

    Context context; 

    ImageLoader imageLoader; 

    public FeedListAdapter(Context ctx,List<FeedItem> feedItems) { 
     this.context= ctx; 
     this.feedItems = feedItems; 
     imageLoader = AppController.getInstance().getImageLoader(); 
     inflater = LayoutInflater.from(context); 
    } 

    @Override 
    public int getCount() { 
     return feedItems.size(); 
    } 

    @Override 
    public Object getItem(int location) { 
     return feedItems.get(location); 
    } 
     @Override 
     public long getItemId(int position) { 
      return position; 
     } 

     @SuppressLint("InflateParams") 
     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 

      if (inflater == null) 
       inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      if (convertView == null) 
       convertView = inflater.inflate(R.layout.feed_item, null); 

      if (imageLoader == null) 
       imageLoader = AppController.getInstance().getImageLoader(); 

      TextView name = (TextView) convertView.findViewById(R.id.name); 
      TextView timestamp = (TextView) convertView 
        .findViewById(R.id.timestamp); 
      TextView statusMsg = (TextView) convertView 
        .findViewById(R.id.txtStatusMsg); 
      TextView url = (TextView) convertView.findViewById(R.id.txtUrl); 
      NetworkImageView profilePic = (NetworkImageView) convertView 
        .findViewById(R.id.profilePic); 
      FeedImageView feedImageView = (FeedImageView) convertView 
        .findViewById(R.id.feedImage1); 

      FeedItem item = feedItems.get(position); 

      name.setText(item.getName()); 

      // Converting timestamp into x ago format 
      CharSequence timeAgo = DateUtils.getRelativeTimeSpanString(
        Long.parseLong(item.getTimeStamp()), 
        System.currentTimeMillis(), DateUtils.SECOND_IN_MILLIS); 
      timestamp.setText(timeAgo); 

      // Chcek for empty status message 
      if (!TextUtils.isEmpty(item.getStatus())) { 
       statusMsg.setText(item.getStatus()); 
       statusMsg.setVisibility(View.VISIBLE); 
      } else { 
       // status is empty, remove from view 
       statusMsg.setVisibility(View.GONE); 
      } 

      // Checking for null feed url 
      if (item.getUrl() != null) { 
       url.setText(Html.fromHtml("<a href=\"" + item.getUrl() + "\">" 
         + item.getUrl() + "</a> ")); 

       // Making url clickable 
       url.setMovementMethod(LinkMovementMethod.getInstance()); 
       url.setVisibility(View.VISIBLE); 
      } else { 
       // url is null, remove from the view 
       url.setVisibility(View.GONE); 
      } 

      // user profile pic 
      profilePic.setImageUrl(item.getProfilePic(), imageLoader); 

      // Feed image 
      if (item.getImge() != null) { 
       feedImageView.setImageUrl(item.getImge(), imageLoader); 
       feedImageView.setVisibility(View.VISIBLE); 
       feedImageView 
         .setResponseObserver(new FeedImageView.ResponseObserver() { 
          @Override 
          public void onError() { 
          } 

          @Override 
          public void onSuccess() { 
          } 
         }); 
      } else { 
       feedImageView.setVisibility(View.GONE); 
      } 

      return convertView; 
     } 

    } 

LogCat त्रुटियों:

09-06 02:51:55.823: E/AndroidRuntime(8279): FATAL EXCEPTION: main 
09-06 02:51:55.823: E/AndroidRuntime(8279): Process: com.rynovation.kline, PID: 8279 
09-06 02:51:55.823: E/AndroidRuntime(8279): java.lang.NullPointerException 
09-06 02:51:55.823: E/AndroidRuntime(8279):  at androidFeedClasses.FeedListAdapter.<init>(FeedListAdapter.java:35) 
09-06 02:51:55.823: E/AndroidRuntime(8279):  at com.rynovation.kline.mainViewController2.onCreateView(mainViewController2.java:51) 
09-06 02:51:55.823: E/AndroidRuntime(8279):  at android.app.Fragment.performCreateView(Fragment.java:1700) 
09-06 02:51:55.823: E/AndroidRuntime(8279):  at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:890) 
09-06 02:51:55.823: E/AndroidRuntime(8279):  at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062) 
09-06 02:51:55.823: E/AndroidRuntime(8279):  at android.app.BackStackRecord.run(BackStackRecord.java:684) 
09-06 02:51:55.823: E/AndroidRuntime(8279):  at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1453) 
09-06 02:51:55.823: E/AndroidRuntime(8279):  at android.app.FragmentManagerImpl$1.run(FragmentManager.java:443) 
09-06 02:51:55.823: E/AndroidRuntime(8279):  at android.os.Handler.handleCallback(Handler.java:733) 
09-06 02:51:55.823: E/AndroidRuntime(8279):  at android.os.Handler.dispatchMessage(Handler.java:95) 
09-06 02:51:55.823: E/AndroidRuntime(8279):  at android.os.Looper.loop(Looper.java:146) 
09-06 02:51:55.823: E/AndroidRuntime(8279):  at android.app.ActivityThread.main(ActivityThread.java:5487) 
09-06 02:51:55.823: E/AndroidRuntime(8279):  at java.lang.reflect.Method.invokeNative(Native Method) 
09-06 02:51:55.823: E/AndroidRuntime(8279):  at java.lang.reflect.Method.invoke(Method.java:515) 
09-06 02:51:55.823: E/AndroidRuntime(8279):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283) 
09-06 02:51:55.823: E/AndroidRuntime(8279):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099) 
09-06 02:51:55.823: E/AndroidRuntime(8279):  at dalvik.system.NativeStart.main(Native Method) 
+0

आपका एडाप्टर जगह पर है। ViewHolder पैटर्न के बारे में पढ़ें और कुछ समान बनाने की कोशिश करें। यहां Google संस्करण है लेकिन उदाहरणों के लिए भी खोज करने का प्रयास करें: http://developer.android.com/training/improving-layouts/smooth-scrolling.html –

उत्तर

1

त्रुटि को देखते हुए, ऐसा लगता है जैसे आप getActivity()onCreateView() अंदर कॉल कर रहे हैं। आपको गतिविधि को onActivityCreated में प्राप्त करना चाहिए, जहां इसे शून्य नहीं होना चाहिए।

listView = (ListView) getActivity().findViewById(R.id.list); 

से

+0

आप क्या सुझाव देते हैं? यह एक टुकड़ा होना है, गतिविधि नहीं। यदि संभव हो तो क्या आप एक उदाहरण लिख सकते हैं? – user2793987

+0

क्या आप समझा सकते हैं कि आपको सूची दृश्य खोजने के लिए गतिविधि में क्यों पहुंचने की आवश्यकता है? क्या सूचीदृश्य R.layout.mainviewcontroller2_fragment के अंदर नहीं है? – bph

+0

क्या आप अपडेट किए गए कोड और लॉगकैट त्रुटि को देख सकते हैं? – user2793987

1

बदलें इस

listView = (ListView)v.findViewById(R.id.list); 

को इसका कारण यह है getActivity() आम तौर पर टुकड़ा में एक Context के रूप में प्रयोग किया जाता है। जबकि आप अपने UI फ्रेगमेंट में तत्वों के लिए आईडी पा रहे हैं तो आपको View's ऑब्जेक्ट का संदर्भ देना होगा जो onCreateView() विधि में वापस आ जाएगा।

अद्यतन:

बदलें अपनी एडाप्टर की तरह,

listAdapter = new FeedListAdapter(getActivity(),feedItems); 
अब अपने निर्माता

ImageLoader imageLoader; 

public FeedListAdapter(Context ctx,List<FeedItem> feedItems) { 
    this.context= ctx; 
    this.feedItems = feedItems; 
    imageLoader = AppController.getInstance().getImageLoader() 
} 
अब अपने एडाप्टर वर्ग उपयोग एक Context रूप context चर में

में

+0

धन्यवाद, लेकिन मुझे अभी भी एक ही त्रुटि मिलती है। मुझे लगता है कि यह FeedListAdapter में हो सकता है? – user2793987

+0

ठीक है, मैंने आपके परिवर्तन को प्रतिबिंबित करने के लिए भी अपनी पोस्ट अपडेट की है। हालांकि, समस्या अब कन्स्ट्रक्टर में प्रतीत होती है। कृपया ऊपर अद्यतन अद्यतन लॉग देखें। – user2793987

+0

अपने एडाप्टर कन्स्ट्रक्टर – Piyush

26

मुझे लगता है कि आप अपनी मेनिफेस्ट फ़ाइल में एक साधारण कोड चूक गए हैं। आपका AppController पैकेज Application बढ़ाता है, इसलिए आपके मैनिफेस्ट में एप्लिकेशन टैग AppController खोज रहा है लेकिन यह खोजने में सक्षम नहीं है।

बस में इस सरल कोड लिखें अपने AndroidManifest.xml

android:name = your.package.AppController

+1

महोदय, आप समय बचाने वाले हैं। –

11

एक छोटी सी देर हो सकता है, लेकिन user3902144 के जवाब देने के लिए एक प्रतिनिधि जवाब:

इस सवाल का इसी प्रकार उत्तर: Link

आप हो सकता है कि इसे आपके मैनिफेस्ट से याद किया हो:

<application 
     android:name="<package-name>.app.AppController" // <-- this one 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme"> 

यही कारण है कि क्रिएट को कभी नहीं बुलाया गया और mInstance शून्य है।

आशा इस मदद करता है :)

+0

धन्यवाद! बहुत देर हो चुकी है हाहा – CodeGuru

+0

बहुत देर से जवाब ने मेरी मदद की :-) –

+0

यदि आप मल्टीडेक्स नहीं कर सकते हैं? – delive

0

अपने सभी पैरामीटर की जांच करें ध्यान से,, पैरामीटर में किसी भी शून्य मान भेजने के लिए यकीन नहीं करता है, तो कुछ संग्रहीत मानों का उपयोग कर नीचे दिए गए जैसे हालत का उपयोग करते हैं:

@Override 
protected Map<String, String> getParams() { 
Map<String, String> params = new HashMap<String, String>(); 
if(paramValue!= null) 
    params.put("paramKey", paramValue); 
    else 
    params.put("paramKey", "anyOtherDefaultValue"); 
return params; 
} 
संबंधित मुद्दे