猿问

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

例如,里面有一个项目列表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状态?


Helenr
浏览 130回答 1
1回答

精慕HU

将数据传递给另一个 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 codeprivate 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,而不是活动或片段,如以下示例代码所示:
随时随地看视频慕课网APP

相关分类

Java
我要回答