【问题标题】:How to properly call startActivityForResult() from a viewHolder onClickListener?如何从 viewHolder onClickListener 正确调用 startActivityForResult()?
【发布时间】:2018-07-27 16:59:42
【问题描述】:

我正在尝试在一个小项目中实现 RecyclerView,但遇到了一些问题。我的适配器可以很好地添加新元素,但在我编辑现有元素时没有任何作用。

为了创建新元素,我在片段中使用 FloatingActionButton 并发送适当的请求代码。为了编辑一个元素,我尝试在 onBindViewHolder() 中实现 onClickListener()。代码如下:

@Override
public void onBindViewHolder(RecyclerViewAdapter.EventViewHolder holder, int position) {
    final Event event = mEvents.get(position);
    holder.mLabel.setText(event.getLabel());
    holder.mComment.setText(event.getComment());
    holder.mStartTime.setText(DateFormat.format("HH:mm", event.getTime()));
    holder.mDuration.setText(event.getDurationInFormat(mContext));
    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(mContext.getApplicationContext(), EventCreatorActivity.class);
            intent.putExtra(EX_EVENT_ID, event.getId());
            intent.putExtra(EX_DAY_ID, event.getParent().getId());
            ((Activity) mContext).startActivityForResult(intent, DayViewFragment.RC_EDIT);
        }
    });
}

(itemView 是我保存整个元素视图的地方,而 Textviews 只是组件)。

这里是我初始化 RecyclerViewAdapter 的地方:

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

        // Restore data after app-configuration
        if(savedInstanceState != null && !savedInstanceState.isEmpty())
            mDay = Day.findDayById(UUID.fromString(savedInstanceState.getString(DAY_ID)));
        else
            mDay = new Day(Calendar.getInstance().getTime());

        adapter = new RecyclerViewAdapter(getActivity(), new ArrayList<Event>());
        adapter.updateDataSet(mDay.getEvents());

        adapter.notifyDataSetChanged();
    }

这是我在片段中收到结果的地方:

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data){
        super.onActivityResult(requestCode, resultCode, data);

        if(resultCode != Activity.RESULT_OK)
            return;

        UUID eventId = (UUID)data.getSerializableExtra(EventCreatorFragment.EX_EVENT_ID);
        Event event = mDay.findEventById(eventId);

        switch (requestCode){
            case RC_EDIT:{
                int previousPosition = adapter.getPreviousPosition(eventId);
                if(previousPosition == mDay.getIndex(event))
                    adapter.notifyItemChanged(mDay.getIndex(event));
                else {
                    adapter.updateDataSet(mDay.getEvents());
                    adapter.notifyItemMoved(previousPosition, mDay.getIndex(event));
                }
            } break;
            case RC_ADD:{
                adapter.updateDataSet(mDay.getEvents());
                adapter.notifyItemInserted(mDay.getIndex(event));
            } break;
        }
    }

这是我在创建\编辑新元素的活动片段中设置结果的地方:

public void sendResult(){
    Intent data = new Intent();
    data.putExtra(EX_EVENT_ID, mThisEvent.getId());
    getActivity().setResult(Activity.RESULT_OK, data);
}

有几点值得注意:

  1. 正如我所说,添加新元素就可以了。

  2. 当一个元素被点击时,它会发送 EventetCreatorActivity 就好了,它显示数据已经被成功编辑(各种值发生变化)。

  3. 我跟踪了代码,在编辑元素后根本没有调用 onActivityResult()。

  4. 我在网上读到,应该得到结果的活动可能由于某种原因被破坏了,但事实并非如此。

非常感谢您的帮助。

【问题讨论】:

  • 只有当您使用片段上下文作为 startActivityForResult 但您正在使用 Activity 时,您才会在 Fragment 处收到 onActivityResult ... onActivityResult 将返回到来自适配器的上下文 Activity
  • 哇...好吧。我认为覆盖 onActicityResult 的片段将由其调用 startActivityForResult() 的活动自动定向。我什至没有想到这很重要。我想需要多读一点。感谢您的快速帮助。

标签: android android-recyclerview android-viewholder


【解决方案1】:

仅当您将片段上下文用于 startActivityForResult 但您正在使用 Activity 时,您才会在 Fragment 处收到 onActivityResult ... onActivityResult 将返回到作为适配器上下文的 Activity。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-24
    • 1970-01-01
    • 2018-07-18
    • 1970-01-01
    • 1970-01-01
    • 2017-06-23
    • 2017-07-20
    • 1970-01-01
    相关资源
    最近更新 更多