2016-12-01 2 views
1

ViewHolder에 데이터를 부 풀려 바인딩하려고합니다. 바인딩 할 때마다이 오류가 발생합니다.레이아웃 상태는 100이지만 10입니다.

java.lang.IllegalStateException: Layout state should be one of 100 but it is 10 
    at android.support.v7.widget.RecyclerView$State.assertLayoutStep(RecyclerView.java:10876) 
    at android.support.v7.widget.RecyclerView.dispatchLayoutStep3(RecyclerView.java:3391) 
    at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3194) 
    at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3627) 
    at android.view.View.layout(View.java:13916) 
    at android.view.ViewGroup.layout(ViewGroup.java:4424) 
    at android.widget.RelativeLayout.onLayout(RelativeLayout.java:948) 
    at android.view.View.layout(View.java:13916) 
    at android.view.ViewGroup.layout(ViewGroup.java:4424) 
    at android.support.v4.view.ViewPager.onLayout(ViewPager.java:1799) 
    at android.view.View.layout(View.java:13916) 
    at android.view.ViewGroup.layout(ViewGroup.java:4424) 
    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1655) 
    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1513) 
    at android.widget.LinearLayout.onLayout(LinearLayout.java:1426) 
    at android.view.View.layout(View.java:13916) 
    at android.view.ViewGroup.layout(ViewGroup.java:4424) 
    at android.support.design.widget.HeaderScrollingViewBehavior.layoutChild(HeaderScrollingViewBehavior.java:131) 
    at android.support.design.widget.ViewOffsetBehavior.onLayoutChild(ViewOffsetBehavior.java:42) 
    at android.support.design.widget.AppBarLayout$ScrollingViewBehavior.onLayoutChild(AppBarLayout.java:1367) 
    at android.support.design.widget.CoordinatorLayout.onLayout(CoordinatorLayout.java:849) 
    at android.view.View.layout(View.java:13916) 
    at android.view.ViewGroup.layout(ViewGroup.java:4424) 
    at android.widget.FrameLayout.onLayout(FrameLayout.java:448) 
    at android.view.View.layout(View.java:13916) 
    at android.view.ViewGroup.layout(ViewGroup.java:4424) 
    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1655) 
    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1513) 
    at android.widget.LinearLayout.onLayout(LinearLayout.java:1426) 
    at android.view.View.layout(View.java:13916) 
    at android.view.ViewGroup.layout(ViewGroup.java:4424) 
    at android.widget.FrameLayout.onLayout(FrameLayout.java:448) 
    at android.view.View.layout(View.java:13916) 
    at android.view.ViewGroup.layout(ViewGroup.java:4424) 
    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1655) 
    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1513) 
    at android.widget.LinearLayout.onLayout(LinearLayout.java:1426) 
    at android.view.View.layout(View.java:13916) 
    at android.view.ViewGroup.layout(ViewGroup.java:4424) 
    at android.widget.FrameLayout.onLayout(FrameLayout.java:448) 
    at android.view.View.layout(View.java:13916) 
    at android.view.ViewGroup.layout(ViewGroup.java:4424) 
    at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2029) 
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1850) 
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1143) 
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4667) 
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725) 
    at android.view.Choreographer.doCallbacks(Choreographer.java:555) 
    at android.view.Choreographer.doFrame(Choreographer.java:525) 
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711) 
    at android.os.Handler.handleCallback(Handler.java:615) 
    at android.os.Handler.dispatchMessage(Handler.java:92) 
    at android.os.Looper.loop(Looper.java:137) 
    at android.app.ActivityThread.main(ActivityThread.java:4960) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:511) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805) 
    at dalvik.system.NativeStart.main(Native Method) 

이전에이 오류가 발생하지 않았습니다. 이것에 대한 정보는별로 없습니다. 이런 일이 일어나는 이유는 무엇입니까?

편집

나는 문제가이 코드에 생각 :

public class ProfileAdapter extends RecyclerView.Adapter<TypedHolder> 
{ 
    public static final int TYPE_HEADER = 0; 
    public static final int TYPE_MAP = 1; 

    private List<GeoMap> mGeoMaps = new ArrayList<>(); 
    private Context mContext; 
    private User mCurrentUser; 

    private ProfileHeaderHolderInterface mProfileHeaderHolder; 
    private DownloadedMapHolderInterface mDownloadedMapHolder; 

    private ProfileHeaderHolderInterface.Listener mProfileHeaderHolderInterfaceListener; 
    private DownloadedMapHolderInterface.Listener mDownloadedMapHolderInterfaceListener; 

    private ProfileHeaderHolderInterface.OnBind mProfileHeaderHolderInterfaceOnBind; 
    private DownloadedMapHolderInterface.OnBind mDownloadedMapHolderInterfaceOnBind; 


    public ProfileAdapter(Context context) 
    { 
     mContext = context; 

     mProfileHeaderHolder = new ProfileHeaderHolder(mContext); 
     mDownloadedMapHolder = new DownloadedMapHolder(mContext); 
    } 

    public void setContent(List<GeoMap> map, User user) 
    { 
     if(map == null) 
      return; 

     mGeoMaps.clear(); 
     mGeoMaps.addAll(map); 

     mCurrentUser = user; 
    } 

    public ProfileHeaderHolderInterface getProfileHeaderView() 
    { 
     return mProfileHeaderHolder; 
    } 

