2015-11-21 52 views
-2

只有第一個片段用圖像填充,第二個片段是空白的。我爲這兩個片段使用了相同的適配器。我不確定問題在哪裏。在TabLayout中使用相同的適配器的兩個片段不起作用

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 
    // Create the adapter that will return a fragment for each of the three 
    // primary sections of the activity. 
    mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); 
    mSectionsPagerAdapter.addFragment(PopularMoviesFragment.newInstance(SORT_POPULAR), "MOST POPULAR"); 
    mSectionsPagerAdapter.addFragment(RatingMoviesFragment.newInstance(SORT_RATING), "TOP RATING"); 

    // Set up the ViewPager with the sections adapter. 
    mViewPager = (ViewPager) findViewById(R.id.container); 
    mViewPager.setAdapter(mSectionsPagerAdapter); 

    TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs); 
    tabLayout.setupWithViewPager(mViewPager); 

} 

public void switchToDetail(Intent intent){ 
    startActivity(intent); 
} 

/** 
* A {@link FragmentPagerAdapter} that returns a fragment corresponding to 
* one of the sections/tabs/pages. 
*/ 
static class SectionsPagerAdapter extends FragmentPagerAdapter { 

    private final List<Fragment> mFragments = new ArrayList<>(); 
    private final List<String> mFragmentTitles = new ArrayList<>(); 

    public SectionsPagerAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    public void addFragment(Fragment fragment, String title) { 
     mFragments.add(fragment); 
     mFragmentTitles.add(title); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     return mFragments.get(position); 
    } 

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

    @Override 
    public CharSequence getPageTitle(int position) { 
     return mFragmentTitles.get(position); 
    } 
} 

}

首先片段

public static PopularMoviesFragment newInstance(String sort) { 
    PopularMoviesFragment fragment = new PopularMoviesFragment(); 
    Bundle args = new Bundle(); 
    args.putString("sort", sort); 
    fragment.setArguments(args); 
    return fragment; 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    sortOrder = getArguments().getString("sort"); 
    mContext = getActivity(); 

    if (savedInstanceState != null) { 
     mPopularList = savedInstanceState.getParcelableArrayList(POPULAR_LIST); 
     for (Movie m : mPopularList) { 
      Log.d(LOG_TAG, "onCreate: " + m.getTitle()); 
     } 
    } else { 
     FetchPopularMovies pm = new FetchPopularMovies(); 
     pm.execute(SORT_POPULAR); 
    } 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    View pView = inflater.inflate(R.layout.fragment_popular_movies, container, false); 

    mAdapter = new MoviePosterAdapter(mContext, mPopularList); 

    mProgressBar = (ProgressBar) pView.findViewById(R.id.movies_progress_bar); 
    RecyclerView mRecyclerView = (RecyclerView) pView.findViewById(R.id.my_recycler_view); 
    RecyclerView.LayoutManager mLayoutManager = new GridLayoutManager(getActivity(), 3, GridLayoutManager.VERTICAL, false); 
    mRecyclerView.setLayoutManager(mLayoutManager); 

    mRecyclerView.setAdapter(mAdapter); 

    return pView; 
} 

第二片段

public static RatingMoviesFragment newInstance(String sort) { 
    RatingMoviesFragment fragment = new RatingMoviesFragment(); 
    Bundle args = new Bundle(); 
    args.putString("sort", sort); 
    fragment.setArguments(args); 
    return fragment; 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    sortOrder = getArguments().getString("sort"); 
    mContext = getActivity(); 

    if (savedInstanceState != null) { 
     Log.d(LOG_TAG, "Has saved instance"); 
     mRatingList = savedInstanceState.getParcelableArrayList(RATING_LIST); 
    } else { 
     FetchRatingMovies rm = new FetchRatingMovies(); 
     rm.execute(SORT_RATING); 
    } 
} 


