2017-12-20 13 views
0

Ich habe einen Viewpager mit 3 Seiten, aber ein einzelnes Fragment im Inneren (mit einer Recycling-Ansicht). Ich möchte den Inhalt des Fragments basierend auf der Seite Im ändern, so dass ich keine 3 Fragmente erstellen muss. Nur eins und anpassen. Dazu erhalte ich die aktuelle Position auf der Ansichtsseite und sende sie an meine Fragmentaktivität, damit ich den Adpater ändern kann, bekomme aber immer Fehler mit "... bei einer Nullobjekt-Referenz".Ändern Sie den Adapter basierend auf Viewpager Position

In meiner Tätigkeit habe ich:

public class HintsActivity extends AppCompatActivity { 

    private ViewPager ViewPagerHints; 
    private hintFragment hintfragment = new hintFragment(); 

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

     Toolbar toolbar = findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     ActionBar actionBar = getSupportActionBar(); 
     actionBar.setDisplayHomeAsUpEnabled(true); 

     ViewPagerHints = findViewById(R.id.viewPagerHints); 
     if (ViewPagerHints != null) { 
      setupViewPager(ViewPagerHints); 
     } 

     ViewPagerHints.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { 
      public void onPageScrollStateChanged(int state) {} 
      public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {} 

      public void onPageSelected(int position) { 
       hintfragment.changeAdapter(position); 
      } 
     }); 

     TabLayout tabLayout = findViewById(R.id.tabs); 
     tabLayout.setupWithViewPager(ViewPagerHints); 

     setTitle("Hints"); 
    } 

    private void setupViewPager(ViewPager myViewPager) { 
     Adapter adapter = new Adapter(getSupportFragmentManager()); 

      adapter.addFragment(new hintFragment(), "Foods"); 
      adapter.addFragment(new hintFragment(), "Sports"); 
      adapter.addFragment(new hintFragment(), "Health"); 

     myViewPager.setAdapter(adapter); 

    } 

    static class Adapter extends FragmentPagerAdapter { 
     private final List<Fragment> mFragments = new ArrayList<>(); 
     private final List<String> mFragmentTitles = new ArrayList<>(); 

     public Adapter(FragmentManager fm) { 
      super(fm); 
     } 

     public void addFragment(Fragment fragment, String title) { 
      mFragments.add(fragment); 
      mFragmentTitles.add(title); 
     } 

     @Override 
     public Fragment getItem(int position) { 
      return mFragments.get(position); 
     } 

     @Override 
     public int getCount() { 
      return mFragments.size(); 
     } 

     @Override 
     public CharSequence getPageTitle(int position) { 
      return mFragmentTitles.get(position); 
     } 
    } 
} 

Und in meiner Fragment-Aktivität (hintFragment):

