2015-05-23 2 views
4

У меня есть ViewRecycler, используя CardView внутри фрагмента, который является частью ViewPager в ActionBarActivity. Все это из библиотек поддержки.Почему ViewRecycler взрывается onMeasure

Когда я пытаюсь открыть приложение, он выходит из строя со следующим исключением. Есть ли известная проблема или решение, которое я пропустил?

java.lang.NullPointerException 
     at android.support.v7.widget.RecyclerView.onMeasure(RecyclerView.java:1764) 
     at android.view.View.measure(View.java:16736) 
     at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1456) 
     at android.view.View.measure(View.java:16736) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5178) 
     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
     at android.view.View.measure(View.java:16736) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5178) 
     at android.support.v7.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:453) 
     at android.view.View.measure(View.java:16736) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5178) 
     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
     at android.view.View.measure(View.java:16736) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5178) 
     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:16736) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5178) 
     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
     at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2392) 
     at android.view.View.measure(View.java:16736) 
     at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2095) 
     at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1208) 
     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1394) 
     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1095) 
     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6010) 
     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:799) 
     at android.view.Choreographer.doCallbacks(Choreographer.java:599) 
     at android.view.Choreographer.doFrame(Choreographer.java:559) 
     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:784) 
     at android.os.Handler.handleCallback(Handler.java:733) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:157) 
     at android.app.ActivityThread.main(ActivityThread.java:5872) 
     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:852) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:668) 
     at dalvik.system.NativeStart.main(Native Method) 

Я пробовал различные предложения, такие как использование LinearLayouts где-нибудь у меня есть RelativeLayout, но ничего не помогло, так что я вернулся обратно. Мои макеты и код следующим образом

Gradle

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    compile 'com.android.support:appcompat-v7:22.0.0' 
    compile 'com.android.support:cardview-v7:21.0.+' 
    compile 'com.android.support:recyclerview-v7:21.0.+' 
} 

активность

public class LaunchActivity extends ActionBarActivity { 

    private SectionsPagerAdapter mSectionsPagerAdapter; 
    private ViewPager mViewPager; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_launch); 
     mSectionsPagerAdapter = new SectionsPagerAdapter(this, getSupportFragmentManager()); 
     mViewPager = (ViewPager) findViewById(R.id.pager); 
     mViewPager.setAdapter(mSectionsPagerAdapter); 
    } 

    ... 
} 

Компоновка активность

<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" android:id="@+id/pager" 
android:layout_width="match_parent" android:layout_height="match_parent" 
tools:context="com.me.LaunchActivity" /> 

Фрагмент

public class RotaFragment extends Fragment { 

    private RecyclerView mCardRecycler; 

    public static RotaFragment newInstance() { 
     ... 
    } 

    public RotaFragment() { } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.fragment_rota, container, false); 
     mCardRecycler = (RecyclerView) rootView.findViewById(R.id.card_recycler); 
     return rootView; 
    } 

    @Override 
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 
     List<WorkingFortnight> dummy = new ArrayList<>(); 
     .... 
     mCardRecycler.setLayoutManager(new LinearLayoutManager(getActivity())); 
     mCardRecycler.setAdapter(new RotaCardAdapter(dummy)); 
    } 
} 

Фрагмент макета

<android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/card_recycler" 
    android:background="@drawable/activity_bg" 
    android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
/> 

адаптер (набор на ViewRecycler для настройки CardViews)

public class RotaCardAdapter extends RecyclerView.Adapter<RotaCardAdapter.RotaViewHolder> { 

    private List<WorkingFortnight> mRotas; 

    public RotaCardAdapter(List<WorkingFortnight> rotas) { 
     mRotas = rotas; 
    } 

    @Override 
    public void onAttachedToRecyclerView(RecyclerView recyclerView) { 
     super.onAttachedToRecyclerView(recyclerView); 
    } 

    @Override 
    public RotaViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.rota_card, parent, false); 
     return new RotaViewHolder(v); 
    } 

    @Override 
    public void onBindViewHolder(RotaViewHolder holder, int position) { 
     WorkingFortnight rota = mRotas.get(position); 
     holder.setHours(...); 
    } 

    public class RotaViewHolder extends RecyclerView.ViewHolder { 

     private TextView mCaption; 
     private RotaListAdapter mListAdapter; 

     public RotaViewHolder(View v) { 
      super(v); 
      ... 
      mList.setAdapter(...); 
     } 

     ... 
    } 

адаптер Просмотр (Карты)

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v7.widget.CardView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:card_view="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/card_view" 
    android:layout_gravity="center" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    card_view:elevation="3dp" 
    card_view:cardBackgroundColor="@color/card" 
    card_view:cardCornerRadius="4dp"> 

    <RelativeLayout android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:padding="4dp"> 

     <ImageView android:id="@+id/card_image" 
      android:scaleType="centerCrop" 
      android:src="@drawable/wk01" 
      android:contentDescription="@string/label_card" 
      android:layout_alignParentTop="true" 
      android:layout_width="fill_parent" 
      android:layout_height="128dp" /> 

     <TextView android:id="@+id/card_caption" 
       android:layout_alignTop="@+id/card_image" 
      android:layout_alignRight="@+id/card_image" 
      android:layout_marginTop="4dp" 
      android:layout_marginRight="8dp" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" /> 

     <ListView android:id="@+id/card_rota" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent"> 
     </ListView> 

    </RelativeLayout> 

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

Я понимаю, что это сложная вложенная макет, но я надеюсь, что кто-нибудь знает какой-то вопрос с чем-то, что я сделал здесь, может быть, некоторые виды не может быть вложенным, но ничего не пришло в моих поисках, и упрощение вещи, чтобы проверить, пока не помогли.

ответ

-1

После принятия макетов обособлены по частям я нашел исключение onMeasure на триггерах, когда фрагмент с RecyclerView вложен в ViewPager (андроид. support.v4.view.ViewPager). Использование простого FrameView в качестве макета активности позволяет избежать этой проблемы.

Я не отмечаю это как принятый ответ в течение следующих 48 часов - если вы знаете, почему, обходной путь для этого или удалось найти связанный с этим (я не сделал) отчет, отправьте его и Я подумаю о принятии вашего ответа и удалении комментария thsi из моего собственного ответа, спасибо

1

Нулевой указатель возникает из-за того, что диспетчер компоновки представления Recycler имеет значение NULL.

Вы должны установить LayoutManager раньше:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View rootView = inflater.inflate(R.layout.fragment_rota, container, false); 
    mCardRecycler = (RecyclerView) rootView.findViewById(R.id.card_recycler); 
    List<WorkingFortnight> dummy = new ArrayList<>(); 
    .... 
    mCardRecycler.setLayoutManager(new LinearLayoutManager(MyApplication.getApplicationContext())); 
    mCardRecycler.setAdapter(new RotaCardAdapter(dummy)); 
    return rootView; 
} 
+0

Я только что попробовал это, к сожалению, все еще имею ту же проблему –