如何从viewHolder onClickListener正确调用startActivityForResult()?

时间:2018-07-27 16:59:42

标签: android android-recyclerview android-viewholder

我试图在一个小项目中实现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. 单击某个元素后,它会发送EvenetCreatorActivity消息,并显示数据已成功编辑(各种值都会更改)。

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

  4. 我已经在线阅读了本应获取结果的活动可能由于某种原因而被破坏的情况,但事实并非如此。

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

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