0

我有一個recyclerView,其中包含onCreate中流行的電影。我通過按下選項菜單爲新數據集(頂級電影)發送新的獲取請求,並且使用新數據記錄正確的數據,從而實現了它的工作。數據返回後,我確保將全局arrayList變量設置爲返回數據集的變量。但問題是,我調用「setupAdapter()」方法後,我的視圖沒有更新,該方法接受mItems(全局arrayList變量應該已被設置爲新的數據集)的參數。正在更新RecyclerView

public class FetchItemsTask extends AsyncTask<Void,Void,List<MovieItem>> { 
    private String mQuery; 
    public FetchItemsTask(String query) { 
     mQuery = query; 
    } 

@Override 
protected List<MovieItem> doInBackground(Void... params) { 
    return new MovieFetchr().fetchItems(mQuery); 
} 

@Override 
protected void onPostExecute(List<MovieItem> items) { 
    mItems = items; 
    for (int i = 0; i < mItems.size(); i++) { 
     Log.i("MovieInGalleryFragment", mItems.get(i).getCaption()); 
    } 

    setupAdapter(); 

} 

} 

這是setUpAdapter方法:

private void setupAdapter() { 

      if (isAdded()) { 
       mPhotoRecyclerView.setAdapter(new PhotoAdapter(mItems)); 

      } 

     } 

而這正是我有mItems:

public class PhotoGalleryFragment extends Fragment { 

    private static final String TAG = "PhotoGalleryFragment"; 

    private RecyclerView mPhotoRecyclerView; 
    private List<MovieItem> mItems = new ArrayList<>(); 
    private ThumbnailDownloader<PhotoHolder> mThumbnailDownloader; 

這是完整的代碼

public class PhotoGalleryFragment extends Fragment { 

    private static final String TAG = "PhotoGalleryFragment"; 

    private RecyclerView mPhotoRecyclerView; 
    private List<MovieItem> mItems = new ArrayList<>(); 
    private ThumbnailDownloader<PhotoHolder> mThumbnailDownloader; 



    public static PhotoGalleryFragment newInstance() { 
     return new PhotoGalleryFragment(); 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setRetainInstance(true); 
     updateItems("popular"); 
     Handler responseHandler = new Handler(); 
     mThumbnailDownloader = new ThumbnailDownloader<>(responseHandler); 
     mThumbnailDownloader.setThumbnailDownloadListener(
       new ThumbnailDownloader.ThumbnailDownloadListener<PhotoHolder>() { 
        @Override 
        public void onThumbnailDownloaded(PhotoHolder photoHolder, Bitmap bitmap) { 
         Drawable drawable = new BitmapDrawable(getResources(), bitmap); 
         photoHolder.bindDrawable(drawable); 
        } 
       } 
     ); 

     mThumbnailDownloader.start();; 
     mThumbnailDownloader.getLooper(); 
     Log.i(TAG, "Background thread started"); 

    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.fragment_photo_gallery, container, false); 
     mPhotoRecyclerView = (RecyclerView) v 
       .findViewById(R.id.fragment_photo_gallery_recycler_view); 
     mPhotoRecyclerView.setLayoutManager(new GridLayoutManager(getActivity(), 5)); 
     setupAdapter(); 

     return v; 
    } 

    @Override 
    public void onDestroyView() { 
     super.onDestroyView(); 
     mThumbnailDownloader.clearQueue(); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     mThumbnailDownloader.quit(); 
     Log.i(TAG, "Background thread destroyed"); 
    } 

    private void setupAdapter() { 

     if (isAdded()) { 
      mPhotoRecyclerView.setAdapter(new PhotoAdapter(mItems)); 

     } 

    } 
    void updateItems(String query){ 
     mItems.clear(); 
     new FetchItemsTask(query).execute(); 
     mPhotoRecyclerView.getAdapter().notifyDataSetChanged(); 
    } 
    private class PhotoHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ 
     private ImageView mItemImageView; 
     private MovieItem mMovieItem; 


