【问题标题】:How to display items of two different arraylists in same recyclerView?如何在同一个recyclerView中显示两个不同arraylist的项目?
【发布时间】:2017-12-31 13:59:16
【问题描述】:

我正在构建一个音频播放器,并且有一个片段“我的文件”,其中会查询手机内部存储中包含音频文件并显示的所有文件夹。我所做的是在“我的文件”片段中显示文件夹(在 recyclerView 中)。在单击此 recyclerView 的任何项目(文件夹)时,另一个活动开始(MyFilesSong.java),它显示单击文件夹的音频文件。

我想要什么 - 我希望片段“我的文件”显示文件夹(就像它已经显示的那样),当我单击任何项​​目(文件夹)时,音频文件应该加载到同一个片段中(我不想要为此进行另一项活动)。我希望我很清楚。

PS:使用了两个recyclerviews,它们都有不同类型的arraylist-“MyFiles”使用文件夹模型,而“Songs.java”使用songinfomodel

在第二个 gif(mine) 中,单击该项目会打开一个新活动。但我想要第一个中实施的内容。片段显示文件夹,单击文件夹会显示音频文件。

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:(列出音频文件的活动):

 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);

}

【问题讨论】:

  • 进行片段事务以替换片段,而不是在 clicklistener 上打开新活动。
  • 你能给我代码中的例子吗?
  • 将您的 MyFilesSongs 类更改为片段并用 adpater 类中的新片段替换现有片段。

标签: android android-fragments android-recyclerview android-music-player


【解决方案1】:

我认为您可能希望使用 Expandable Recycler View 作为解决方案。这是一个链接

Expandable RecyclerView

如果您对 Expandable Recycler View 的实施有任何问题,请不要犹豫,我会帮助您 我希望这会有所帮助;)

【讨论】:

  • 不,我知道 Expandable Recycler View 的作用。再次阅读我的问题
  • 哦,对不起,伙计;)我认为您可以使用另一个片段来显示同一活动中的音频列表(或您拥有的任何模型的列表),如果可以的话,只需执行片段我可以提供帮助用那个。
  • 没问题,你能帮我处理碎片吗?
  • 我认为这并不复杂,我已经查看了您的代码,但目前无法重写您的代码,但是在您当前的活动中创建容器的简单方法以及两个相互交互的片段传递的项目列表你想展示
  • 您可以为您的模型使用 Serializable 或 Parcelable 接口以传递您的模型列表
【解决方案2】:

首先,在托管两个回收站视图的活动中,您应该添加以下内容:

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

由于您的两个片段都只是 RecyclerViews,您将其作为主容器,在活动中(确保这是一个 AppCompatActivity),您称之为:

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

从文件夹适配器你应该去,而不是调用活动:

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();

而持有 RecyclerView 和文件的活动必须扩展 Fragment。

在 Fragment 的 OnCreate 上:

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

【讨论】:

  • 实际上 MainActivity.java 承载了片段“MyFiles”,而 Songs.java 是一个独立的活动,类似于 MainActivity。
  • MyFiles 是一个片段,而 Songs.java 是一个活动
  • 正如你在第一个 GIF 中看到的,所有的片段都在 viewpager(tablayout) 中
  • 我实现了您在此处解释的内容。它是部分成功的。问题是两个布局相互重叠。
  • @Rektirino 布局相互重叠是什么意思?
猜你喜欢
  • 2021-08-15
  • 2022-06-23
  • 2017-10-23
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
相关资源
最近更新 更多