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

如何管理列表中项目运行“结果活动”的状态?

如何管理列表中项目运行“结果活动”的状态?

Helenr 2023-04-13 10:37:05
例如,里面有一个项目列表RecyclerView。我想在单击相应的列表项后更改项目的图像。如何position在 之后保留项目startActivityForResult,并将图像路由onActivityResult回基于 的对应项目position。对我来说只是一个选择——保存Activity成员变量的位置,并在之后使用它onActivityResult。也许有更好的方法来避免为创建额外的状态Activity?代码示例:public class MyActivity extends AppCompatActivity {  private static final int REQ_TAKE_PICTURE = 1;  // is it possible to avoid this variable as Activity state  private int tempItemPosition;  @Override  public void onCreate(Bundle savedInstanceState) {    ...    MyAdapter adapter = new MyAdapter();    adapter.setOnItemClickListener(this::startTakePhoto);  }  @Override  public void onActivityResult(int reqCode, int resCode, Intent data) {    if(reqCode == REQ_TAKE_PICTURE) {  updateImageItem(Uri.parse(data.getStringExtra(TakePictureActivity.RESULT_IMAGE_URI)), tempItemPosition)    }  }  private void updateImageItem(Uri imageUri, int position) {    // update item image for position  }  private void startTakePhoto(int position) {    // saving state which is better to avoid    tempItemPosition = position;    Intent intent = new Intent(this, TakePhotoActivity.class);    startActivityForResult(intent, REQ_TAKE_PICTURE);  }}public class MyAdapter extends RecyclerView.Adapter<ViewHolder> {  ...  public void setOnItemClickLsitener(OnItemClickListener listener) {    ...  }  ...  public interface OnItemClickListener {    void onItemClick(int position);  }}是否可以调用updateImageItem(Uri, int)after onActivityResult,但不将点击的项目位置保存为Activity状态?
查看完整描述

1 回答

?
精慕HU

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

将数据传递给另一个 Activity 并返回:


... your code


  @Override

  public void onActivityResult(int reqCode, int resCode, Intent data) {

    if(reqCode == REQ_TAKE_PICTURE) {

     String uriExtra = data.getStringExtra(TakePictureActivity.RESULT_IMAGE_URI);

     int positionExtra = data.getIntExtra("PhotoParentPosition")

updateImageItem(Uri.parse(uriExtra), positionExtra)

    }

  }


... your code


private void startTakePhoto(int position) {

    // saving state which is better to avoid

    tempItemPosition = position;

    Intent intent = new Intent(this, TakePhotoActivity.class);

    intent.putExtra("PhotoParentPosition", position);

    startActivityForResult(intent, REQ_TAKE_PICTURE);

  }

在您的其他活动 (TakePhotoActivity) 中,您从创建 Intent 中获得额外的 ("PhotoParentPosition") 并将其放在结果 Intent 上。


另一种选择是使用 AndroidX ViewModel 并在两个活动之间使用共享的 ViewModel。

ViewModel 的想法是它是一个数据类,可以保存有关您的视图的数据(例如选择列表项位置),该数据可以跨活动和跨配置更改保存。

Architecture Components 为负责为 UI 准备数据的 UI 控制器提供 ViewModel 辅助类。ViewModel 对象在配置更改期间自动保留,以便它们保存的数据可立即用于下一个活动或片段实例。例如,如果您需要在您的应用程序中显示用户列表,请确保将获取和保存用户列表的责任分配给 ViewModel,而不是活动或片段,如以下示例代码所示:


查看完整回答
反对 回复 2023-04-13
  • 1 回答
  • 0 关注
  • 129 浏览

添加回答

举报

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