2016-07-06 4 views
-1

세 개의 탭을 포함하는 MainActivity가 있습니다. 각 탭에서 SQLite db에서 가져온 데이터를 RecyclerView를 사용하여 목록으로 표시합니다.RecyclerView : 어댑터가 연결되지 않았습니다. 레이아웃을 건너 뛰기 - 조각 내부의 오류

앱을 처음 실행하면 데이터가 제대로 표시됩니다. 이전에 열린 탭으로 돌아 가면 데이터가 없습니다.

  1. 확인 어댑터가 null의 경우 : 나는 다음과 같은 구현 한 후

    문제

    가 나타나기 시작했다.
  2. 예인 경우 어댑터 인스턴스를 작성하고 데이터로 채 웁니다.
  3. 아니, 그냥 어댑터의 내부 데이터를 업데이트하지 않고이 아이디어는 내가 작업과 동일해야했던 다른 프로젝트에서 일하고 notifyDataSetChanged()

호출합니다. 이 경우에는 조각이 있습니다. Fragment가 다른 라이프 사이클 동작을한다는 것을 알게되었습니다.

어떻게이 문제를 해결할 수 있습니까? 탭 클래스의

하나 : 조각을 보유하고

public class AllTabView extends Fragment { 

Context ourContext; 

RecyclerView mList; 
AllAdapter adapter; 
RecyclerView.LayoutManager layoutManager; 
TextView mEmptyText; 

long movedItem, draggedItem; 

ArrayList<ArrayList<String>> mDays; 

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

    mList = (RecyclerView) v1.findViewById(R.id.recycler_view); 
    mEmptyText = (TextView) v1.findViewById(R.id.empty_text); 
    ourContext = getContext(); 

    layoutManager = new LinearLayoutManager(ourContext); 
    mList.setLayoutManager(layoutManager); 
    RecyclerView.ItemAnimator itemAnimator = new DefaultItemAnimator(); 
    mList.setItemAnimator(itemAnimator); 

    return v1; 
} 

@Override 
public void onResume() { 
    super.onResume(); 
    getDays(); 

    if (mDays.size() == 0) { 
     mList.setVisibility(View.GONE); 
     mEmptyText.setVisibility(View.VISIBLE); 
    } else { 
     mList.setVisibility(View.VISIBLE); 
     mEmptyText.setVisibility(View.GONE); 

     if(adapter == null) { 
      Log.v(TAG, "adapter null"); 
      adapter = new AllAdapter(ourContext, mDays); 
     } 
     else { 
      Log.v(TAG, "notify"); 
      adapter.updateData(mDays); 
     } 

     mList.setAdapter(adapter); 
    } 
} 

public void getDays() { 
    DaysDatabase info = new DaysDatabase(ourContext); 
    info.open(); 
    mDays = info.getData(); 
    info.close(); 
} 

public void setAdapter() { 
    adapter = new AllAdapter(ourContext, mDays); 
    mList.setAdapter(adapter); 
} 
} 

MainActivity는 :

public class MainActivity extends AppCompatActivity { 

FragmentTabHost mFragmentTabHost; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    mFragmentTabHost = (FragmentTabHost) findViewById(android.R.id.tabhost); 
    mFragmentTabHost.setup(MainActivity.this, getSupportFragmentManager(), android.R.id.tabcontent); 

    String tag1 = "all"; 
    String tag2 = "since"; 
    String tag3 = "until"; 

    final View tabView1 = createTabView(MainActivity.this, "All"); 
    final View tabView2 = createTabView(MainActivity.this, "Since"); 
    final View tabView3 = createTabView(MainActivity.this, "Until"); 