public class hintFragmen textends Fragment { 

private RecyclerView recyclerView; 
private Adapter_Hints adapter_hints; 
private HintsManager hintsManager= new HintsManager(); 
private List<Hint> hintsListFoods ; 
private List<Hint> hintsListHealth; 
private List<Hint> hintsListSports; 

@Override 
public View onCreateView(final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    recyclerView = (RecyclerView)inflater.inflate(R.layout.fragment_hints, container, false); 
    recyclerView.setLayoutManager(new LinearLayoutManager(recyclerView.getContext())); 

    hintsListFoods = hintsManager.getFoodsHints(); 

    adapter_hints = new Adapter_Hints(hintsListFoods); 
    recyclerView.addItemDecoration(new MyDividerItemDecoration(recyclerView.getContext(), LinearLayoutManager.VERTICAL, 16)); 
    recyclerView.setAdapter(adapter_hints); 

    return recyclerView; 
} 

public void changeAdapter(int position) { 
     switch (position) { 
      case 0: 
       hintsListFoods = hintsManager.getFoodsHints(); 
       adapter_hints= new Adapter_Hints(hintsListFoods); 
       recyclerView.setAdapter(adapter_hints); 
       break; 
      case 1: 
       hintsListSports= hintsManager.getSportHints(); 
       adapter_hints= new Adapter_Hints(hintsListSports); 
       recyclerView.setAdapter(adapter_hints); 
       break; 
      case 2: 
       hintsListHealth= hintsManager.getHealthHints(); 
       adapter_hints= new Adapter_Hints(hintsListHealth); 
       recyclerView.setAdapter(adapter_hints); 
       break; 
     } 
    } 

fragment_hints.xml

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

Logs:

12-21 10:19:38.468 30243-30243/com.support.android.iplfit E/AndroidRuntime: FATAL EXCEPTION: main 
                      Process: com.support.android.iplfit, PID: 30243 
                      java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.RecyclerView.setAdapter(android.support.v7.widget.RecyclerView$Adapter)' on a null object reference 
                       at com.support.android.iplfit.hintFragment.changeAdapter(hintFragment.java:57) 
                       at com.support.android.iplfit.Activities.hintFragment$1.onPageSelected(HintsActivity.java:46) 
                       at android.support.v4.view.ViewPager.dispatchOnPageSelected(ViewPager.java:1939) 
                       at android.support.v4.view.ViewPager.scrollToItem(ViewPager.java:679) 
                       at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:663) 
                       at android.support.v4.view.ViewPager.onTouchEvent(ViewPager.java:2255) 
                       at android.view.View.dispatchTouchEvent(View.java:9943) 
                       at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2663) 
                       at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2344) 
                       at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2669) 
                       at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2358) 
                       at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2669) 
                       at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2358) 
                       at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2669) 
                       at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2358) 
                       at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2669) 
                       at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2358) 
                       at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2669) 
                       at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2358) 
                       at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2669) 
                       at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2358) 
                       at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:411) 
                       at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1810) 
                       at android.app.Activity.dispatchTouchEvent(Activity.java:3061) 
                       at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:68) 
                       at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:68) 
                       at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:373) 
                       at android.view.View.dispatchPointerEvent(View.java:10163) 
                       at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4434) 
                       at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4302) 
                       at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3849) 
                       at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3902) 
                       at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3868) 
                       at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3995) 
                       at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3876) 
                       at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4052) 
                       at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3849) 
                       at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3902) 
                       at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3868) 
                       at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3876) 
                       at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3849) 
                       at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:6210) 
                       at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:6184) 
                       at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6145) 
                       at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6313) 
                       at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185) 
                       at android.os.MessageQueue.nativePollOnce(Native Method) 
                       at android.os.MessageQueue.next(MessageQueue.java:323) 
                       at android.os.Looper.loop(Looper.java:136) 
12-21 10:19:38.468 30243-30243/com.support.android.iplfit E/AndroidRuntime:  at android.app.ActivityThread.main(ActivityThread.java:6077) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756) 
+0

Bitte posten Sie Ihre Protokolle. – Kiya

+0

zum Beitrag hinzugefügt, danke. –

+0

Und könnten Sie auch den Code, wo Sie das RecyclerView – Kiya

Antwort

2

Sie haben das Objekt hintfragment in Ihrer Aktivitätsklasse initialisiert, die eine übergeordnete Ansicht nicht aufgeblasen wird. Und damit erhalten Sie eine Null-Zeiger-Ausnahme, während Sie versuchen, die Seite Ihres ViewPagers zu ändern. Probieren Sie den folgenden Code aus.

ViewPagerHints.addOnPageChangeListener(new 
ViewPager.OnPageChangeListener() { 
     public void onPageScrollStateChanged(int state) {} 
     public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {} 

     public void onPageSelected(int position) { 
      ((hintFragment)((Adapter)ViewPagerHints.getAdapter()).getItem(position)).changeAdapter(position); 
     } 
    }); 
+0

"Fehler: (46, 60) error: kann die Symbolmethode nicht finden getItem (int) " –

+0

Änderte meine Antwort. Gieße einfach deinen Adapter. Es wird dein Problem lösen. –

+1

Es funktioniert, endlich! Vielen Dank ! –

0

Try this ::

private View rootView; 

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

    rootView = inflater.inflate(R.layout.fragment_hints, container, false); 

    recyclerView = (RecyclerView) rootView.findViewById(R.id.recyclerViewId); 
    recyclerView.setLayoutManager(new LinearLayoutManager(recyclerView.getContext())); 

    ... 
    return rootView; 
} 
+0

'' void android.support.v7.widget.RecyclerView.setAdapter (android.support.v7.widget.RecyclerView $ Adapter) 'für eine Nullobjekt-Referenz' –

Verwandte Themen