2014-11-04 14 views
21

Ich versuche RecyclerView mit RecyclerView.Adapter zu verwenden, aber hier ist etwas falsch. Ich poste meinen Code unten:java.lang.NullPointerException bei android.support.v7.widget.RecyclerView.onMeasure

Layout:

<android.support.v7.widget.RecyclerView 
    xmlns:tools="http://schemas.android.com/tools" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/topic_view" 
    android:scrollbars="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 

topic_tile.xml:

<?xml version="1.0" encoding="utf-8"?> 

<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="@dimen/tile_height"> 

    <com.makeramen.RoundedImageView 
     xmlns:app="http://schemas.android.com/apk/res-auto" 
     android:id="@+id/avatar" 
     android:padding="16dp" 
     app:riv_corner_radius="72dp" 
     android:layout_height="72dp" 
     android:layout_width="72dp" 
     /> 

    <LinearLayout 
     android:id="@+id/text_layout" 
     android:orientation="vertical" 
     android:paddingTop="@dimen/text_padding_top_and_bottom" 
     android:paddingBottom="@dimen/text_padding_top_and_bottom" 
     android:paddingRight="16dp" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 
     <TextView 
      android:id="@+id/title" 
      android:textSize="@dimen/primary_font" 
      android:paddingLeft="@dimen/text_padding_left" 
      android:textColor="#000000" 
      android:text="Title" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content"/> 
     <TextView 
      android:id="@+id/author" 
      android:textSize="@dimen/secondary_font" 
      android:paddingLeft="@dimen/text_padding_left" 
      android:text="author" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content"/> 
    </LinearLayout> 
</RelativeLayout> 

ist hier in onCreate()

public class TitleListActivity extends ActionBarActivity { 

    private RecyclerView topic_view; 
    private RecyclerView.LayoutManager mLayoutManager; 
    private TitlelistAdapter adapter; 

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

     ..... 

     topic_view = (RecyclerView)findViewById(R.id.topic_view); 
     adapter = new TitlelistAdapter(topicList); 

     topic_view.setHasFixedSize(true); 
     mLayoutManager = new LinearLayoutManager(TitleListActivity.this); 
     topic_view.setLayoutManager(mLayoutManager); 
     topic_view.setItemAnimator(new DefaultItemAnimator()); 

     topic_view.setAdapter(adapter); 

der Adapter:

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

    public List<Topic> topicList; 

    public static class ViewHolder extends RecyclerView.ViewHolder{ 

     TextView title; 
     TextView author; 
     RoundedImageView avatar; 

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

      title = (TextView)itemView.findViewById(R.id.title); 
      author = (TextView)itemView.findViewById(R.id.author); 
      avatar = (RoundedImageView)itemView.findViewById(R.id.avatar); 
     } 
    } 

    public TitlelistAdapter(List<Topic> topicList){ 
     this.topicList = topicList; 
    } 

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 

     View itemView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.topic_tile,viewGroup,false); 
     return new ViewHolder(itemView); 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder viewHolder, int i) { 
     viewHolder.title.setText(topicList.get(i).title); 
     viewHolder.author.setText(topicList.get(i).member.username); 
    } 

    @Override 
    public long getItemId(int position) { 
     return super.getItemId(position); 
    } 

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

ist die Ausnahme:

java.lang.NullPointerException 
     at android.support.v7.widget.RecyclerView.onMeasure(RecyclerView.java:1694) 
     at android.view.View.measure(View.java:16497) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) 
     at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404) 
     at android.widget.LinearLayout.measureVertical(LinearLayout.java:695) 
     at android.widget.LinearLayout.onMeasure(LinearLayout.java:588) 
     at android.view.View.measure(View.java:16497) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) 
     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
     at android.view.View.measure(View.java:16497) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) 
     at android.support.v7.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:453) 
     at android.view.View.measure(View.java:16497) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) 
     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
     at android.view.View.measure(View.java:16497) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) 
     at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404) 
     at android.widget.LinearLayout.measureVertical(LinearLayout.java:695) 
     at android.widget.LinearLayout.onMeasure(LinearLayout.java:588) 
     at android.view.View.measure(View.java:16497) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) 
     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
     at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2291) 
     at android.view.View.measure(View.java:16497) 
     at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1912) 
     at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1109) 
     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1291) 
     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:996) 
     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5600) 
     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761) 
     at android.view.Choreographer.doCallbacks(Choreographer.java:574) 
     at android.view.Choreographer.doFrame(Choreographer.java:544) 
     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747) 
     at android.os.Handler.handleCallback(Handler.java:733) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:136) 
     at android.app.ActivityThread.main(ActivityThread.java:5001) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:515) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 
     at dalvik.system.NativeStart.main(Native Method) 

