2017-05-08 207 views
-1

我想使用的分段數據RecyclerView但它繼續顯示錯誤RecyclerView沒有佈局管理RecyclerView沒有佈局管理的Android

這裏是我的適配器

public class FilmAdapter extends RecyclerView.Adapter<FilmAdapter.FilmViewHolder> { 

    private List<Film> mFilmList; 
    private Context context; 

    public FilmAdapter(List <Film> FilmList) { 
      mFilmList= FilmList; 
    } 


    public static class FilmViewHolder extends RecyclerView.ViewHolder { 
     ImageView foto; 

     public FilmViewHolder(View v) { 
      super(v); 
      foto = (ImageView) v.findViewById(R.id.posterFilm); 
     } 
    } 

    @Override 
    public FilmAdapter.FilmViewHolder onCreateViewHolder(ViewGroup parent,int viewType) { 
     View mView = LayoutInflater.from(parent.getContext()).inflate(R.layout.grid_film, parent, false); 
     FilmAdapter.FilmViewHolder mViewHolder = new FilmAdapter.FilmViewHolder(mView); 
     return mViewHolder; 
    } 

    @Override 
    public void onBindViewHolder(FilmViewHolder holder, int position) { 
     Picasso.with(context).load("http://ecinema.esy.es/img/" + mFilmList.get(position).getBackdropPath()).resize(200, 250).into(holder.foto); 
    } 

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

片段

public class NowPlayingFragment extends Fragment implements RecyclerItemClickListener.OnItemClickListener{ 
    ApiInterface mApiInterface; 
    private RecyclerView mRecyclerView; 
    private RecyclerView.Adapter mAdapter; 
    private RecyclerView.LayoutManager mLayoutManager; 
    public static MainActivity m; 

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

     View v = inflater.inflate(R.layout.fragment_now_playing, container, false); 
     String idKota = m.getIdKota(); 
     mRecyclerView = (RecyclerView) v.findViewById(R.id.rootLayout); 
     mLayoutManager = new LinearLayoutManager(this.getActivity()); 
     mRecyclerView.setLayoutManager(mLayoutManager); 
     mRecyclerView.setHasFixedSize(true); 
     mApiInterface = ApiClient.getClient().create(ApiInterface.class); 
     mAdapter = new KotaAdapter(new ArrayList<Kota>()); 
     mRecyclerView.setAdapter(mAdapter); 

     Call<List<Film>> call = mApiInterface.getFilmPlaying(
       idKota 
     ); 
     call.enqueue(new Callback<List<Film>>() { 
      @Override 
      public void onResponse(Call<List<Film>> call, Response<List<Film>> response) { 
       List<Film> movies = response.body(); 
       Log.d("Retrofit Get", "Jumlah data : " + 
         String.valueOf(movies.size())); 
       mAdapter = new FilmAdapter(movies); 
       mRecyclerView.setAdapter(mAdapter); 
      } 

      @Override 
      public void onFailure(Call<List<Film>>call, Throwable t) { 
      } 
     }); 

     mRecyclerView.addOnItemTouchListener(new RecyclerItemClickListener(getActivity(), this)); 
     return v; 
    } 

    @Override 
    public void onItemClick(View childView, int position) { 

    } 

    @Override 
    public void onItemLongPress(View childView, int position) { 

    } 
} 
展示

activity_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    app:layout_behavior="@string/appbar_scrolling_view_behavior" 
    tools:context="com.ecinema.sekaranindyaputri.ecinema.MainActivity" 
    tools:showIn="@layout/app_bar_main"> 

    <android.support.v7.widget.RecyclerView 
     android:id="@+id/rootLayout" 
     android:layout_width="368dp" 
     android:layout_height="495dp" 
     android:layout_above="@+id/bottom_navigation" 
     android:orientation="vertical"/> 

</android.support.constraint.ConstraintLayout> 

fragment_now_playing.xml

