0

Ich baue einen Audio-Player und es gibt ein Fragment "My Files", in dem der interne Speicher des Telefons für alle Ordner abgefragt wird, die Audiodateien enthalten und angezeigt werden. Was ich getan habe, ist im "Meine Dateien" -Fragment Ich zeige die Ordner (in RecyclerView). Wenn Sie auf ein Element (Ordner) dieser recycleView klicken, wird eine andere Aktivität gestartet (MyFilesSong.java), die die Audiodateien des angeklickten Ordners anzeigt.Wie können Artikel von zwei verschiedenen Arraylists in derselben RecyclerView angezeigt werden?

Was ich will - Ich möchte das Fragment "My Files" den Ordner anzeigen (wie es bereits tut) und wenn ich auf ein Element (Ordner) klicken, sollten die Audio-Dateien in das gleiche Fragment geladen werden Ich möchte eine andere Aktivität für diese). Ich hoffe ich bin klar.

PS: Zwei recyclerviews verwendet werden und beide haben Arraylist von verschiedenen Typen- „MyFiles“ verwendet foldermodel während „Songs.java“ songinfomodel verwendet

Im zweiten gif (Mine) auf das Element öffnet ein neues Aktivität. Aber ich möchte, was in der ersten umgesetzt wird. Das Fragment zeigt die Ordner und beim Anklicken des Ordners werden die Audiodateien angezeigt.

MyFiles.java:

public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.my_files_activity, container, false); 



    recyclerView= view.findViewById(R.id.recyclerView_files); 
    pathTextView= view.findViewById(R.id.myFilesPath); 

    myList = new ArrayList<Object>(); 

    linearLayoutManager=new LinearLayoutManager(getContext()); 
    recyclerView.setLayoutManager(linearLayoutManager); 






    Songpath = SongPath(); 

    for(int i = 0; i<Songpath.size();i++) { 

     Log.e("Paths: ", Songpath.get(i)); 

     file = new File( Songpath.get(i)) ; 

     try { 
      sforFolders = new FolderModel(file.getParentFile().getName(),file.getParentFile().getCanonicalPath()); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     myList.add(sforFolders); 



    } 

    myFilesAdapter = new MyFilesAdapter(getContext(), new MyFilesAdapter.MyFilesItemClickListener() { 
     @Override 
     public void folderonclicklistener(FolderModel name, int position) { 

      Toast.makeText(getContext(), "Folder Name: "+name.getFolderName()+" Position: "+position, Toast.LENGTH_SHORT).show(); 

      Intent i = new Intent(getContext(),MyFilesSongs.class); 
      i.putExtra("parentPath",name.getFolderPath()); 
      startActivity(i); 


     } 
    }); 

    recyclerView.setAdapter(myFilesAdapter); 
    myFilesAdapter.getFilesFolders(myList); 
    myFilesAdapter.notifyDataSetChanged(); 







    return view; 
    } 

MyFilesAdapter.java:

public class MyFilesAdapterFinal extends RecyclerView.Adapter<MyFilesAdapterFinal.ViewHolder> { 

ArrayList<FolderModel> SongParentPath = new ArrayList<>(); 
Context context; 
itemClickListener listener; 

public MyFilesAdapterFinal(ArrayList<FolderModel> songParentPath, Context context,itemClickListener listener) { 
    SongParentPath = songParentPath; 
    this.context = context; 
    this.listener = listener; 
} 

@Override 
public MyFilesAdapterFinal.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

    View v = LayoutInflater.from(context).inflate(R.layout.row_myfiles,parent,false); 

    return new ViewHolder(v); 
} 

@Override 
public void onBindViewHolder(MyFilesAdapterFinal.ViewHolder holder, int position) { 

    FolderModel name = SongParentPath.get(position); 

    holder.rowtext.setText(String.valueOf(name.getFolderName())); 
    holder.bind(name,listener); 





} 