Ist es etwas, das ich nicht init oder etwas habe ich mehr schreiben sollte?

Antwort

17

Ihr XML zeigt, dass Sie zwei androide Namespaces haben, die Ihnen eigentlich einen Fehler geben sollten, da Sie in android nur einmal den Namespace verwenden dürfen. Entfernen Sie das lineare Layout aus Ihrem Hauptlayout, da es unnötig erscheint. Überprüfen Sie Ihre eigene Zeilen Layout dh topic_tile als auch für jegliche ähnliche Fehler

<android.support.v7.widget.RecyclerView 
    xmlns:tools="http://schemas.android.com/tools" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/topic_view" 
    android:scrollbars="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 

EDIT:

in onCreate()

private RecyclerView.LayoutManager mLayoutManager; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     . 
     . 
     . 
     mLayoutManager = new LinearLayoutManager(this); 
     recycleView.setLayoutManager(mLayoutManager); 
    } 
+0

dies ist ein Fehler, aber nachdem ich es behoben, stürzte die App immer noch mit dieser Ausnahme – Randy

+0

können Sie Ihre 'topic_tile' Layout-Datei als auch? – Android2390

+0

Auch wenn Sie diese Antwort unter http://stackoverflow.com/questions/24458538/using-cardview-and-recyclerview-in-my-layout-files-throws-an-exception betrachten, schlägt es vor, dass Sie erstellen sollten eine Member-Variable für die 'LayoutManager' Klasse anstelle von' setLayoutManager (new LinearLayoutManager (TitleListActivity.this)); ' – Android2390

11

Wenn Ihr das gleiche Problem für RecycleView innerhalb eines Fragments konfrontiert sind, versuchen Sie, benutze diesen Code.

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

    // get recycler view 
    mRecyclerView = (RecyclerView) rootView.findViewById(R.id.novel_item_list); 

    //mRecyclerView.setHasFixedSize(true); 

    // use a linear layout manager 
    mLayoutManager = new LinearLayoutManager(getActivity()); 
    mRecyclerView.setLayoutManager(mLayoutManager); 


    String[] abc = {"hi","how are you","this is recycler"}; 
    // specify an adapter (see also next example) 
    mAdapter = new RecyclerViewAdapter(abc); 
    mRecyclerView.setAdapter(mAdapter); 
    return rootView; 
} 
+1

DANKE so sehr, ich benutze auch 'Fragment', da ich vermute, dass das ursprüngliche Frage-Poster war, und dies muss der Grund für diese 'NullPointerException' sein Ich hatte den Code, den Sie gepostet haben (instanziieren 'RecyclerView',' LinearLayoutManager', die Aufrufe von 'setLayoutManager' und' setAdapter') in der Methode 'onCreate()' des Fragments anstelle der 'onCreateView' Methode. Argh. Nochmals vielen Dank, Mann! – clamum

1

Sie haben zu setzen LayoutManager für RecycleView:

Derzeit Android 3 Arten von Layouts unterstützt.

Wenn Sie möchten, dass es eine normale ListView scheint, verwenden Sie LinearLayoutManager.

Wenn Sie möchten, dass es eine GridView ist, verwenden Sie GridLayoutManager.

Wenn Sie es wollen, scheinen versetzt, verwenden StaggeredGridLayoutManager

Konstrukteurs für 3 Arten Layouts über

LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity()); 

GridLayoutManager gridLayoutManager = new GridLayoutManager(getActivity(), 2); 

StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(spanCount, StaggeredGridLayoutManager.HORIZONTAL); 

