Android Tablayout fragment mehrfacher Aufruf mit leeren Werten

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Android Tablayout fragment mehrfacher Aufruf mit leeren Werten

    Hi zusammen,

    ich habe eine MainActivity mit einem RecyclerView, welcher Daten aus einer SQLite-Datenbank anzeigt. Beim Klick auf einen Datensatz soll sich eine DetailActivity öffnen, und weitere Details zu dem jeweiligen Datensatz anzeigen.
    Ich habe auf der DetailActivity ein TabLayout, da die Detaildaten auf 3 Tabs angezeigt werden sollen. Für jeden Tab existiert ein Fragment.
    Wenn ich nun aber einen Datensatz in der MainActivity anklicke, öffnet sich zwar das fragment, aber ohne Daten. Im Logfile sieht man, dass der OnCreateView des fragments insgesamt 3x aufgerufen wird. Beim ersten mal ohne Werte, beim 2. Mal werden die Werte übergeben, beim 3. Mal dann wieder leer.
    Kann mir jemand sagen, warum das fragment 3x aufgerufen wird, und wie ich das beheben kann?
    Danke euch!


    Meine MainActivity:

    Java-Quellcode

    1. }
    2. mNoteRecyclerAdapter.notifyDataSetChanged();
    3. }
    4. });
    5. }
    6. private void initRecyclerView() {
    7. LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
    8. mRecyclerView.setLayoutManager(linearLayoutManager);
    9. VerticalSpacingItemDecorator itemDecorator = new VerticalSpacingItemDecorator((10));
    10. mRecyclerView.addItemDecoration(itemDecorator);
    11. mNoteRecyclerAdapter=new NotesRecyclerAdapter(mNotes, this);
    12. mRecyclerView.setAdapter(mNoteRecyclerAdapter);
    13. }
    14. @Override
    15. public void onNoteClick(int position) {
    16. Intent intent = new Intent(this, NotenDetailsActivity.class);
    17. intent.putExtra("selected_note", mNotes.get(position));
    18. startActivity(intent);
    19. }
    20. }
    Alles anzeigen

    NotenDetailsActivity:

    Java-Quellcode

    1. public class NotenDetailsActivity extends AppCompatActivity implements View.OnClickListener{
    2. // ui components
    3. private TextView mViewTitle;
    4. private TextView mViewKomponist;
    5. private TextView mViewArrangeur;
    6. private TextView mViewVerlag;
    7. private RelativeLayout mBackArrowContainer;
    8. private ImageButton mBackArrow;
    9. // vars
    10. private Note mInitialNote;
    11. @Override
    12. protected void onCreate(Bundle savedInstanceState) {
    13. super.onCreate(savedInstanceState);
    14. setContentView(R.layout.activity_noten_details);
    15. mViewTitle = findViewById(R.id.note_toolbar_title);
    16. TabLayout tabLayout = findViewById(R.id.tablayout);
    17. TabItem tabChats = findViewById(R.id.tabPage1);
    18. TabItem tabStatus = findViewById(R.id.tabPage2);
    19. TabItem tabCalls = findViewById(R.id.tabPage3);
    20. ViewPager viewPager = findViewById(R.id.viewPager);
    21. PageAdapter pageAdapter = new PageAdapter(getSupportFragmentManager(), tabLayout.getTabCount());
    22. viewPager.setAdapter(pageAdapter);
    23. viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
    24. mBackArrow = findViewById(R.id.toolbar_back_arrow);
    25. mBackArrowContainer = findViewById(R.id.back_arrow_container);
    26. setListeners();
    27. if(getIntent().hasExtra("selected_note")) {
    28. setNoteProperties();
    29. }
    30. }
    31. private void setListeners() {
    32. mBackArrow.setOnClickListener(this);
    33. }
    34. public void setNoteProperties() {
    35. mInitialNote = getIntent().getParcelableExtra("selected_note");
    36. mViewTitle.setText(mInitialNote.getTitle());
    37. Bundle bundle = new Bundle();
    38. bundle.putString("komponist", mInitialNote.getKomponist());
    39. Tab1Fragment fragment = new Tab1Fragment();
    40. fragment.setArguments(bundle);
    41. getSupportFragmentManager().beginTransaction().replace(R.id.fragment1, fragment).commit();
    42. }
    43. @Override
    44. public void onClick(View view) {
    45. finish();
    46. }
    47. @Override
    48. public void onBackPressed() {
    49. super.onBackPressed();
    50. }
    51. }
    Alles anzeigen

    Tab1Fragment:

    Java-Quellcode

    1. public class Tab1Fragment extends Fragment {
    2. public Tab1Fragment() {
    3. // Required empty public constructor
    4. }
    5. @Override
    6. public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    7. View view = inflater.inflate(R.layout.fragment_tab1, container, false);//Inflate Layout
    8. Log.d("", "onCreateView: TRIGGERED");
    9. TextView mViewKomponist = view.findViewById(R.id.note_komponist);
    10. if (getArguments() != null) {
    11. String tKomponist = getArguments().getString("komponist");
    12. Log.d("", "onCreateView: " + tKomponist);
    13. mViewKomponist.setText(tKomponist);
    14. }
    15. else
    16. {
    17. Log.d("", "onCreateView: NOTHING");
    18. }
    19. return view;
    20. }
    21. }
    Alles anzeigen


    Und das Logfile, in dem man erkennt, dass das fragment 3x aufgerufen wird:

    Quellcode

    1. D/EGL_emulation: eglMakeCurrent: 0xae834ca0: ver 2 0 (tinfo 0xae8393f0)
    2. D/OpenGLRenderer: Enabling debug mode 0
    3. D/EGL_emulation: eglMakeCurrent: 0xae834ca0: ver 2 0 (tinfo 0xae8393f0)
    4. D/: onCreateView: TRIGGERED
    5. onCreateView: NOTHING
    6. D/: onCreateView: TRIGGERED
    7. onCreateView: Grünbauer, Wolfgang
    8. D/: onCreateView: TRIGGERED
    9. onCreateView: NOTHING
    10. D/EGL_emulation: eglMakeCurrent: 0xae834ca0: ver 2 0 (tinfo 0xae8393f0)
    11. I/Choreographer: Skipped 32 frames! The application may be doing too much work on its main thread.
    Alles anzeigen
  • Hallo

    Wie ich gesehen habe warst du wieder Online. Deshalb nun auch eine Antwort von mir. Leider ist es oft so man gibt sich mühe eine Antwort zu schreiben und der TE schaut nicht mal nach, geht gar nicht online.



    Das Ganze ist eine Eigenart des ViewPager den du verwendest.

    Mit Hilfe des ViewPager ist es ja möglich auch zwischen den Taps zu Swipen.

    Damit das möglich ist werden immer die Nachbar Fragmente schon in den Speicher vorgeladen.

    Du schreibst du hast drei Fragmente, hast du denn auch drei Klassen? Ich denke du hast nur die eine „Tab1Fragment“ oder hast du in den anderen Klassen das gleiche Log?

    Da immer das Nachbar Fragment schon vorgeladen wird, die onCreateView auch drei mal gestartet.

    Eigentlich hat man drei Klassen. Dazu musst du aber auch den Adapter etwas bearbeiten und bestimmt auch dein Layout. Dann würde von jeder Kasse die onCreateView aufgerufen werden wenn ein Swipe erflogt. Beim ersten Start natürlich alle drei. Dann immer die Nachbarn. Die eigene onCrateView von dem Fragment was angezeigt wird zum Zeitpunkt des sichtbar Werdens nicht mehr aufgerufen.

    Mit dem View Pager wirst du immer das Problem haben.

    Damit deine Parameter also das „putin“ auch in den anderen Fragment schon beim voraus laden verfügbar ist wirst du wohl den Adapter etwas bearbeiten müssen.

    Sehr interessant währe wie dein Adapter „PageAdapter“ aussieht.

    Wo und wie hast du den die Tabs definiert Im Layout oder?

    Aufgrund dierser drei zeilen würde ich auf im Layout tippen.



    Was soll das eigentlich die Variablen die werden im Code gar nicht benutzt?

    TabItem tabChats = findViewById(R.id.tabPage1);
    TabItem tabStatus = findViewById(R.id.tabPage2);
    TabItem tabCalls = findViewById(R.id.tabPage3);
    Ein Feedback auf Tipps ist auch schön. :P
  • Neu

    Hi,

    danke für diene Antwort. Natürlich habe ich täglich reingeschaut, das Problem besteht ja immer noch. Anscheinend war ich nur nicht angemeldet.

    Bevor ich nun versuche, meinen Code irgendwie halbvernünftig zu bearbeiten: Wie müsste das ganze denn vernünftig aussehen?
    Ziel soll es eben sein, eine Liste (mit Datensätzen aus einer Datenbank) anzuzeigen, beim Klick darauf sollen die Detaildaten zum DS angezeigt werden (auf 3 Tabs verteilt).
    Ein Swipen zwischen den Tabs wäre dann schon gut.
    Ich muss dazu sagen, dass ich völliger Java-Neuling bin (bisher nur VB / C#).
    Ich habe im Netz verschiedene Tuts gefunden, allerdings nur entweder "Liste mit Klick auf Detailanzeige (sep. Avtivity), oder die allgemeine Verwendung von Tabs. Ich bekomm es aber nicht hin, beides zu verknüpfen.

    Danke & Grüße
  • Neu

    Hallo dann zeige doch mal etwas mehr von deinen Code.


    Was bekommst du alles von der DB?
    Du willst also die Daten die von der DB Kommen auf drei Tabs Fragmente aufteilen.
    Wie ist das ? Ändern sich die Daten von der DB wenn du von einen Fragment (Tab) zum anderen Swipst?
    Wenn nicht macht es eigentlich ja auch nichts das die onCreateView vom neuen Fragment beim sichtbar werden nicht aufgerufen wird. Da sie ja schon vorgeladen ist.


    Du könnstet die Daten für die einzelnen Fragmente in verschiedenen Listen oder Cursors Speichen und an die Fragmente Übergeben.


    Wie ich schon sagte wie sieht dein Adapter aus?
    Wie und wo holst du die Detaildaten zum DS?
    Wie Wo Übergiebst du die Daten an die Fargmente?

    Was hast du eine Fragment Klasse in der du verschiedene Daten einblenden willst oder hast du drei Fragmentkassen?

    Ich würde drei mit verschiedenen Layouts machen.


    Wenn sich die Daten beim Swipen von einen Tab zum anderen ändern musst du etwas mehr Aufwand machen denn die onCreateView wird ja beim sichtbar werden nicht durchlaufen.
    Ein Feedback auf Tipps ist auch schön. :P

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von jogimuc ()

  • Neu

    Hi,

    hier der gesamte Code:


    NotenDatabase:

    Java-Quellcode

    1. @Database(entities = {Note.class}, version = 1)
    2. public abstract class NotenDatabase extends RoomDatabase {
    3. public static final String DATABASE_NAME = "MyDatabase.db";
    4. private static NotenDatabase instance;
    5. static NotenDatabase getInstance(final Context context) {
    6. if (instance == null) {
    7. //instance = Room.databaseBuilder(context.getApplicationContext(), NotenDatabase.class, DATABASE_NAME).build();
    8. instance = Room.databaseBuilder(context.getApplicationContext(), NotenDatabase.class,DATABASE_NAME).
    9. createFromAsset("databases/MyDatabase.db").build();
    10. }
    11. return instance;
    12. }
    13. public abstract NoteDao getNoteDao();
    14. }
    Alles anzeigen


    NotenDao:

    Java-Quellcode

    1. @Dao
    2. public interface NoteDao {
    3. @Insert
    4. long[] insertNotes(Note... notes);
    5. @Query("SELECT * FROM Noten ORDER BY Titel ASC")
    6. LiveData<List<Note>> getNotes();
    7. @Delete
    8. int delete(Note... notes);
    9. @Update
    10. int updateNotes(Note... notes);
    11. }
    Alles anzeigen


    NotenRepository:

    Java-Quellcode

    1. public class NotenRepository {
    2. private NotenDatabase mNotenDatabase;
    3. public NotenRepository(Context context) {
    4. mNotenDatabase = NotenDatabase.getInstance(context);
    5. }
    6. public LiveData<List<Note>> retrieveNotesTask() {
    7. return mNotenDatabase.getNoteDao().getNotes();
    8. }
    9. }
    Alles anzeigen


    NotesRecyclerAdapter:

    Java-Quellcode

    1. public class NotesRecyclerAdapter extends RecyclerView.Adapter<NotesRecyclerAdapter.ViewHolder> {
    2. private ArrayList<Note> mNotes = new ArrayList<>();
    3. private OnNoteListener mOnNoteListener;
    4. public NotesRecyclerAdapter(ArrayList<Note> notes, OnNoteListener onNoteListener) {
    5. this.mNotes = notes;
    6. this.mOnNoteListener = onNoteListener;
    7. }
    8. @NonNull
    9. @Override
    10. public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    11. View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.noten_list_activity, viewGroup, false);
    12. return new ViewHolder(view, mOnNoteListener);
    13. }
    14. @Override
    15. public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) {
    16. viewHolder.title.setText(mNotes.get(i).getTitle());
    17. String tKomponist = "";
    18. String tArrangeur = "";
    19. if (!mNotes.get(i).getKomponist().isEmpty()) {
    20. tKomponist = "Komp: " + mNotes.get(i).getKomponist();
    21. }
    22. if (!mNotes.get(i).getArrangeur().isEmpty()) {
    23. tArrangeur = "Arr: " + mNotes.get(i).getArrangeur();
    24. }
    25. viewHolder.komponist.setText(tKomponist);
    26. viewHolder.arrangeur.setText(tArrangeur);
    27. }
    28. @Override
    29. public int getItemCount() {
    30. try {
    31. return mNotes.size();
    32. } catch (Exception e) {
    33. return 0;}
    34. }
    35. public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
    36. TextView title, komponist, arrangeur;
    37. OnNoteListener onNoteListener;
    38. public ViewHolder(@NonNull View itemView, OnNoteListener onNoteListener) {
    39. super(itemView);
    40. title = itemView.findViewById(R.id.note_title);
    41. komponist = itemView.findViewById(R.id.note_komponist);
    42. arrangeur = itemView.findViewById(R.id.note_arrangeur);
    43. this.onNoteListener = onNoteListener;
    44. itemView.setOnClickListener(this);
    45. }
    46. @Override
    47. public void onClick(View view) {
    48. onNoteListener.onNoteClick(getAdapterPosition());
    49. }
    50. }
    51. public interface OnNoteListener{
    52. void onNoteClick(int position);
    53. }
    54. }
    Alles anzeigen


    PageAdapter:

    Java-Quellcode

    1. public class PageAdapter extends FragmentStatePagerAdapter {
    2. private int numOfTabs;
    3. public PageAdapter(FragmentManager fm, int numOfTabs) {
    4. super(fm);
    5. this.numOfTabs = numOfTabs;
    6. }
    7. @Override
    8. public Fragment getItem(int position) {
    9. switch (position) {
    10. case 0:
    11. Tab1Fragment tab1fragment = new Tab1Fragment();
    12. return tab1fragment;
    13. case 1:
    14. Tab2Fragment tab2fragment = new Tab2Fragment();
    15. return tab2fragment;
    16. case 2:
    17. Tab3Fragment tab3fragment = new Tab3Fragment();
    18. return tab3fragment;
    19. case 3:
    20. Tab4Fragment tab4fragment = new Tab4Fragment();
    21. return tab4fragment;
    22. default:
    23. return null;
    24. }
    25. }
    26. @Override
    27. public int getCount() {
    28. return numOfTabs;
    29. }
    30. }
    Alles anzeigen


    Class Note:

    Java-Quellcode

    1. @Entity(tableName = "Noten")
    2. public class Note implements Parcelable {
    3. @PrimaryKey(autoGenerate=true)
    4. @ColumnInfo(name="ID")
    5. private int id;
    6. @ColumnInfo(name="Titel")
    7. String title;
    8. @ColumnInfo(name="Komponist")
    9. String komponist;
    10. @ColumnInfo(name="Arrangeur")
    11. String arrangeur;
    12. protected Note(Parcel in) {
    13. id = in.readInt();
    14. title = in.readString();
    15. komponist = in.readString();
    16. arrangeur = in.readString();
    17. }
    18. public static final Creator<Note> CREATOR = new Creator<Note>() {
    19. @Override
    20. public Note createFromParcel(Parcel in) {
    21. return new Note(in);
    22. }
    23. @Override
    24. public Note[] newArray(int size) {
    25. return new Note[size];
    26. }
    27. };
    28. public int getId() {
    29. return id;
    30. }
    31. public void setId(int id) {
    32. this.id = id;
    33. }
    34. public String getTitle() {
    35. return title;
    36. }
    37. public void setTitle(String title) {
    38. this.title = title;
    39. }
    40. public String getKomponist() {
    41. return komponist;
    42. }
    43. public void setKomponist(String komponist) {
    44. this.komponist = komponist;
    45. }
    46. public String getArrangeur() {
    47. return arrangeur;
    48. }
    49. public void setArrangeur(String arrangeur) {
    50. this.arrangeur = arrangeur;
    51. }
    52. public static Creator<Note> getCREATOR() {
    53. return CREATOR;
    54. }
    55. @Ignore
    56. public Note() {
    57. }
    58. @Override
    59. public String toString() {
    60. return "Note{" +
    61. "id=" + id +
    62. ", title='" + title + '\'' +
    63. ", komponist='" + komponist + '\'' +
    64. ", arrangeur='" + arrangeur + '\'' +
    65. '}';
    66. }
    67. public Note(int id, String title, String komponist, String arrangeur) {
    68. this.id = id;
    69. this.title = title;
    70. this.komponist = komponist;
    71. this.arrangeur = arrangeur;
    72. }
    73. @Override
    74. public int describeContents() {
    75. return 0;
    76. }
    77. @Override
    78. public void writeToParcel(Parcel parcel, int i) {
    79. parcel.writeInt(id);
    80. parcel.writeString(title);
    81. parcel.writeString(komponist);
    82. parcel.writeString(arrangeur);
    83. }
    84. }
    Alles anzeigen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von lightning37 ()

  • Neu

    MainActivity: Liste aller Datensätze; Beim Klick auf einen Datensatz wird die NotenDetailsActivity aufgerufen.

    Java-Quellcode

    1. public class MainActivity extends AppCompatActivity implements NotesRecyclerAdapter.OnNoteListener, View.OnClickListener {
    2. private RecyclerView mRecyclerView;
    3. private ArrayList<Note> mNotes = new ArrayList<>();
    4. private NotesRecyclerAdapter mNoteRecyclerAdapter;
    5. private NotenRepository mNotenRepository;
    6. private Button mButtonSync;
    7. @Override
    8. protected void onCreate(Bundle savedInstanceState) {
    9. super.onCreate(savedInstanceState);
    10. setContentView(R.layout.activity_main);
    11. mRecyclerView=findViewById(R.id.recyclerView);
    12. mNotenRepository = new NotenRepository(this);
    13. initRecyclerView();
    14. retrieveNotes();
    15. setSupportActionBar((Toolbar)findViewById(R.id.notes_toolbar));
    16. setTitle("My App");
    17. }
    18. private void retrieveNotes() {
    19. mNotenRepository.retrieveNotesTask().observe(this, new Observer<List<Note>>() {
    20. @Override
    21. public void onChanged(@Nullable List<Note> notes) {
    22. if(mNotes.size() > 0) {
    23. mNotes.clear();
    24. }
    25. if(notes != null) {
    26. mNotes.addAll(notes);
    27. }
    28. mNoteRecyclerAdapter.notifyDataSetChanged();
    29. }
    30. });
    31. }
    32. private void initRecyclerView() {
    33. LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
    34. mRecyclerView.setLayoutManager(linearLayoutManager);
    35. VerticalSpacingItemDecorator itemDecorator = new VerticalSpacingItemDecorator((10));
    36. mRecyclerView.addItemDecoration(itemDecorator);
    37. mNoteRecyclerAdapter=new NotesRecyclerAdapter(mNotes, this);
    38. mRecyclerView.setAdapter(mNoteRecyclerAdapter);
    39. }
    40. @Override
    41. public void onNoteClick(int position) {
    42. Intent intent = new Intent(this, NotenDetailsActivity.class);
    43. intent.putExtra("selected_note", mNotes.get(position));
    44. startActivity(intent);
    45. }
    46. }
    Alles anzeigen

    NotenDetailsActivity: (enthält das Tablayout mit 4 Tabs).

    Java-Quellcode

    1. public class NotenDetailsActivity extends AppCompatActivity implements View.OnClickListener, TabLayout.BaseOnTabSelectedListener {
    2. private Note mInitialNote;
    3. private TextView mViewTitle;
    4. private ViewPager mViewPager;
    5. @Override
    6. protected void onCreate(Bundle savedInstanceState) {
    7. super.onCreate(savedInstanceState);
    8. setContentView(R.layout.activity_noten_details);
    9. mViewPager = findViewById(R.id.viewPager);
    10. TabLayout tabLayout = findViewById(R.id.tablayout);
    11. tabLayout.setupWithViewPager(mViewPager);
    12. PageAdapter pageAdapter = new PageAdapter(getSupportFragmentManager(), tabLayout.getTabCount());
    13. mViewPager.setAdapter(pageAdapter);
    14. mViewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
    15. tabLayout.addOnTabSelectedListener(this);
    16. mInitialNote = getIntent().getParcelableExtra("selected_note");
    17. mViewTitle = findViewById(R.id.note_toolbar_title);
    18. mViewTitle.setText(mInitialNote.getTitle());
    19. Bundle bundle = new Bundle();
    20. bundle.putString("komponist", mInitialNote.getKomponist());
    21. Tab1Fragment fragment = new Tab1Fragment();
    22. fragment.setArguments(bundle);
    23. getSupportFragmentManager().beginTransaction().replace(R.id.DetailsContainer, fragment).commit();
    24. }
    25. @Override
    26. public void onTabSelected(TabLayout.Tab tab) {
    27. viewPager.setCurrentItem(tab.getPosition());
    28. }
    29. @Override
    30. public void onTabUnselected(TabLayout.Tab tab) {
    31. }
    32. @Override
    33. public void onTabReselected(TabLayout.Tab tab) {
    34. }
    35. @Override
    36. public void onClick(View view) {
    37. finish();
    38. }
    39. @Override
    40. public void onBackPressed() {
    41. super.onBackPressed();
    42. }
    43. }
    Alles anzeigen


    Tab1Fragment: (Tab2-4 sind genauso aufgebaut, enthalten nur unterschiedliche Datenfelder)

    Java-Quellcode

    1. public class Tab1Fragment extends Fragment {
    2. public Tab1Fragment() {
    3. // Required empty public constructor
    4. }
    5. @Override
    6. public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    7. View view = inflater.inflate(R.layout.fragment_tab1, container, false);
    8. TextView mViewKomponist = view.findViewById(R.id.note_komponist);
    9. if (getArguments() != null) {
    10. String tKomponist = getArguments().getString("komponist");
    11. mViewKomponist.setText(tKomponist);
    12. return view;
    13. }
    14. else
    15. {
    16. return nothing;
    17. }
    18. }
    19. }
    Alles anzeigen


    Tab2Fragment:

    Java-Quellcode

    1. public class Tab2Fragment extends Fragment {
    2. public Tab2Fragment() {
    3. // Required empty public constructor
    4. }
    5. @Override
    6. public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    7. View view = inflater.inflate(R.layout.fragment_tab2, container, false);
    8. TextView mViewArrangeur = view.findViewById(R.id.note_arrangeur);
    9. if (getArguments() != null) {
    10. String tArrangeur = getArguments().getString("arrangeur");
    11. mViewArrangeur.setText(tArrangeur);
    12. return view;
    13. }
    14. else
    15. {
    16. return nothing;
    17. }
    18. }
    19. }
    Alles anzeigen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von lightning37 ()

  • Neu

    Hier noch die Layouts:

    MainLayout (Liste der Datensätze):

    XML-Quellcode

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3. xmlns:app="http://schemas.android.com/apk/res-auto"
    4. xmlns:tools="http://schemas.android.com/tools"
    5. android:layout_width="match_parent"
    6. android:layout_height="match_parent"
    7. tools:context=".MainActivity">
    8. <com.google.android.material.appbar.AppBarLayout
    9. android:layout_width="match_parent"
    10. android:layout_height="wrap_content">
    11. <androidx.appcompat.widget.Toolbar
    12. android:id="@+id/notes_toolbar"
    13. android:layout_width="wrap_content"
    14. android:layout_height="?attr/actionBarSize"
    15. android:background="?attr/colorPrimary"
    16. app:layout_scrollFlags="scroll|enterAlways">
    17. </androidx.appcompat.widget.Toolbar>
    18. </com.google.android.material.appbar.AppBarLayout>
    19. <androidx.recyclerview.widget.RecyclerView
    20. android:layout_width="match_parent"
    21. android:layout_height="match_parent"
    22. android:orientation="vertical"
    23. android:id="@+id/recyclerView"
    24. android:padding="5dp"
    25. app:layout_behavior="@string/appbar_scrolling_view_behavior">
    26. </androidx.recyclerview.widget.RecyclerView>
    27. </androidx.coordinatorlayout.widget.CoordinatorLayout>
    Alles anzeigen


    NotenListActivity (für die Anzeige im RecyclerViev):

    XML-Quellcode

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3. xmlns:tools="http://schemas.android.com/tools"
    4. android:layout_width="match_parent"
    5. android:layout_height="wrap_content"
    6. android:background="@color/lightYellow"
    7. android:orientation="vertical"
    8. android:weightSum="100"
    9. android:gravity="center_vertical">
    10. <TextView
    11. android:id="@+id/note_title"
    12. android:layout_width="match_parent"
    13. android:layout_height="wrap_content"
    14. android:layout_weight="100"
    15. android:paddingTop="5dp"
    16. android:paddingBottom="5dp"
    17. android:paddingLeft="10dp"
    18. android:text="some title"
    19. android:textColor="@color/black"
    20. android:textSize="20sp" />
    21. <TextView
    22. android:id="@+id/note_komponist"
    23. android:layout_width="match_parent"
    24. android:layout_height="wrap_content"
    25. android:layout_weight="25"
    26. android:paddingLeft="10dp"
    27. android:text="Dec, 11"
    28. android:textColor="@color/black"
    29. android:textSize="12sp" />
    30. <TextView
    31. android:id="@+id/note_arrangeur"
    32. android:layout_width="match_parent"
    33. android:layout_height="wrap_content"
    34. android:layout_weight="25"
    35. android:paddingLeft="10dp"
    36. android:text="Dec, 11"
    37. android:textColor="@color/black"
    38. android:textSize="12sp" />
    39. </LinearLayout>
    Alles anzeigen


    DetailsLayout mit Tablayout:

    XML-Quellcode

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3. xmlns:app="http://schemas.android.com/apk/res-auto"
    4. android:layout_width="match_parent"
    5. android:layout_height="match_parent"
    6. android:orientation="vertical"
    7. android:background="@color/lightYellow">
    8. <com.google.android.material.appbar.AppBarLayout
    9. android:layout_width="match_parent"
    10. android:layout_height="wrap_content">
    11. <androidx.appcompat.widget.Toolbar
    12. android:id="@+id/notes_toolbar"
    13. android:layout_width="match_parent"
    14. android:layout_height="?attr/actionBarSize"
    15. android:background="?attr/colorPrimary">
    16. <include layout="@layout/layout_note_toolbar"/>
    17. </androidx.appcompat.widget.Toolbar>
    18. </com.google.android.material.appbar.AppBarLayout>
    19. <com.google.android.material.tabs.TabLayout
    20. android:id="@+id/tablayout"
    21. android:layout_width="match_parent"
    22. android:layout_height="wrap_content"
    23. android:background="@color/colorPrimary"
    24. app:tabSelectedTextColor="@android:color/white"
    25. app:tabTextColor="@android:color/black">
    26. <com.google.android.material.tabs.TabItem
    27. android:id="@+id/tabPage1"
    28. android:layout_width="wrap_content"
    29. android:layout_height="wrap_content"
    30. android:text="Details 1"/>
    31. <com.google.android.material.tabs.TabItem
    32. android:id="@+id/tabPage2"
    33. android:layout_width="wrap_content"
    34. android:layout_height="wrap_content"
    35. android:text="Details 2" />
    36. <com.google.android.material.tabs.TabItem
    37. android:id="@+id/tabPage3"
    38. android:layout_width="wrap_content"
    39. android:layout_height="wrap_content"
    40. android:text="Details 3" />
    41. <com.google.android.material.tabs.TabItem
    42. android:id="@+id/tabPage4"
    43. android:layout_width="wrap_content"
    44. android:layout_height="wrap_content"
    45. android:text="Details 4" />
    46. </com.google.android.material.tabs.TabLayout>
    47. <androidx.viewpager.widget.ViewPager
    48. android:id="@+id/viewPager"
    49. android:layout_width="match_parent"
    50. android:layout_height="wrap_content" >
    51. </androidx.viewpager.widget.ViewPager>
    52. <FrameLayout
    53. android:id="@+id/DetailsContainer"
    54. android:layout_width="match_parent"
    55. android:layout_height="wrap_content">
    56. </FrameLayout>
    57. </LinearLayout>
    Alles anzeigen

    fragment_tab1.xml:

    Java-Quellcode

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3. android:layout_width="match_parent"
    4. android:layout_height="match_parent">
    5. <TextView
    6. android:id="@+id/note_komponist"
    7. android:layout_width="wrap_content"
    8. android:layout_height="wrap_content"
    9. android:textColor="@color/black"
    10. android:textSize="16sp"
    11. android:layout_column="2"/>
    12. </FrameLayout>
    Alles anzeigen


    fragment_tab2.xml:

    XML-Quellcode

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3. android:layout_width="match_parent"
    4. android:layout_height="match_parent">
    5. <TextView
    6. android:id="@+id/note_arrangeur"
    7. android:layout_width="wrap_content"
    8. android:layout_height="wrap_content"
    9. android:textColor="@color/black"
    10. android:textSize="16sp"
    11. android:layout_column="2"/>
    12. </FrameLayout>
    Alles anzeigen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von lightning37 ()

  • Neu

    Hallo ein grundlegender fehler ist in der NotenDetailsActivity. Und zwar in der onCreate.
    Estens brauchst du da keine fragment Transaktion machen ist hier falsch. Das macht dein Viewpager für dich. Auch das übergeben der Argumente in der Activity onCreate ist falsch.
    In deinem Adapter erstelltes du die instanzen der Fragmente mit new. In der activity erstellst du für das erste fragment auch wieder ein neues Objekt mit New. Das ist nicht die gleiche Instanz.

    In der oncreate solltest du die argumente nicht übergeben. Und wenn ja dann sorge dafür das es auch die richtige Instanz ist. Das gleiche Objekt was dein Adapter erstellt.

    Parameter Übergabe würde ich im Adapter machen, habe ich auch schon mal gesagt.

    Somit ist es klar das du keine Argumente in den fragment die der viewpager erstellt hast. Und nichts angezeigt wird.

    Also baue dein Adapter um und übergebe da die Argumente.

    Oder benutze viewmodel.

    Wenn du dir msl eine neue app mit tabs vom Studio erstellen läßt siest du das Prinzip. Auch das da kein Transaktion on der activity notwendig ist.
    Ein Feedback auf Tipps ist auch schön. :P
  • Neu

    Hi jogimuc,

    erstmal vielen Dank, dass du dir die Zeit nimmst, meinen gesamten Code zu sichten und mir weiterzuhelfen. Ist nicht selbstverständlich.
    Danke für die Hinweise, ich werde morgen versuchen, das entsprechend deinen HInweisen umzubauen. Ich halte dich auf dem Laufenden.
    Hab dir noch ne PN geschickt.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von lightning37 ()

  • Neu

    Der Intent kommt doch in der NotenDetailsActivity an. Dort hast du ja auch versucht die Daten an das Fragment zu übergeben. Nur eben an die das falsche Instanz.

    Erste Möglichkeit beim Aufruf des Adapters übergibst du auch noch die Daten. Die Anzahl der Tabs und den Fragmentmanager übergibst du ja schon.

    Warum nicht auch die Daten. Aber bitte alle für alle Fragmente und nicht nur für das erste.

    Zweite Variante erstelle in der Adapter Klasse eine Methode dafür bei der du die Daten übergibst, warscheilich brauchst du auch den context der activity im Adapter um auf die Daten der db zuzugreifen.

    Um in der Activity auf die Methode aufzurufen. Benutzt du die Instanz des Adapters denn du in der Activity ja erstellt hast.

    Das ist eigentlich einfache OOP.

    Im Adapter übergibst du jedem Fragment seine Argumente, Daten.
    Die du dann in der Fragment Klasse anzeigen läst.

    Denke aber daran was ich am Anfang gesagt habe das immer die Nachbar Fragmente schon vorgeladen werden also es wird nicht beim anzeigen geupdatet.
    Wenn ich mir aber deinen Code ansehe ist das bei deinem Code nicht der Fall.
    Die Daten werden ja nicht in den Tabs verändert sondern nur angezeigt.
    Richtig?
    Somit kannst du Daten auch im Adapter nach dem Objekt erstellen jedem Fragment im bundle übergeben. Wie ich sagte für jedes Fragment nicht nur für das erste.



    Ich kann dir keinen Code geben da ich diese Woche nur am Handy bin.
    Ein Feedback auf Tipps ist auch schön. :P

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von jogimuc ()