0

Ich habe eine grundlegende Konfiguration von ViewPager, RecyclerView und ContentProvider implementiert. Ich bin in der Lage, Daten problemlos abzufragen, aber ich kann den Inhalt nicht mit RecyclerView auf der Registerkarte ViewPager anzeigen.RecyclerView füllt keine Daten im ViewPager Tab

Voll Code ist hier verfügbar - https://github.com/sudhirkhanger/PopularMovies

public class FavoriteFragment extends Fragment { 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.fragment_movie_list, container, false); 

     // Set column size to 2 for default and portrait 
     // and 3 for landscape orientations 
     int column = Integer.parseInt(getString(R.string.grid_portrait)); 
     if (getResources().getConfiguration().orientation == 1) { 
      column = Integer.parseInt(getString(R.string.grid_portrait)); 
     } else if (getResources().getConfiguration().orientation == 2) { 
      column = Integer.parseInt(getString(R.string.grid_landscape)); 
     } 

     mRecyclerView = (RecyclerView) rootView.findViewById(R.id.recyclerview); 
     mRecyclerView.setHasFixedSize(true); 
     mRecyclerView.setLayoutManager(new GridLayoutManager(getActivity(), column)); 

     ArrayList<Movie> mMovieArrayList = new ArrayList<Movie>(); 

     ContentResolver resolver = getActivity().getContentResolver(); 

     Cursor cursor = 
       resolver.query(MovieContract.MovieEntry.CONTENT_URI, 
         null, 
         null, 
         null, 
         null); 

     if (cursor != null) { 
      if (cursor.moveToFirst()) { 
       do { 
        String title = cursor.getString(cursor.getColumnIndex(MovieContract.MovieEntry.TITLE)); 
        String movie_id = cursor.getString(cursor.getColumnIndex(MovieContract.MovieEntry.MOVIE_ID)); 
        String poster = cursor.getString(cursor.getColumnIndex(MovieContract.MovieEntry.POSTER)); 
        String backdrop = cursor.getString(cursor.getColumnIndex(MovieContract.MovieEntry.BACKDROP)); 
        String overview = cursor.getString(cursor.getColumnIndex(MovieContract.MovieEntry.OVERVIEW)); 
        String vote_average = cursor.getString(cursor.getColumnIndex(MovieContract.MovieEntry.VOTE_AVERAGE)); 
        String release_date = cursor.getString(cursor.getColumnIndex(MovieContract.MovieEntry.DATE)); 

        Movie movie = new Movie(title, release_date, poster, 
          vote_average, overview, backdrop, movie_id); 
        mMovieArrayList.add(movie); 
       } while (cursor.moveToNext()); 
      } 
     } 

     if (cursor != null) 
      cursor.close(); 

     for (Movie movie : mMovieArrayList) { 
      Log.d("FavoriteFragment List", movie.getTitle()); 
     } 

     mMovieAdapter = new MovieAdapter(getActivity(), mMovieArrayList); 
     mMovieAdapter.notifyDataSetChanged(); 
     mRecyclerView.setAdapter(mMovieAdapter); 
     return rootView; 
    } 

    public static FavoriteFragment newInstance() { 
     Bundle args = new Bundle(); 
     FavoriteFragment fragment = new FavoriteFragment(); 
     fragment.setArguments(args); 
     return fragment; 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     mRecyclerView.setAdapter(mMovieAdapter); 
     mMovieAdapter.notifyDataSetChanged(); 
    } 

    RecyclerView mRecyclerView; 
    MovieAdapter mMovieAdapter; 
} 

Wie Sie unten, dass Arraylist enthält die Daten sehen können.

