-1

ich für android eine Galerie App mache, und ich bin ein Problem gegenüber:Ansichten immer in einer Ansicht Pager zu einem Fragment erneut hinzugefügt

Ich habe einen ViewPager im MainActivity die 2-Fragmente haben, eine für Bilder und eins für Videos. Jedes dieser Fragmente enthält eine RecyclerView, um Buckets der angesehenen Medientypen anzuzeigen. B. im Bildfragment, werden Buckets für "Kamera", "Downloads" usw. angezeigt. Ich habe die onClick an die Artikel in der Recycler-Ansicht angehängt, und die funktionieren auch gut. Das Problem ist das:

Immer wenn sich die Ausrichtung des Geräts ändert, die Eimer (die im Grunde Kartenansichten sind) in der Recycler-Ansicht sind dupliziert. Wenn das Fragment zum Beispiel ursprünglich zwei Ordner "Kamera" und "Downloads" enthielt, hat das Fragment jetzt 4 Ordner, 2 für "Kamera" und 2 für "Downloads", und diese Duplizierung passiert jedes Mal, wenn sich die Ausrichtung ändert.

MainActivity Code:

public class MainActivity extends AppCompatActivity { 
private static final int REQUEST_PERMISSIONS_CODE = 100; 
ArrayList<FoldersModel> foldersModelArrayList = new ArrayList<>(); 


Toolbar toolbar; 
ViewPager mainViewPager; 
SpringIndicator indicator; 
MainPagerAdapter mainPagerAdapter; 

Context context; 
HashMap<String, ArrayList<ImageModel>> map; 


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

    context = this; 
    map = new HashMap<>(); 

    root = findViewById(R.id.root); 
    contentHamburger = findViewById(R.id.content_hamburger); 
    toolbar = findViewById(R.id.mainActivityToolBar); 

    setSupportActionBar(toolbar); 
    mainViewPager = findViewById(R.id.mainViewPager); 
    indicator = findViewById(R.id.indicator); 

    if ((ContextCompat.checkSelfPermission(
      getApplicationContext(), 
      Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)) { 
     if ((ActivityCompat.shouldShowRequestPermissionRationale(
       MainActivity.this, 
       Manifest.permission.READ_EXTERNAL_STORAGE))) { 

     } else { 
      ActivityCompat.requestPermissions(MainActivity.this, 
        new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, 
        REQUEST_PERMISSIONS_CODE); 
     } 
    } else { 
     loadImages(); 
    } 

    mainPagerAdapter = new MainPagerAdapter(getSupportFragmentManager(), foldersModelArrayList); 
    mainViewPager.setAdapter(mainPagerAdapter); 
    indicator.setViewPager(mainViewPager); 
} 

@Override 
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
    if (requestCode == REQUEST_PERMISSIONS_CODE) { 
     for (int i = 0; i < grantResults.length; i++) { 
      if (grantResults.length > 0 && grantResults[i] == PackageManager.PERMISSION_GRANTED) { 
       loadImages(); 
      } else { 
       Toast.makeText(MainActivity.this, "Permission Denied", Toast.LENGTH_LONG).show(); 
      } 
     } 
    } 

    super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
} 


public void loadImages() { 
    //load images code, not really useful for this question 
    //basically populates the folderModelArrayList  
} 

public static class ImageFoldersFragment extends Fragment { 

    public ImageFoldersFragment(){ 

    } 

    public static ImageFoldersFragment newInstance(int position, ArrayList<FoldersModel> foldersModels) { 
     ImageFoldersFragment fragment = new ImageFoldersFragment(); 
     Bundle bundle = new Bundle(); 
      bundle.putParcelableArrayList("foldersData", foldersModels); 
     bundle.putInt("position", position); 
     fragment.setArguments(bundle); 
     return fragment; 
    } 

    @Nullable 
    @Override 
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_image, container, false); 
     RecyclerView recyclerView = view.findViewById(R.id.imageFoldersRecyclerView); 
     Bundle bundle = getArguments(); 
      ArrayList<FoldersModel> foldersModel = bundle.getParcelableArrayList("foldersData"); 
     recyclerView.setLayoutManager(new GridLayoutManager(getContext(),2)); 
     recyclerView.setAdapter(new FoldersAdapter(getContext(), MainActivity.foldersModelArrayList)); 

     recyclerView.addOnItemTouchListener(new ImageClickedListener(getContext(), new OnItemClickListener() { 
      @Override 
      public void onItemClick(View view, final int position) { 
       Intent intent = new Intent(getContext(), SingleFolderActivity.class); 
       intent.putParcelableArrayListExtra("data", MainActivity.foldersModelArrayList.get(position).getImageModelsList()); 
       intent.putExtra("bucket", MainActivity.foldersModelArrayList.get(position).getFoldersName()); 
       startActivity(intent); 
      } 
     })); 

     return view; 
    } 
} 

class MainPagerAdapter extends FragmentPagerAdapter { 
    String[] tabs = {"Images", "Videos"}; 
    ArrayList<FoldersModel> foldersModelArrayList; 

    public MainPagerAdapter(FragmentManager fm, ArrayList<FoldersModel> list) { 
     super(fm); 
     foldersModelArrayList = list; 
    } 

    @Override 
    public Fragment getItem(int position) { 
     ImageFoldersFragment fragment = ImageFoldersFragment.newInstance(position, foldersModelArrayList); 
     return fragment; 
    } 

    @Override 
    public int getCount() { 
     return 2; 
    } 

    @Nullable 
    @Override 
    public CharSequence getPageTitle(int position) { 
     return tabs[position]; 
    } 
} 

}

Warum passiert das das? Und gibt es einen Weg dahin? Vielen Dank im Voraus!

+0

Wir debuggen normalerweise nicht ganze Projekte, sondern nur [MCVE] (https://stackoverflow.com/help/mcve). Und wir mögen es nicht, Code woanders lesen zu müssen, sondern in der Frage. – kalabalik

+0

Ok, wird die Frage aktualisieren. Vielen Dank! –

Antwort

0

Versuchen Sie dies.

Marke foldersModelArrayList nicht statisch.

Initialisieren Sie es innerhalb onCreate().

+1

Hat getan, was Sie gesagt haben, und es hat wie ein Charme funktioniert! –

+0

Froh, das zu hören. –

Verwandte Themen