2016-11-13 144 views
-1
enter code here` 

公共类MainActivity延伸AppCompatActivity {为什么我越来越尝试调用空对象引用的接口方法'int java.util.List.size()'?

private RecyclerView recyclerView; 
private AlbumAdapter adapter; 
public List<Album> list; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 


    recyclerView = (RecyclerView) findViewById(R.id.recycler_view); 

    new MovieAsyncTask().execute(""); 






    adapter = new AlbumAdapter(this, list); 
    recyclerView.setLayoutManager(new GridLayoutManager(this, 2)); 
    recyclerView.setAdapter(adapter); 
} 

public class MovieAsyncTask extends AsyncTask<String,Void,List<Album> > 
{ 


    public List<Album> getMovieDataFromJson(String str) 
    { 
     List<Album> albumArrayList = new ArrayList<>(); 
     String ImageUrilink = "http://image.tmdb.org/t/p/w342/"; 
     final String RELEASE_DATE = "release_date"; 
     final String RATING = "vote_average"; 
     final String POSTER_PATH = "poster_path"; 
     try { 
      JSONObject jsonObject = new JSONObject(str); 
      JSONArray jsonArray = jsonObject.getJSONArray("results"); 
      for(int i=0;i<jsonArray.length();i++) 
      { 
       JSONObject jsonObject1 = jsonArray.getJSONObject(i); 
       String releaseDate = jsonObject1.getString(RELEASE_DATE); 
       String rating = jsonObject1.getDouble(RATING)+"/10"; 
       String image = ImageUrilink+jsonObject1.getString(POSTER_PATH); 
       albumArrayList.add(new Album(rating,releaseDate,image)); 
      } 
      String size = jsonArray.length()+" ITEM"; 
      Log.v("SIZE OF ALBUMLIST = ",size); 

      return albumArrayList; 
     } 
     catch (JSONException j) 
     { 
      j.printStackTrace(); 
     } 
     return null; 
    } 

    @Override 
    protected List<Album> doInBackground(String... params) { 


     BufferedReader reader = null; 
     HttpURLConnection httpURLConnection = null; 
     String readJson ; 

     final String Sortby = "sort_by"; 
     final String APPID_PARAM = "api_key"; 


     try { 


      String movieUri = "https://api.themoviedb.org/3/discover/movie?"; 
      Uri buildUri = Uri.parse(movieUri).buildUpon().appendQueryParameter(Sortby,"popularity.desc") 
        .appendQueryParameter(APPID_PARAM,BuildConfig.MOVIE_API_KEY).build(); 

      URL url = new URL(buildUri.toString()); 

      Log.v("LOG_TAG",buildUri.toString()); 

      httpURLConnection = (HttpURLConnection)url.openConnection(); 
      httpURLConnection.setRequestMethod("GET"); 
      httpURLConnection.connect(); 

      InputStream inputStream = httpURLConnection.getInputStream(); 

      StringBuffer stringBuffer = new StringBuffer(); 
      if(inputStream==null) 
      { 
       return null; 
      } 

      reader = new BufferedReader(new InputStreamReader(inputStream)); 

      String line; 
      while ((line = reader.readLine()) != null) { 
       // Since it's JSON, adding a newline isn't necessary (it won't affect parsing) 
       // But it does make debugging a *lot* easier if you print out the completed 
       // buffer for debugging. 
       stringBuffer.append(line + "\n"); 
      } 
      if(stringBuffer==null) 
      { 
       return null; 
      } 

      readJson = stringBuffer.toString(); 
      return getMovieDataFromJson(readJson); 

     }catch (IOException I) 
     { 
      I.printStackTrace(); 
     } 
     finally { 
      if(httpURLConnection!=null) 
      { 
       httpURLConnection.disconnect(); 
      } 
      if(reader!=null) 
      { 
       try { 
        reader.close(); 
       }catch(IOException I) 
       { 
        I.printStackTrace(); 
       } 
      } 
     } 

     return null; 
    } 

    @Override 
    protected void onPostExecute(List<Album> albumList) { 

     if(!albumList.isEmpty()) 
     { 
      super.onPostExecute(albumList); 
      list = albumList; 
     } 

    } 
} 

}

公共类AlbumAdapter延伸RecyclerView.Adapter {

private Context mcontext; 
private List<Album> albumList; 



public class MyViewHolder extends RecyclerView.ViewHolder { 
    public TextView rating, releaseDate; 
    public ImageView thumbnail, overflow; 

    public MyViewHolder(View view) { 
     super(view); 
     rating = (TextView) view.findViewById(R.id.title); 
     releaseDate = (TextView) view.findViewById(R.id.count); 
     thumbnail = (ImageView) view.findViewById(R.id.thumbnails); 
     overflow = (ImageView) view.findViewById(R.id.overflow); 
    } 
} 

public AlbumAdapter(Context mcontext1, List<Album> albumList1) { 
    mcontext = mcontext1; 
    albumList = albumList1; 
} 

@Override 
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View view = LayoutInflater.from(mcontext).inflate(R.layout.album_card, parent, false); 
    return new MyViewHolder(view); 
} 

@Override 
public void onBindViewHolder(final MyViewHolder holder, int position) { 

    Album album = albumList.get(position); 
    holder.rating.setText(album.getRating()); 
    holder.releaseDate.setText(album.getReleaseDate()+" Songs "); 

    Picasso.with(mcontext).load(album.getThumbnail()).into(holder.thumbnail); 

    Log.v("IMAGE_URL",album.getThumbnail()); 

    holder.overflow.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      showPopUp(holder.overflow); 
     } 
    }); 
} 

/** 
* showing popup menu wher tapping on 3 dots 
*/ 
private void showPopUp(View view) 
{ 
    PopupMenu popupMenu = new PopupMenu(mcontext,view); 
    MenuInflater inflater = popupMenu.getMenuInflater(); 
    inflater.inflate(R.menu.menu_album,popupMenu.getMenu()); 
    popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { 
     @Override 
     public boolean onMenuItemClick(MenuItem item) { 

      switch (item.getItemId()) 
      { 
       case R.id.action_add_favourite : 
        Toast.makeText(mcontext,"Add to favourite",Toast.LENGTH_SHORT).show(); 
        return true; 
       case R.id.action_play_next : 
        Toast.makeText(mcontext,"Play next",Toast.LENGTH_SHORT).show(); 
        return true; 
      } 
      return false; 
     } 
    }); 
} 
@Override 
public int getItemCount() { 
    return albumList.size(); 
} 

}

异常

11-13 15:07:00.587 26661-26661/com.example.sanket3125.cardgridviewexample E/AndroidRuntime: FATAL EXCEPTION: main 
Process: com.example.sanket3125.cardgridviewexample, PID: 26661 
java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference 
    at com.example.sanket3125.cardgridviewexample.AlbumAdapter.getItemCount(AlbumAdapter.java:106) 
    at android.support.v7.widget.RecyclerView.dispatchLayoutStep1(RecyclerView.java:3225) 
    at android.support.v7.widget.RecyclerView.onMeasure(RecyclerView.java:2837) 
    at android.view.View.measure(View.java:18811) 
    at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:716) 
    at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:462) 
    at android.view.View.measure(View.java:18811) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5952) 
    at android.support.design.widget.CoordinatorLayout.onMeasureChild(CoordinatorLayout.java:700) 
    at android.support.design.widget.HeaderScrollingViewBehavior.onMeasureChild(HeaderScrollingViewBehavior.java:90) 
    at android.support.design.widget.AppBarLayout$ScrollingViewBehavior.onMeasureChild(AppBarLayout.java:1364) 
    at android.support.design.widget.CoordinatorLayout.onMeasure(CoordinatorLayout.java:765) 
    at android.view.View.measure(View.java:18811) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5952) 
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) 
    at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:135) 
    at android.view.View.measure(View.java:18811) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5952) 
    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1465) 
    at android.widget.LinearLayout.measureVertical(LinearLayout.java:748) 
    at android.widget.LinearLayout.onMeasure(LinearLayout.java:630) 
    at android.view.View.measure(View.java:18811) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5952) 
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) 
    at android.view.View.measure(View.java:18811) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5952) 
    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1465) 
    at android.widget.LinearLayout.measureVertical(LinearLayout.java:748) 
    at android.widget.LinearLayout.onMeasure(LinearLayout.java:630) 
    at android.view.View.measure(View.java:18811) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5952) 
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) 
    at com.android.internal.policy.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2645) 
    at android.view.View.measure(View.java:18811) 
    at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2127) 
    at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1243) 
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1535) 
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1134) 
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6045) 
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:860) 
    at android.view.Choreographer.doCallbacks(Choreographer.java:672) 
    at android.view.Choreographer.doFrame(Choreographer.java:608) 
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:846) 
    at android.os.Handler.handleCallback(Handler.java:739) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:148) 
    at android.app.ActivityThread.main(ActivityThread.java:5441) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:738) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:628) 

回答

0

您需要在适配器使用前初始化的onCreate()的List变量。

new MovieAsyncTask().execute(""); 
list = new ArrayList<Album>(); 
adapter = new AlbumAdapter(this, list); 

而且,一旦你有你的结果在onPostExecute()方法,你需要告诉适配器重新加载列表:

@Override 
protected void onPostExecute(List<Album> albumList) { 

    if(albumList != null && !albumList.isEmpty()) 
    { 
     super.onPostExecute(albumList); 
     list = albumList; 
     adapter.notifyDataSetChanged(); 
    } 

} 
相关问题