     public PhotoHolder(View itemView) { 
      super(itemView); 

      mItemImageView = (ImageView) itemView 
        .findViewById(R.id.fragment_photo_gallery_image_view); 
      itemView.setOnClickListener(this); 
     } 

     public void bindDrawable(Drawable drawable) { 
      mItemImageView.setImageDrawable(drawable); 
     } 

     public void bindMovieItem(MovieItem movieItem){ 
      mMovieItem = movieItem; 
     } 

     @Override 
     public void onClick(View v) { 
      Intent intent = new Intent(getActivity(), ViewPhotoDetailsActivity.class); 
      intent.putExtra("Movie Title", mMovieItem.getCaption()); 
      intent.putExtra("Movie Poster", mMovieItem.getUrl()); 
      intent.putExtra("Movie Plot", mMovieItem.getPlot()); 
      intent.putExtra("Movie Rating", mMovieItem.getRating()); 
      intent.putExtra("Release Date", mMovieItem.getRelease_date()); 
      startActivity(intent); 
     } 
    } 

    private class PhotoAdapter extends RecyclerView.Adapter<PhotoHolder> { 

     private List<MovieItem> mMovieItems; 

     public PhotoAdapter(List<MovieItem> movieItems) { 
      mMovieItems = movieItems; 
     } 

     @Override 
     public PhotoHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { 
      LayoutInflater inflater = LayoutInflater.from(getActivity()); 
      View view = inflater.inflate(R.layout.list_item_gallery, viewGroup, false); 
      return new PhotoHolder(view); 
     } 

     @Override 
     public void onBindViewHolder(PhotoHolder photoHolder, int position) { 
      MovieItem movieItem = mMovieItems.get(position); 
      photoHolder.bindMovieItem(movieItem); 
      Drawable placeholder = getResources().getDrawable(R.drawable.bill_up_close); 
      photoHolder.bindDrawable(placeholder); 
      mThumbnailDownloader.queueThumbnail(photoHolder, movieItem.getUrl()); 
     } 

     @Override 
     public int getItemCount() { 
      return mMovieItems.size(); 
     } 
    } 

    public class FetchItemsTask extends AsyncTask<Void,Void,List<MovieItem>> { 
     private String mQuery; 
     public FetchItemsTask(String query) { 
      mQuery = query; 
     } 

     @Override 
     protected List<MovieItem> doInBackground(Void... params) { 
      return new MovieFetchr().fetchItems(mQuery); 
     } 

     @Override 
     protected void onPostExecute(List<MovieItem> items) { 
      mItems = items; 
      for (int i = 0; i < mItems.size(); i++) { 
       Log.i("MovieInGalleryFragment", mItems.get(i).getCaption()); 
      } 

      setupAdapter(); 

     } 

    } 



} 

回答

0

嘗試這種情況: -

創建一個專用變量:

private PhotoAdapter adaptor; 

在的onCreate,添加添加2行以上setupAdapter()

mPhotoRecyclerView.setLayoutManager(new GridLayoutManager(getActivity(), 5));  

adaptor = new PhotoAdapter(mItems); 
mPhotoRecyclerView.setAdapter(adaptor); 
setupAdapter(); 

並修改方法是這樣的:

private void setupAdapter() { 
     if (isAdded()) { 
      adaptor.notifyDataSetChanged(); 
     } 
    } 

這裏是全碼:

package com.benwong.popularmovies1; 

import android.content.Intent; 
import android.graphics.Bitmap; 
import android.graphics.drawable.BitmapDrawable; 
import android.graphics.drawable.Drawable; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.os.Handler; 
import android.support.v4.app.Fragment; 
import android.support.v7.widget.GridLayoutManager; 
import android.support.v7.widget.RecyclerView; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ImageView; 

import java.util.ArrayList; 
import java.util.List; 