@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    View view = inflater.inflate(R.layout.fragment_rating_movies, container, false); 

    ratingAdapter = new MoviePosterAdapter(mContext, mRatingList); 

    mProgressBar = (ProgressBar) view.findViewById(R.id.movies_progress_bar); 
    RecyclerView mRecyclerView = (RecyclerView) view.findViewById(R.id.my_recycler_view); 
    RecyclerView.LayoutManager mLayoutManager = new GridLayoutManager(getActivity(), 3, GridLayoutManager.VERTICAL, false); 
    mRecyclerView.setLayoutManager(mLayoutManager); 
    mRecyclerView.setAdapter(ratingAdapter); 

    return view; 
} 

MoviePosterAdapter

public class MoviePosterAdapter extends RecyclerView.Adapter<MoviePosterAdapter.ViewHolder> { 

private final String LOG_TAG = MoviePosterAdapter.class.getSimpleName(); 

final Context mContext; 
private ArrayList<Movie> mDataset; 

public static class ViewHolder extends RecyclerView.ViewHolder { 

    //public final View mView; 
    public final ImageView mImageView; 

    public ViewHolder(View view) { 
     super(view); 
     mImageView = (ImageView) view.findViewById(R.id.imageView); 
    } 
} 

// Provide a suitable constructor (depends on the kind of dataset) 
public MoviePosterAdapter(Context context, ArrayList<Movie> myDataset) { 
    this.mContext = context; 
    mDataset = myDataset; 
} 

public void setMoviesData(ArrayList<Movie> moviesData){ 
    mDataset = moviesData; 
} 

// Create new views (invoked by the layout manager) 
@Override 
public MoviePosterAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, 
                 int viewType) { 
    // create a new view 
    View v = LayoutInflater.from(mContext).inflate(R.layout.movie_poster, parent, false); 
    // set the view's size, margins, paddings and layout parameters 
    return new ViewHolder(v); 
} 

// Replace the contents of a view (invoked by the layout manager) 
@Override 
public void onBindViewHolder(final ViewHolder holder, int position) { 
    final Movie mMovie = mDataset.get(position); 

    //Creating URL for image 
    final String POSTER_BASE_URL = "http://image.tmdb.org/t/p/"; 
    final String SIZE_PATH = "w185"; 
    String IMG_PATH = mMovie.getImg(); 

    //Loading image using Glide 
    Glide.with(holder.mImageView.getContext()) 
      .load(POSTER_BASE_URL + SIZE_PATH + IMG_PATH) 
      .placeholder(R.color.grid_placeholder_bg) 
      .into(holder.mImageView); 

    holder.mImageView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent i = new Intent(mContext, DetailActivity.class); 
      i.putExtra("id", mMovie.getId()); 
      i.putExtra("title", mMovie.getTitle()); 

      if (mContext instanceof MainActivity) { 
       MainActivity main= (MainActivity) mContext; 
       main.switchToDetail(i); 
      } 
     } 
    }); 
} 

// Return the size of your dataset (invoked by the layout manager) 
@Override 
public int getItemCount() { 
    return mDataset.size(); 
} 

}

請幫幫我!

編輯:這兩個數組都不是空的。這是我認爲的問題,只有一個片段被填充,可能是因爲適配器有問題(不確定)。如果我試圖阻止第一個片段得到填充(註釋掉notifyDatasetChanged()),那麼第二個片段可以正常工作。

+0

請在這裏發佈相關的代碼,而不是提供項目的鏈接。而且你還沒有指定哪個片段是第一個片段,哪個片段是第二個片段。 –

+0

我已經添加了代碼。 –

+0

請發佈MoviePosterAdapter的代碼 – Rehan

回答

1

圖像沒有填充在第二個片段中,因爲它是Glide庫的問題。切換到畢加索。工作正常。

0

我檢查了你的代碼,我發現一切都很好。我嘗試過使用虛擬數據,所以我確信錯誤在您的數據或適配器中,您正在設置數據。只需使用虛擬數據嘗試一次,這樣您就會更清楚,或者如果您仍然看到空白屏幕,請告訴我。

一般都是空白屏幕,因爲沒有數據。所以請檢查一次..

+0

感謝您的回覆。我修好了它。這是Glide庫的一些問題。所以我轉向了畢加索。現在它的工作很好。 –

相關問題