<android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="com.ecinema.sekaranindyaputri.ecinema.Home.NowPlayingFragment"> 

    <LinearLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"> 
     <ViewFlipper 
      android:layout_width="fill_parent" 
      android:layout_height="113dp" 
      android:id="@+id/slideFilm"> 
     </ViewFlipper> 

    </LinearLayout> 

    <ProgressBar 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/progressBar" 
     android:layout_centerInParent="true" 
     android:visibility="gone"/> 
    <RelativeLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true"> 

     <GridView 
      android:id="@+id/gridPlaying" 
      android:layout_width="match_parent" 
      android:layout_height="400dp" 
      android:layout_alignParentBottom="true" 
      android:layout_marginBottom="0dp" 
      android:layout_marginLeft="5dp" 
      android:layout_marginRight="5dp" 
      android:background="@color/colorPrimary" 
      android:clickable="true" 
      android:columnWidth="150dp" 
      android:drawSelectorOnTop="true" 
      android:focusable="true" 
      android:gravity="center" 
      android:horizontalSpacing="5dp" 
      android:numColumns="auto_fit" 
      android:stretchMode="columnWidth" 
      android:verticalSpacing="5dp" /> 

    </RelativeLayout> 

</android.support.v7.widget.RecyclerView> 

grid_film.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="match_parent" 
    android:background="#fff" 
    android:id="@+id/filmLayout"> 

    <ImageView 
     android:layout_width="165dp" 
     android:layout_height="150dp" 
     android:id="@+id/posterFilm" 
     android:layout_alignParentEnd="true" /> 

</LinearLayout> 

Logcat 

05-08 19:44:05.852 30270-30270/com.ecinema.sekaranindyaputri.ecinema E/AndroidRuntime: FATAL EXCEPTION: main 
                        Process: com.ecinema.sekaranindyaputri.ecinema, PID: 30270 
                        java.lang.RuntimeException: Unable to start activity ComponentInfo{com.ecinema.sekaranindyaputri.ecinema/com.ecinema.sekaranindyaputri.ecinema.MainActivity}: android.view.InflateException: Binary XML file line #1: RecyclerView has no LayoutManager 
                         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2423) 
                         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2483) 
                         at android.app.ActivityThread.access$900(ActivityThread.java:153) 
                         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1349) 
                         at android.os.Handler.dispatchMessage(Handler.java:102) 
                         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) 
                        Caused by: android.view.InflateException: Binary XML file line #1: RecyclerView has no LayoutManager 
                         at android.view.LayoutInflater.inflate(LayoutInflater.java:543) 
                         at android.view.LayoutInflater.inflate(LayoutInflater.java:427) 
                         at com.ecinema.sekaranindyaputri.ecinema.Home.NowPlayingFragment.onCreateView(NowPlayingFragment.java:48) 
                         at android.app.Fragment.performCreateView(Fragment.java:2220) 
                         at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:973) 
                         at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1148) 
                         at android.app.BackStackRecord.run(BackStackRecord.java:799) 
                         at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1537) 
                         at android.app.FragmentController.execPendingActions(FragmentController.java:325) 
                         at android.app.Activity.performStart(Activity.java:6319) 
                         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2386) 
                         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2483)  
                         at android.app.ActivityThread.access$900(ActivityThread.java:153)  
                         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1349)  
                         at android.os.Handler.dispatchMessage(Handler.java:102)  
                         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)  
                        Caused by: java.lang.IllegalStateException: RecyclerView has no LayoutManager 
                         at android.support.v7.widget.RecyclerView.generateLayoutParams(RecyclerView.java:3737) 
                         at android.view.LayoutInflater.inflate(LayoutInflater.java:506) 
                         at android.view.LayoutInflater.inflate(LayoutInflater.java:427)  
                         at com.ecinema.sekaranindyaputri.ecinema.Home.NowPlayingFragment.onCreateView(NowPlayingFragment.java:48)  
                         at android.app.Fragment.performCreateView(Fragment.java:2220)  
                         at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:973)  
                         at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1148)  
                         at android.app.BackStackRecord.run(BackStackRecord.java:799)  
                         at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1537)  
                         at android.app.FragmentController.execPendingActions(FragmentController.java:325)  
                         at android.app.Activity.performStart(Activity.java:6319)  
                         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2386)  
                         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2483)  
                         at android.app.ActivityThread.access$900(ActivityThread.java:153)  
                         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1349)  
                         at android.os.Handler.dispatchMessage(Handler.java:102)  
                         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)  