/** 
* Created by benwong on 2016-02-02. 
*/ 
public class PhotoGalleryFragment extends Fragment { 

    private static final String TAG = "PhotoGalleryFragment"; 

    private RecyclerView mPhotoRecyclerView; 
    private List<MovieItem> mItems = new ArrayList<>(); 
    private ThumbnailDownloader<PhotoHolder> mThumbnailDownloader; 
    private PhotoAdapter mAdapter; 



    public static PhotoGalleryFragment newInstance() { 
     return new PhotoGalleryFragment(); 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setRetainInstance(true); 
//  updateItems("popular"); 
     new FetchItemsTask("popular").execute(); 
     Handler responseHandler = new Handler(); 
     mThumbnailDownloader = new ThumbnailDownloader<>(responseHandler); 
     mThumbnailDownloader.setThumbnailDownloadListener(
       new ThumbnailDownloader.ThumbnailDownloadListener<PhotoHolder>() { 
        @Override 
        public void onThumbnailDownloaded(PhotoHolder photoHolder, Bitmap bitmap) { 
         try { 
         Drawable drawable = new BitmapDrawable(getResources(), bitmap); 
         photoHolder.bindDrawable(drawable); 
        } catch (Exception ex) { 
         ex.printStackTrace(); 
        } 
        } 
       } 
     ); 

     mThumbnailDownloader.start();; 
     mThumbnailDownloader.getLooper(); 
     Log.i(TAG, "Background thread started"); 

    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.fragment_photo_gallery, container, false); 
     mPhotoRecyclerView = (RecyclerView) v 
       .findViewById(R.id.fragment_photo_gallery_recycler_view); 
     mPhotoRecyclerView.setLayoutManager(new GridLayoutManager(getActivity(), 5)); 
     mAdapter = new PhotoAdapter(); 
     mPhotoRecyclerView.setAdapter(mAdapter); 


     setupAdapter(); 

     return v; 
    } 

    @Override 
    public void onDestroyView() { 
     super.onDestroyView(); 
     mThumbnailDownloader.clearQueue(); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     mThumbnailDownloader.quit(); 
     Log.i(TAG, "Background thread destroyed"); 
    } 

    private void setupAdapter() { 

     if (isAdded()) { 
//   mPhotoRecyclerView.setAdapter(new PhotoAdapter(mItems)); 
      mAdapter.notifyDataSetChanged(); 

     } 

    } 
    void updateItems(String query){ 
     mItems.clear(); 
     new FetchItemsTask(query).execute(); 
//  mPhotoRecyclerView.getAdapter().notifyDataSetChanged(); 

    } 
    private class PhotoHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ 
     private ImageView mItemImageView; 
     private MovieItem mMovieItem; 


     public PhotoHolder(View itemView) { 
      super(itemView); 

      mItemImageView = (ImageView) itemView 
        .findViewById(R.id.fragment_photo_gallery_image_view); 
      itemView.setOnClickListener(this); 
     } 

     public void bindDrawable(Drawable drawable) { 
      mItemImageView.setImageDrawable(drawable); 
     } 

     public void bindMovieItem(MovieItem movieItem){ 
      mMovieItem = movieItem; 
     } 

     @Override 
     public void onClick(View v) { 
      Intent intent = new Intent(getActivity(), ViewPhotoDetailsActivity.class); 
      intent.putExtra("Movie Title", mMovieItem.getCaption()); 
      intent.putExtra("Movie Poster", mMovieItem.getUrl()); 
      intent.putExtra("Movie Plot", mMovieItem.getPlot()); 
      intent.putExtra("Movie Rating", mMovieItem.getRating()); 
      intent.putExtra("Release Date", mMovieItem.getRelease_date()); 
      startActivity(intent); 
     } 
    } 

    private class PhotoAdapter extends RecyclerView.Adapter<PhotoHolder> { 

//  private List<MovieItem> mMovieItems; 

     public PhotoAdapter() { 
//   mMovieItems = movieItems; 
     } 

     @Override 
     public PhotoHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { 
      LayoutInflater inflater = LayoutInflater.from(getActivity()); 
      View view = inflater.inflate(R.layout.list_item_gallery, viewGroup, false); 
      return new PhotoHolder(view); 
     } 

     @Override 
     public void onBindViewHolder(PhotoHolder photoHolder, int position) { 
      MovieItem movieItem = mItems.get(position); 
      photoHolder.bindMovieItem(movieItem); 
      Drawable placeholder = getResources().getDrawable(R.drawable.bill_up_close); 
      photoHolder.bindDrawable(placeholder); 
      mThumbnailDownloader.queueThumbnail(photoHolder, movieItem.getUrl()); 
     } 

     @Override 
     public int getItemCount() { 
      return mItems.size(); 
     } 

    } 

    public class FetchItemsTask extends AsyncTask<Void,Void,List<MovieItem>> { 
     private String mQuery; 
     public FetchItemsTask(String query) { 
      mQuery = query; 
     } 

     @Override 
     protected List<MovieItem> doInBackground(Void... params) { 
      return new MovieFetchr().fetchItems(mQuery); 
     } 

     @Override 
     protected void onPostExecute(List<MovieItem> items) { 
      mItems = items; 
      for (int i = 0; i < mItems.size(); i++) { 
       Log.i("MovieInGalleryFragment", mItems.get(i).getCaption()); 
      } 
      setupAdapter(); 
     } 
    } 
} 

