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)
Bitte posten Sie Ihre Protokolle. – Kiya
zum Beitrag hinzugefügt, danke. –
Und könnten Sie auch den Code, wo Sie das RecyclerView – Kiya