如何从 recyclerView 接收 JSON 数据到另一个 activity

How to receive JSON data from recyclerView to another activity

我正在制作一个音乐播放器应用程序。歌曲取自 JSON url 和 我有一个 recyclerView 来显示数据。现在点击 recyclerView 另一个音乐播放器 activity 启动并开始播放歌曲。这是问题所在,点击 recyclerview 只会将点击的索引数据传递给另一个 activity。现在我想播放音乐播放器 activity 中的下一首歌曲。 我怎样才能做到这一点 ?我正在使用改造和 rxjava 来获取数据。

这是回收视图:

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

    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Context context = view.getContext();

            Intent intent = new Intent(context , MusicPlayerActivity.class);
            intent.putExtra(Intent.EXTRA_TEXT , mAndroidList.get(position).getDesc());
            intent.putExtra("url", mAndroidList.get(position).getAudio());

            context.startActivity(intent);
            ((Activity) context).overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
        }
    });

App.java

public class App implements Serializable {

@SerializedName("itemId")
@Expose
private String itemId;
@SerializedName("desc")
@Expose
private String desc;
@SerializedName("audio")
@Expose
private String audio;

public App(String itemId, String desc, String audio) {
    this.itemId = itemId;
    this.desc = desc;
    this.audio = audio;

}


public String getId() {
    return itemId;
}

public String getDesc() {
    return desc;
}

public String getAudio() {
    return audio;
}

}

根据我的经验,我能想出 RecyclerView 的最佳方法是提取视图的点击侦听器(activities/fragment 或 ...)。

我认为在您的场景中,在 activity 中实现侦听器也是一种很好的做法。

因此,请在您的 activity 中保留对您的音乐对象的引用,然后当点击发生时,只需将列表与所选音乐的索引一起传递给另一个 activity。

这里是它可能的样子的概述:

public class ListActivity extends AppCompatActivity{

ArrayList<App> musicList;
RecyclerView recyclerView;
Adapter adapter;

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

    musicList = getMusics();
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    adapter = new Adapter(musicList);
    adapter.setListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            int index =(int) v.getTag();

            Intent intent = new Intent(ListActivity.this , MusicPlayerActivity.class);
            intent.putExtra("index" , index);
            intent.putExtra("music_list", musicList);

            startActivity(intent);
            overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
        }
    });
    recyclerView.setAdapter(adapter);

}
}

和适配器:

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

    private View.OnClickListener listener;

    public Adapter(List<App> musics) {
        this.musics = musics;
    }

    private List<App> musics;

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        //create your view holder here
        return null;
    }
    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
        //bind the view
//            .
//            .
            //remember to store the index to be able to retrieve it later
            holder.itemView.setTag(position);
            holder.itemView.setOnClickListener(listener);
        }
    @Override
    public int getItemCount() {
        return musics.size();
    }

    public void setListener(View.OnClickListener listener) {
        this.listener = listener;
    }

希望对您有所帮助

尝试使用Bundle

通过
Context context = view.getContext();

Intent intent = new Intent(context , MusicPlayerActivity.class);
Bundle bundle = new Bundle();
bundle.putSerializable(Intent.EXTRA_TEXT, mAndroidList);
bundle.putInt("POSITION", position);
intent.putExtras(bundle);

context.startActivity(intent);
((Activity) context).overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);

MusicPlayerActivity.class中使用下面的代码获取数据,

Intent intent = this.getIntent();
Bundle bundle = intent.getExtras();
int position = bundle.getInt("POSITION");
List<App> list = (List<App>)bundle.getSerializable(Intent.EXTRA_TEXT);

谢谢。

尝试使用 Bundle.Serializable

传递可序列化列表
Intent intent = new Intent(context , MusicPlayerActivity.class);
Bundle bundle = new Bundle();
bundle.putSerializable("value", mAndroidList);
intent.putExtras(bundle)

您可以通过以下方式获取:

Intent intent = this.getIntent();
Bundle bundle = intent.getExtras();
List<App> thumbs=(List< App >)bundle.getSerializable("value");

如果你能得到一些详细的信息,请阅读 Builde

使用Gson将json数据转成字符串

示例。

intent.putExtra("data", new Gson().toJson(你的json对象).

并在 activity 收到它喜欢

Data = new Gson().fromJson(getIntent.getStringExtra("data"), YourModel.class);

试试吧:

Intent intent = new Intent(context , MusicPlayerActivity.class);
Bundle bundle = new Bundle();
bundle.putSerializable("value", mAndroidList);
intent.putExtras(bundle)

Intent intent = this.getIntent();
Bundle bundle = intent.getExtras();
List<App> thumbs=(List< App >)bundle.getSerializable("value");