在PhotoGalleryActivity:

package com.benwong.popularmovies1; 

import android.support.v4.app.Fragment; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.widget.Toast; 

/** 
* Created by benwong on 2016-02-02. 
*/ 

public class PhotoGalleryActivity extends SingleFragmentActivity { 

    @Override 
    protected Fragment createFragment() { 
     return PhotoGalleryFragment.newInstance(); 
    } 

    // public static Intent newIntent(Context context) { 
//  return new Intent(context, PhotoGalleryActivity.class); 
// } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.topRatedMovies) { 
      Toast.makeText(getApplicationContext(), "Top Rated Movie selected", Toast.LENGTH_LONG).show(); 
      PhotoGalleryFragment photoGalleryFragment = (PhotoGalleryFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_container); 
      photoGalleryFragment.updateItems("top-rated"); 
      return true; 
     } 

//  if (id == R.id.menu_search) { 
//   Intent intent = new Intent(this, SearchActivity.class); 
//   startActivity(intent); 
//   return true; 
//  } 

     return super.onOptionsItemSelected(item); 
    } 

} 
+0

感謝您的幫助。當我嘗試你的代碼時,它不會在onCreate的視圖中加載任何內容,但它會記錄所有正確的數據。當我選擇「評分最高的」電影選項菜單時,它會加載正確的數據並記錄下來,但不會顯示在視圖中。 –

+0

請替換代碼「mPhotoRecyclerView.setAdapter(new PhotoAdapter(mItems));」通過「adaptor.notifyDataSetChanged();」 (所有使用該行的地方) – Sabari

+0

並且請確保setupAdaptor()中的行「adaptor.notifyDataSetChanged();」正在執行或不執行。也許「if(isAdded())」返回false – Sabari

1

嘗試調用

mPhotoRecyclerView.getAdapter().notifyDatasetChanged();

而且,你不需要創建PhotoAdapter每次你得到新的數據的時間。您可以獲取PhotoAdapter對象,爲其指定新項目並調用notifyDataSetChanged()函數。

+0

顯示java.lang.NullPointerException:嘗試調用虛擬方法「android.support.v7.widget.RecyclerView $適配器android.support。當我嘗試調用mPhotoRecyclerView.getAdapter()。notifyDatasetChanged();當我嘗試調用mPhotoRecyclerView.getAdapter()。 –

+0

@BenWong你很快就打電話給你。這是說你的'mPhotoRecycler'爲空。 –