@Override 
public int getItemCount() { 
    return (SongParentPath==null)? 0 : SongParentPath.size(); 
} 

public class ViewHolder extends RecyclerView.ViewHolder { 

    TextView rowtext; 

    public ViewHolder(View itemView) { 
     super(itemView); 

     rowtext = itemView.findViewById(R.id.rowtext); 
    } 

    public void bind(final FolderModel name, final itemClickListener listener) { 

     itemView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       listener.onClick(name,getLayoutPosition()); 
      } 
     }); 
    } 
} 

public interface itemClickListener{ 

    void onClick(FolderModel name, int position); 
} 

Songs.java: (Aktivität, die Audio-Dateien aufgelistet):

protected void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    LayoutInflater inflater = LayoutInflater.from(this); 
    View view6 = inflater.inflate(R.layout.songs_activity, null); 
    FrameLayout container6 = (FrameLayout) findViewById(R.id.container); 
    container6.addView(view6); 



    recyclerView = findViewById(R.id.recyclerView); 
    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getApplicationContext()); 
    recyclerView.setLayoutManager(linearLayoutManager); 

    String parentPath = getIntent().getExtras().getString("parentPath"); 

    SongList = displayFolderFiles(parentPath); 



    songAdapter = new SongAdapter(getApplicationContext(), SongList, new SongAdapter.RecyclerItemClickListener() { 
     @Override 
     public void onClickListener(SongInfoModel song, int position) { 




      Toast.makeText(getApplicationContext(), song.getSongName(), Toast.LENGTH_SHORT).show(); 


      BaseActivity.setsongText(song); 
      BaseActivity.ButtonPause(); 
     //  playAudio(position); 
      BaseActivity.slidingUpPanelCollapsed(); 





     } 

     @Override 
     public void onLongClickListener(final SongInfoModel song, final int position, View v) { 



      // AddToPlayListDialog(song, v); 


     } 


    }); 


    recyclerView.setAdapter(songAdapter); 

} 

SongsAdapter.java:

 public class SongAdapter extends RecyclerView.Adapter<SongAdapter.SongHolder> { 

ArrayList<SongInfoModel> SongList = new ArrayList<>(); 
Context context; 
private RecyclerItemClickListener listener; 








public SongAdapter(Context context, ArrayList<SongInfoModel> SongList, RecyclerItemClickListener listener) { 

    this.context = context; 
    this.SongList = SongList; 
    this.listener = listener; 

} 




@Override 
public SongAdapter.SongHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View view = LayoutInflater.from(context).inflate(R.layout.row_song, parent, false); 
    return new SongHolder(view); 
} 

@Override 
public void onBindViewHolder(final SongAdapter.SongHolder holder, final int position) { 



     final SongInfoModel songInfoModel = SongList.get(position); 


     holder.songName.setText(songInfoModel.SongName); 
     holder.artistName.setText(songInfoModel.ArtistName); 
     holder.duration.setText(String.valueOf(songInfoModel.duration)); 
     String duration = Utility.convertDuration(songInfoModel.getDuration()); 
     holder.duration.setText(duration); 
     Picasso.with(context).load(songInfoModel.getAlbumIDArtwork()).placeholder(R.drawable.ic_launcher).into(holder.iv_artwork); 
     holder.bind(songInfoModel, listener); 






} 

@Override 
public int getItemCount() { 
    return SongList.size(); 
} 

public class SongHolder extends RecyclerView.ViewHolder { 
    TextView songName; 
    TextView artistName; 
    TextView duration; 
    private ImageView iv_artwork; 



    public SongHolder(View itemView) { 

     super(itemView); 
     songName = (TextView)itemView.findViewById(R.id.SongName); 
     artistName= (TextView)itemView.findViewById(R.id.ArtistName); 
     duration = (TextView) itemView.findViewById(R.id.duration); 
     iv_artwork = (ImageView) itemView.findViewById(R.id.iv_artwork); 


    } 