Dann setzen Sie LinearLayout zu RecycleView (in diesem Fall habe ich LinearLayoutManager

recyclerView = (RecyclerView) view.findViewById(R.id.saved_recycle_view); 
recyclerView.setHasFixedSize(true); 
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(context); 
recyclerView.setLayoutManager(linearLayoutManager); 

Wie auch immer, verwenden Sie OttoBus Library, um Ereignisse von der A dapter zu Aktivität/Fragment, die die RecycleView enthält. Viel Glück!

+2

Könnten Sie bitte Ihre Antwort bearbeiten, um eine Erklärung zu geben, warum dieser Code die Frage beantwortet? Code-only Antworten sind [entmutigt] (http: // : //meta.stackexchange.com/questions/148272), weil sie die Lösung nicht lehren. – DavidPostill

+0

Danke! Ich habe es gemacht. –

21

Ich habe diesen Fehler bekommen, wenn mein RecyclerView keinen LayoutManager hatte.Das Hinzufügen dieses Code das Problem behoben:

recyclerView.setLayoutManager(new LinearLayoutManager(recyclerView.getContext())); 
+0

Was ist der Grund? –

+0

danke, ich habe Manager vergessen – user25

0

Für jeden, der versucht einen ViewPager für Tabs zu verwenden, und in ihren Zungen hat eine RecyclerView, das diese verrückten Fehler verursacht, schlage ich vor Aufblasen zu verschieben, indem noch ein weiteres Fragment zu schaffen für die Aufnahme nur das RecylerView.

Diese XML-Datei ist eine meiner Registerkarten, die anstelle eines Recyclers ein Rahmenlayout enthalten.

shop_most_views_fragment.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:orientation="vertical"> 

<FrameLayout 
    android:id="@+id/most_view_item_frameLayout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#f3f3f3" /> 
</LinearLayout> 

seine Java-Klasse

public class MostViews extends Fragment { 
private String title; 
private int page; 
View convertedView; 
RecyclerView grids; 

public static MostViews newInstance(int page, String title) { 
    MostViews fragmentFirst = new MostViews(); 
    Bundle args = new Bundle(); 
    args.putInt("someInt", page); 
    args.putString("someTitle", title); 
    fragmentFirst.setArguments(args); 
    return fragmentFirst; 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    page = getArguments().getInt("someInt", 0); 
    title = getArguments().getString("someTitle"); 
} 

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

private void transitMasonaryLayoutFragmentIntoFramLayout() { 
    MasanoryLayout masanoryLayout = new MasanoryLayout(); 
    FragmentManager fragmentManager = getActivity().getSupportFragmentManager(); 
    fragmentManager.beginTransaction() 
      .add(R.id.most_view_item_frameLayout, masanoryLayout).commit(); 
} 
} 

so haben wir ein Rahmenlayout unser recylcer Fragment in sie zu setzen.

shop_most_view_masanory_fragment.xml

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

<android.support.v7.widget.RecyclerView 
    android:id="@+id/mostViewsItem" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 
</LinearLayout> 

seine Java-Klasse

public class MasanoryLayout extends Fragment { 
View convertedView; 
RecyclerView grids; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    convertedView = inflater.inflate(R.layout.shop_most_view_masanory_fragment, container, false); 
    grids = (RecyclerView) convertedView.findViewById(R.id.mostViewsItem); 
    setLayoutManagerOnRecyclerView(); 
    MasonryAdapter adapter = new MasonryAdapter(initializeData()); 
    grids.setAdapter(adapter); 
    return convertedView; 
} 

private void setLayoutManagerOnRecyclerView() { 
    grids.setLayoutManager(new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL)); 
} 

private List<StoreItem> initializeData() { 
    List<StoreItem> storeItems = new ArrayList<>(); 
    storeItems.add(new StoreItem("احسان", "احسان", R.drawable.detailed_index_store)); 
    storeItems.add(new StoreItem("احسان", "احسان", R.drawable.clothstore)); 
    storeItems.add(new StoreItem("احسان", "احسان", R.drawable.detailed_index_store)); 
    storeItems.add(new StoreItem("احسان", "احسان", R.drawable.clothstore)); 
    storeItems.add(new StoreItem("احسان", "احسان", R.drawable.detailed_index_store)); 
    storeItems.add(new StoreItem("احسان", "احسان", R.drawable.detailed_index_store)); 
    storeItems.add(new StoreItem("احسان", "احسان", R.drawable.clothstore)); 

    return storeItems; 
} 
} 

, wie Sie Ihren FragmentPagerAdapter sehen MostViews aufgeblasen werden, nennen würde und MostViews selbst MasanoryLayout aufgeblasen werden, nennen würde. so entkamen wir FragmentPagerAdapter Kontext;)

Verwandte Themen