    @Override 
    public TypedHolder onCreateViewHolder(ViewGroup parent, int viewType) 
    { 
     LayoutInflater inflater = LayoutInflater.from(mContext); 

     switch(viewType) 
     { 
      case TYPE_HEADER: 
       return mProfileHeaderHolder.createHolder(parent); 
      case TYPE_MAP: 
      { 
       View view = inflater.inflate(R.layout.listitem_offline_map, parent, false); 
       DownloadedMapHolder.ViewHolder holder = new DownloadedMapHolder.ViewHolder(view); 
       // return mDownloadedMapHolder.createHolder(parent); 
       return holder; 
      } 
     } 

     return new TypedHolder(new View(mContext), -1); 
    } 

    @Override 
    public int getItemViewType(int position) 
    { 
     if(position == 0) 
      return TYPE_HEADER; 

     return TYPE_MAP; 
    } 

    @Override 
    public void onBindViewHolder(TypedHolder holder, int position) 
    { 
     switch(holder.getType()) 
     { 
      case ProfileAdapter.TYPE_HEADER: 
       if(mProfileHeaderHolderInterfaceListener != null) 
        mProfileHeaderHolderInterfaceOnBind.onBind(holder, mCurrentUser); 
       break; 

      case ProfileAdapter.TYPE_MAP: 
       { 
        GeoMap geoMap = mGeoMaps.isEmpty()? null : mGeoMaps.get(position - 1); 

        //if (mDownloadedMapHolderInterfaceListener != null) 
        // mDownloadedMapHolderInterfaceOnBind.onBind(holder, geoMap, position - 1); 

        DownloadedMapHolder.ViewHolder downloadedMapHolder = (DownloadedMapHolder.ViewHolder) holder; 
        downloadedMapHolder.mTextViewLocation.setText(geoMap.getMapLocation()); 
        downloadedMapHolder.mTextViewLocation.setText(geoMap.getDateString()); 
       } 
       break; 
     } 
    } 

    @Override 
    public int getItemCount() 
    { 
     return mGeoMaps.isEmpty()? 1 : mGeoMaps.size() + 1; 
    } 

    public void setProfileHeaderHolderInterfaceListener(ProfileHeaderHolderInterface.Listener listener) 
    { 
     mProfileHeaderHolderInterfaceListener = listener; 
     mProfileHeaderHolder.setProfileHeaderHolderInterfaceListener(listener); 
    } 

    public void setDownloadedMapHolderInterfaceListener(DownloadedMapHolderInterface.Listener listener) 
    { 
     mDownloadedMapHolderInterfaceListener = listener; 
     mDownloadedMapHolder.setDownloadedMapHolderInterfaceListener(listener); 
    } 

    public void setProfileHeaderHolderInterfaceOnBind(ProfileHeaderHolderInterface.OnBind onBind) 
    { 
     mProfileHeaderHolderInterfaceOnBind = onBind; 
    } 

    public void setDownloadedMapHolderInterfaceOnBind(DownloadedMapHolderInterface.OnBind onBind) 
    { 
     mDownloadedMapHolderInterfaceOnBind = onBind; 
    } 
} 

이 문제는 매우 실망했다. 난 그냥 베어 필수품 내 어댑터를 제거 후, 나는이 선에오고있다 알아낼 수 있었다 :

@Override 
public int getItemViewType(int position) 
{ 
    if(position == 0) 
     return TYPE_HEADER; 

    else if(position > 0 && position < mGeoMaps.size()) 
     return TYPE_MAP; 
    else 
    { 
     Log.i(ShoreLeaveApplication.TAG, "CANNOT BIND on TYPE -1!!!!"); 
     return -1; 
    } 
} 

나는 추가 노트 카드가 항상 존재하는 매우 간단한 재활용 뷰를 만들려고했다 내 목록의 첫 번째 요소 (FB와 비슷 함). 나머지는 단지지도 선택입니다. 이로 인해 내 onCreateViewHolder가 잘못된 ID를 수신하고 잘못된 레이아웃을 부 풀리게됩니다. 이것은 마지막 항목에 도달하면 발생합니다. 나는 쓰레기로 작성한이 코드를 다음과 같이 바꾼다.

@Override 
public int getItemViewType(int position) 
{ 
    if(position == 0) // first item is always the header 
     return TYPE_HEADER; 

    // the rest is a normal item 
    return TYPE_MAP; 
} 

그리고 이제는 작동한다.

감사합니다.

+1

왜 이런 일이 발생하는지 더 잘 이해할 수 있도록 몇 가지 코드를 제공해주십시오. –

+0

오류는 아무 것도 알려주지 않습니다. 코드 샘플이 도움이 될 것입니다. – mutantkeyboard

+0

죄송합니다. 솔직히 말해서, 나는 많은 것을 알고 있습니다. 빌어 먹을, 나는 가정을 그것의 recyclerview로 만든다. 그러나 stack trace를 읽는 것은 약간의 recyclerview를 거기에서 본다. 그래서 내가보고있는 thats. 이 문제를 재현하는 작은 프로젝트를 만들 수도 있습니다. –

답변

2

코드와 관련이없는 것 같아서 build.gradle에서 다음과 같이 변경하십시오.

compile com.android.support:appcompat-v7:XX.x.x을 build.gradle의 종속성 섹션에서 찾으십시오. 마지막 숫자를 다운 그레이드하거나 업그레이드하십시오.

예를 들어 광산은 'com.android.support:appcompat-v7:24.2.1 and I had tried with 'com.android.support:appcompat-v7:24.2.0와'com.android.support입니다 : APPCOMPAT-V7 : 그것의 종류 히트의 시도 비록 24.2.2`

,하지만 작은 프로젝트 가치에 대한 시도를 주어진, 코드 문제가 있다면 스택 추적 (당신이 질문에 붙여 넣은) 특정 라인에서 당신을 지적했을 사실을 고려하십시오.