为了账号安全,请及时绑定邮箱和手机立即绑定

如何将数据从一个活动传递到另一个活动

如何将数据从一个活动传递到另一个活动

陪伴而非守候 2023-02-23 17:22:05
我正在创建一个事件应用程序,其中包含recyclerview.事件recyclerview包括事件名称、图像、日期和时间、心形图像(例如:Instagram 上的心形按钮),当用户单击“感兴趣”按钮时,它会改变颜色。单击任何事件后,会出现其描述,并且有两个按钮:“感兴趣”和“参加”。如果用户单击“感兴趣”,则心形颜色recyclerview将变为黄色。该事件还将保存在另一个列表中,直到该事件从保存的列表中删除。到目前为止,我已经通过单击“感兴趣”按钮将该事件保存在已保存列表中。但我不知道如何同时更改心形颜色以及如何让它保持不变,直到事件从保存的列表中删除。我的 recyclerview 中有心脏图像。当我在描述活动中单击兴趣按钮时,recyclerview 中的心脏图像会发生变化。
查看完整描述

4 回答

?
守着星空守着你

TA贡献1799条经验 获得超8个赞

假设您将事件保存在某个模型类中,您可以做的是在调用onBindViewHolder适配器的方法时检查事件是否标记为保存。如果是,那么您需要将心脏图像更改为另一个黄色的心脏图像,或者您可以在心脏图像上应用色调使其变成黄色。

您可以使用此代码更改可绘制对象

heartImageView.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.yellow_heart));

您可以使用此代码应用色调

heartImageView.setColorFilter(Color.argb(255, 255, 255, 0))

编辑(基于评论)

如果心脏在第一个活动中,而感兴趣的按钮在第二个活动中,您需要做的是在单击感兴趣的按钮时保存事件的状态。返回到第一个活动后,您可以检查事件的状态,然后使用上述两种方法中的任何一种来更新图像。

编辑 2(基于共享的新代码)

收到 Volley 调用的响应后,您应该将事件 ID 保存在某处以跟踪您感兴趣的事件(这可以在模型类或某个全局列表中)。当您返回到您的第一个活动(其中包含 recyclerview)时,您需要使用您拥有的已存储事件 ID 列表检查每个事件 ID,并为每个匹配的事件更改心脏。


查看完整回答
反对 回复 2023-02-23
?
富国沪深

TA贡献1790条经验 获得超9个赞

您可以在以下帮助下执行此操作startActivityforresult


在 Activity1 中,启动 Activity2 为:


Intent i = new Intent(this, Activity2.class);

startActivityForResult(i, 1);

在 Activity2 中,使用 setResult 发送回数据:


Intent intent = new Intent();

intent.putExtra("updatedArraylist", "arraylist")

setResult(RESULT_OK, intent);        

finish();

在 Activity1 中,使用 onActivityResult 接收数据:


public void onActivityResult(int requestCode, int resultCode, 

Intent data) {

    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == 1) {

        if(resultCode == RESULT_OK) {

            String strArrayList = 

            data.getStringExtra("updatedArraylist");

            Gson gson = new Gson();

            Type youListType = new TypeToken<List<Model>>() {

            }.getType();

            List<Model> yourTypeList = gson.fromJson(strArrayList, 

            yourListType);

            ArrayList finalArraylist = new ArrayList<>(yourTypeList);

            yourArraylist.addAll(finalArraylist);    

            youtAdapter.notifyDataSetChanged();

        }     

    }


查看完整回答
反对 回复 2023-02-23
?
MMTTMM

TA贡献1869条经验 获得超4个赞

在第一个活动中


Intent intent = new Intent(getApplicationContext(), SecondActivity.class);

startActivityForResult(intent, 100);

从第二个活动开始,您必须在活动被 finish() 或后退键销毁之前执行以下代码(为此,您可以覆盖第二个活动的 onBackPressed 并删除超类调用并调用以下方法)。


private void exitWithResult(){

    Intent returnIntent = new Intent();

    returnIntent.putExtra("result", "Id of selected item");

    setResult(Activity.RESULT_OK, returnIntent);

    finish();

}

同样在第一个活动中,您必须在 onActivityResult 方法中处理结果。


@Override

    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {

        if (requestCode == 100) {

            if(resultCode == Activity.RESULT_OK){

                String result=data.getStringExtra("result");

                Log.e("DATA", "" + result);

            }

            if (resultCode == Activity.RESULT_CANCELED) {

                //Write your code if there's no result

                Log.e("DATA", "No result");

            }

        }

    }

更新


您可以使用接口作为从适配器到活动的回调。startActivityForResult 可以在接口的回调方法中调用。您必须通过适配器构造函数将回调接口与数据集一起传递给适配器。


在适配器中声明此接口


public interface AdapterCallback{


        void onAdapterSelected(int pos);


    }

在第一个活动中实现这样的接口。


MyAdapter.AdapterCallback callback = new MyAdapter.AdapterCallback() {

        @Override

        public void onAdapterSelected(int pos) {

            Intent intent = new Intent(getApplicationContext(), 

            SecondActivity.class);

            startActivityForResult(intent, 100);

        }

    };

然后像这样设置适配器。


RecyclerView rv = findViewById(R.id.rv_list);

rv.setHasFixedSize(true);

rv.setLayoutManager(new LinearLayoutManager(getApplicationContext()));

MyAdapter adapter = new MyAdapter(callback);   //This is the only change

rv.setAdapter(adapter);

下面适配器的变化。(你应该像你已经做的那样传递列表数据和回调)


    private AdapterCallback callback;


        public MyAdapter(AdapterCallback callback) {

            this.callback = callback;

        }


        @Override

        public void onBindViewHolder(@NonNull ViewHolder viewHolder, final int i) {

            viewHolder.mBtn.setOnClickListener(new View.OnClickListener() {

                @Override

                public void onClick(View v) {

                    callback.onAdapterSelected(i);

                }



   });

    }

接口也来自内部适配器。正如我一开始提到的那样,我不会在这里重复


查看完整回答
反对 回复 2023-02-23
?
倚天杖

TA贡献1828条经验 获得超3个赞

您可以将coloronclick 事件应用于心脏按钮,如以下代码:

your_image_id.setBackgroundColor(getResources().getColor(R.color.yellow));


查看完整回答
反对 回复 2023-02-23
  • 4 回答
  • 0 关注
  • 93 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信