04-25 22:02:36.216 4718-4718/com.sudhirkhanger.app.popularmoviesstageone W/FragmentManager: moveToState: Fragment state for PopularFragment{d7cf0b6 #1 id=0x7f0c006b} not updated inline; expected state 3 found 2 
04-25 22:02:37.757 4718-4718/com.sudhirkhanger.app.popularmoviesstageone D/FavoriteFragment List: Whiplash 
04-25 22:02:37.757 4718-4718/com.sudhirkhanger.app.popularmoviesstageone D/FavoriteFragment List: Batman v Superman: Dawn of Justice 
04-25 22:02:37.757 4718-4718/com.sudhirkhanger.app.popularmoviesstageone D/FavoriteFragment List: Star Wars: The Force Awakens 
04-25 22:02:37.757 4718-4718/com.sudhirkhanger.app.popularmoviesstageone D/FavoriteFragment List: The Shawshank Redemption 
04-25 22:02:37.757 4718-4718/com.sudhirkhanger.app.popularmoviesstageone D/FavoriteFragment List: The Godfather 
04-25 22:02:37.757 4718-4718/com.sudhirkhanger.app.popularmoviesstageone D/FavoriteFragment List: Interstellar 
04-25 22:02:37.757 4718-4718/com.sudhirkhanger.app.popularmoviesstageone D/FavoriteFragment List: Captain America: Civil War 
04-25 22:02:37.757 4718-4718/com.sudhirkhanger.app.popularmoviesstageone D/FavoriteFragment List: The Jungle Book 
04-25 22:02:37.757 4718-4718/com.sudhirkhanger.app.popularmoviesstageone D/FavoriteFragment List: The Revenant 
04-25 22:02:37.757 4718-4718/com.sudhirkhanger.app.popularmoviesstageone D/FavoriteFragment List: Jurassic World 
04-25 22:02:37.757 4718-4718/com.sudhirkhanger.app.popularmoviesstageone D/FavoriteFragment List: Mad Max: Fury Road 

Antwort

0
<ImageView 
     android:id="@+id/imageview" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:adjustViewBounds="true" 
     android:scaleType="centerCrop"/> 

Imagehöhe wird auf wrap_content gesetzt. Falls kein Bild vorhanden ist, ist die Ansicht insbesondere in RelativeLayout unsichtbar. Sie haben dieses Problem nicht, wenn Sie LinearLayout haben.

Aufgrund Tippfehlers in DetailsFragment.java habe ich Bildpfad auf final String poster = parcelableExtra.getReleaseDate(); gesetzt, was falsch ist.

Es gibt mehrere Fixes.

  1. Switch to Linearlayout
  2. eine fix Höhe für Image Set.
  3. Stellen Sie sicher, dass das Bild nicht beschädigt ist.
0

Ich könnte falsch liegen, aber ich denke, Sie müssen den Adapter in OnViewCreated setzen.

0

Zuerst verschieben Sie alles in Ihrem onCreateView zu onViewCreated. Geben Sie einfach rootView dort zurück. Es wird nicht benötigt, aber es ist eine gute Programmierpraxis und hilft später, wenn Sie versuchen, Lebenszyklusfehler zu beheben. Löschen Sie auch Ihre onResume Methode. Du machst da nichts, was hilft.

Zweitens Verschieben Sie diese Zeilen:

mMovieAdapter = new MovieAdapter(getActivity(), mMovieArrayList); 
mRecyclerView.setAdapter(mMovieAdapter); 

nach rechts unterhalb dieser Linie:

ArrayList<Movie> mMovieArrayList = new ArrayList<Movie>(); 

Dann, nachdem Sie Ihre Liste mit all den Daten gefüllt haben, rufen Sie diese Zeile die sagen Recycler Ansicht, dass die Liste hat sich geändert:

mMovieAdapter.notifyDataSetChanged(); 

Also alles gesagt und getan ist, werden Sie dieses:

public class FavoriteFragment extends Fragment { 

    RecyclerView mRecyclerView; 
    MovieAdapter mMovieAdapter; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     return inflater.inflate(R.layout.fragment_movie_list, container, false); 
    } 

    @Override 
    public void onViewCreated(View v, Bundle b) { 
     // Set column size to 2 for default and portrait 
     // and 3 for landscape orientations 
     int column = Integer.parseInt(getString(R.string.grid_portrait)); 
     if (getResources().getConfiguration().orientation == 1) { 
      column = Integer.parseInt(getString(R.string.grid_portrait)); 
     } else if (getResources().getConfiguration().orientation == 2) { 
      column = Integer.parseInt(getString(R.string.grid_landscape)); 
     } 

     mRecyclerView = (RecyclerView) rootView.findViewById(R.id.recyclerview); 
     mRecyclerView.setHasFixedSize(true); 
     mRecyclerView.setLayoutManager(new GridLayoutManager(getActivity(), column)); 

     ArrayList<Movie> mMovieArrayList = new ArrayList<Movie>(); 
     mMovieAdapter = new MovieAdapter(getActivity(), mMovieArrayList); 
     mRecyclerView.setAdapter(mMovieAdapter); 

     /* do all of your cursor stuff to populate the mMovieArrayList */ 
     ...... 

     // notify adapter to recycle 
     mMovieAdapter.notifyDataSetChanged(); 
    } 

    public static FavoriteFragment newInstance() { 
     Bundle args = new Bundle(); 
     FavoriteFragment fragment = new FavoriteFragment(); 
     fragment.setArguments(args); 
     return fragment; 
    } 
} 
+0

Dank Tschad aber das hat das Problem nicht gelöst. –

0

Ich war an dem Projekt suchen und:

  • Die MovieAdapter in Ordnung ist, weil ich Haltepunkte setzen in onCreateViewHolder und onBindViewHolder und sie wurden getroffen.
  • Ich kann nicht überprüfen, ob die Abfragen in Ordnung sind, aber wahrscheinlich sind sie in Ordnung, wenn Sie sich Ihre Protokollierung ansehen, die Sie gepostet haben.

Das eigentliche Problem ... vielleicht

das, was das Problem ist, dass list_item.xml Layout zu sein scheint! Ich habe es in eine LinearLayout statt einer RelativeLayout geändert, und es funktioniert jetzt.

list_item.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:orientation="vertical" 
       android:padding="1dp"> 

    <ImageView 
     android:id="@+id/imageview" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:adjustViewBounds="true" 
     android:scaleType="centerCrop"/> 

    <TextView 
     android:id="@+id/list_title" 
     android:layout_width="match_parent" 
     android:layout_height="@dimen/list_title_size" 
     android:layout_alignBottom="@id/imageview" 
     android:background="@color/black" 
     android:ellipsize="end" 
     android:gravity="center" 
     android:maxLines="1" 
     android:textColor="@color/white" 
     android:textSize="@dimen/list_title_text_size"/> 
</LinearLayout> 

Beweise !:

evidence

+0

Vielen Dank für den Hinweis, dass das Problem möglicherweise im Layout aufgetreten ist. Der Kern des Problems ist, dass ImageView auf 'wrap_content' gesetzt ist. Der Bildlink wurde aufgrund eines Tippfehlers unterbrochen. Wenn kein Bild vorhanden ist, wird ImageView überhaupt nicht angezeigt. Das war was los war. –