    mFragmentTabHost.addTab(mFragmentTabHost.newTabSpec(tag1).setIndicator(tabView1).setContent(new FragmentTabHost.TabContentFactory() { 
     public View createTabContent(String tag1) { 
      return tabView1; 
     } 
    }), AllTabView.class, null); 
    mFragmentTabHost.addTab(mFragmentTabHost.newTabSpec(tag2).setIndicator(tabView2).setContent(new FragmentTabHost.TabContentFactory() { 
     public View createTabContent(String tag2) { 
      return tabView2; 
     } 
    }), SinceTabView.class, null); 
    mFragmentTabHost.addTab(mFragmentTabHost.newTabSpec(tag3).setIndicator(tabView3).setContent(new FragmentTabHost.TabContentFactory() { 
     public View createTabContent(String tag1) { 
      return tabView3; 
     } 
    }), UntilTabView.class, null); 

    mFragmentTabHost.getTabWidget().setDividerDrawable(R.drawable.tab_divider); 

} 

private static View createTabView(final Context context, final String text) { 
    View view = LayoutInflater.from(context).inflate(R.layout.tabs_bg, null); 
    TextView tv = (TextView) view.findViewById(R.id.tabsText); 
    tv.setText(text); 
    return view; 
} 
+0

그래서 (우리는) 문제가'그 방법 또는 어댑터에 있는지 여부를 알 수 있습니다 (설정 후) mDays 크기 여부를 확인하기위한') (getDays'에 방법을 로그를 설정 0 시도 때문에 updateData '메소드를 호출합니다. 그리고 대답 할 어댑터 코드를 추가하십시오 – rsella

+0

조각을 다루는 활동 코드를 게시하십시오. –

+1

알다시피, 내가 다른 탭으로 이동할 때 활성 탭은'onPause','onStop' 및'onDestroyView'를 호출합니다. 따라서 우리는 recyclerView의 상태를 잃어 가고 있습니다. tab로 돌아 가면 recyclerView가 다시 초기화됩니다. 여기에서는 이전에 어댑터가 연결되어 있다는 것을 알지 못합니다. – Marat

답변

1

난 당신의 코드를 편집했습니다. 이것을 봐주세요.

public class AllTabView extends Fragment { 

Context ourContext; 

RecyclerView mList; 
AllAdapter adapter; 
RecyclerView.LayoutManager layoutManager; 
TextView mEmptyText; 

long movedItem, draggedItem; 

ArrayList<ArrayList<String>> mDays = new ArrayList<>(); 

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

    mList = (RecyclerView) v1.findViewById(R.id.recycler_view); 
    mEmptyText = (TextView) v1.findViewById(R.id.empty_text); 
    ourContext = getContext(); 
    layoutManager = new LinearLayoutManager(ourContext); 
    mList.setLayoutManager(layoutManager); 
    getDays(); 
    RecyclerView.ItemAnimator itemAnimator = new DefaultItemAnimator(); 
    mList.setItemAnimator(itemAnimator); 
    adapter = new AllAdapter(ourContext, mDays); 
    mList.setAdapter(adapter); 
    return v1; 
} 

@Override 
public void onResume() { 
    super.onResume(); 
    getDays(); 
    if (mDays.size() == 0) { 
     mList.setVisibility(View.GONE); 
     mEmptyText.setVisibility(View.VISIBLE); 
    } else { 
     mList.setVisibility(View.VISIBLE); 
     mEmptyText.setVisibility(View.GONE); 
    } 
} 

public void getDays() { 
    DaysDatabase info = new DaysDatabase(ourContext); 
    info.open(); 
    mDays.clear(); 
    mDays.addAll(info.getData()); 
    if (adapter != null) 
     adapter.notifyDataSetChanged(); 
    info.close(); 
} 
} 
+0

mDays = new ArrayList()를 추가하면된다. onCreatView의 위 코드에서 ArrayList에 nullpointerexception을 던지지 않도록합니다. – Drv

+0

업데이트했습니다. 체크 아웃. –

+0

'ViewPager'와 함께'FragmentPagerAdapter'를 사용하여 탭 뷰를 설정하도록 권합니다. –

관련 문제