我嘗試搜索錯誤,他們說加

mRecyclerView.setHasFixedSize(true); 

但它仍然錯誤。任何人都可以幫忙嗎?在此先感謝

+1

不要在RecyclerView本身中使用嵌套的子元素,而要使用另一個佈局並使其膨脹。參考這[後](http://stackoverflow.com/questions/33969443/why-is-it-saying-recyclerview-has-no-layoutmanager-when-there-is-one-please-s) –

+0

@whenthemorningcomes你的意思是RecyclerView in activityMain? –

+0

不,關於RecyclerView裏面fragment_now_playing.xml的處理是什麼?你在哪裏誇大這個觀點? –

回答

0

mRecyclerview從哪裏來?是不是應該是recyclerview?

+0

private RecyclerView mRecyclerView; –

+0

如果使用recyclerview而不是mRecycleview,會發生什麼情況? – Mabz

0

通過改變適配器

public class FilmAdapter extends RecyclerView.Adapter<FilmAdapter.FilmViewHolder> { 

    private List<Film> mFilmList; 
    private Context context; 

    public FilmAdapter(List <Film> FilmList) { 
      mFilmList= FilmList; 
    } 

    @Override 
    public FilmViewHolder onCreateViewHolder(ViewGroup parent,int viewType) { 
     View mView = LayoutInflater.from(parent.getContext()).inflate(R.layout.grid_film, parent, false); 
     FilmViewHolder mViewHolder = new FilmViewHolder(mView); 
     return mViewHolder; 
    } 

    @Override 
    public void onBindViewHolder(FilmViewHolder holder, int position) { 
     Picasso.with(context).load("http://ecinema.esy.es/img/" + mFilmList.get(position).getBackdropPath()).resize(200, 250).into(holder.foto); 
    } 

    public static class FilmViewHolder extends RecyclerView.ViewHolder { 
     public ImageView foto; 

     public FilmViewHolder(View v) { 
      super(v); 
      foto = (ImageView) v.findViewById(R.id.posterFilm); 
     } 
    } 

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

和碎片解決錯誤

public class NowPlayingFragment extends Fragment implements RecyclerItemClickListener.OnItemClickListener{ 
    ApiInterface mApiInterface; 
    private RecyclerView mRecyclerView; 
    private RecyclerView.Adapter mAdapter; 
    private RecyclerView.LayoutManager mLayoutManager; 
    public static MainActivity m; 
    String idKota = m.getIdKota(); 

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

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

     mRecyclerView = (RecyclerView) v.findViewById(R.id.rootLayout); 
     mLayoutManager = new LinearLayoutManager(this.getActivity()); 
     mRecyclerView.setLayoutManager(mLayoutManager); 
     mRecyclerView.setHasFixedSize(true); 
     mApiInterface = ApiClient.getClient().create(ApiInterface.class); 
     mAdapter = new FilmAdapter(new ArrayList<Film>()); 
     mRecyclerView.setAdapter(mAdapter); 
     refresh(); 

     return v; 
    } 

    public void refresh() { 
     Call<List<Film>> call = mApiInterface.getFilmPlaying(
       idKota 
     ); 
     call.enqueue(new Callback<List<Film>>() { 
      @Override 
      public void onResponse(Call<List<Film>> call, Response<List<Film>> response) { 
       List<Film> FilmList = response.body(); 
       Log.d("Retrofit Get", "Jumlah data : " + 
         String.valueOf(FilmList.size())); 
       mAdapter = new FilmAdapter(FilmList); 
       mRecyclerView.setAdapter(mAdapter); 
      } 

      @Override 
      public void onFailure(Call<List<Film>>call, Throwable t) { 
       Log.e("Retrofit Get", t.toString()); 
      } 
     }); 

     //mRecyclerView.addOnItemTouchListener(new RecyclerItemClickListener(getActivity(), this)); 
    } 

    @Override 
    public void onItemClick(View childView, int position) { 

    } 

    @Override 
    public void onItemLongPress(View childView, int position) { 

    } 
} 
0

廣場

mRecyclerView.setHasFixedSize(true); 

mRecycler View.setLayoutManager(mLayoutManager);