    public void bind(final SongInfoModel songInfoModel, final RecyclerItemClickListener listener) { 
     itemView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       listener.onClickListener(songInfoModel, getLayoutPosition()); 

      } 
     }); 

     itemView.setOnLongClickListener(new View.OnLongClickListener() { 

      @Override 
      public boolean onLongClick(View view) { 

       listener.onLongClickListener(songInfoModel, getLayoutPosition(),view); 
       return true; 
      } 
     }); 

    } 

} 

public interface RecyclerItemClickListener{ 

    void onClickListener(SongInfoModel songInfoModel, int position); 
    void onLongClickListener(SongInfoModel songInfoModel, int position, View view); 

}

+0

ein Fragment Transaktion Stellen Fragmente statt offen eine neue Aktivität auf dem clicklistener zu ersetzen. – Aiapaec

+0

Können Sie mir das Beispiel im Code geben? – Rektirino

+0

Ändern Sie Ihre MyFilesSongs-Klasse als ein Fragment und ersetzen Sie ein vorhandenes Fragment durch ein neues Fragment in der Adpater-Klasse. –

Antwort

0

Zuerst wird in die Aktivität, die Host beide recyclerviews sollten Sie hinzufügen:

<FrameLayout android:id="@+id/fragment_change" 
android:layout_width="match_parent" android:fitsSystemWindows="true" 
android:layout_height="match_parent"/> 

da Ihre beiden Fragmente nur RecyclerViews sind Sie mit, dass als Hauptbehälter gehen, in der Tätigkeit (stellen Sie sicher, das ist ein AppCompatActi vity), rufen Sie dies:

SupportFragmentManager fragmentManager = getSupportFragmentManager(); 
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
FolderListFragment fragment = new FolderListFragment(); 
fragment.setArguments(bundle); 
fragmentTransaction.replace(R.id.fragment_change, fragment); 
fragmentTransaction.commit(); 

Und von der foldersAdapter sollten Sie mit diesem gehen, sondern die Aktivität der Aufruf:

SupportFragmentManager fragmentManager = getSupportFragmentManager(); 
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
FilesListFragment fragment = new FilesListFragment(); 
Bundle bundle = new Bundle(); 
bundle.putInt("parentPath",name.getFolderPath()); 
fragment.setArguments(bundle); 
fragmentTransaction.replace(R.id.fragment_change, fragment); 
fragmentTransaction.commit(); 

und die Aktivität, die die RecyclerView mit den Dateien hält müssen erweitert Fragment.

Auf der OnCreate des Fragment:

Bundle bundle = this.getArguments(); 
if (bundle != null) { 
     int myInt = bundle.getString("parentPath", defaultValue); 
} 
+0

Die MainActivity.java hostet das Fragment "MyFiles" und Songs.java ist eine unabhängige Aktivität wie MainActivity. – Rektirino

+0

MyFiles ist ein Fragment, während Songs.java eine Aktivität ist – Rektirino

+0

Und wie Sie in der ersten GIF sehen, sind alle Fragmente in Viewpager (tablayout) – Rektirino

0

Ich denke, dass Sie Expandable Recycler View als Lösung verwenden möchten. Hier ist ein Link

Expandable RecyclerView

Wenn Sie irgendein Problem in Bezug auf die Umsetzung der erweiterbaren Recycler Ansicht haben, zögern nicht, zu fragen, ich helfen werde ich hoffe, das hilft;)

+0

Nein, ich weiß, was Expandable Recycler View macht. Lies meine Frage noch einmal – Rektirino

+0

Oh, ich sehe Entschuldigung Kumpel;) Ich denke, Sie können ein anderes Fragment verwenden, um die Liste der Audios (oder Liste von was auch immer Sie haben) in der gleichen Aktivität nur Fragment zu implementieren, wenn es okay ist, kann ich damit helfen. – Aliy

+0

Kein Problem, kannst du mir mit den Fragmenten helfen? – Rektirino

Verwandte Themen