【发布时间】: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);
}
有几点值得注意:
正如我所说,添加新元素就可以了。
当一个元素被点击时,它会发送 EventetCreatorActivity 就好了,它显示数据已经被成功编辑(各种值发生变化)。
我跟踪了代码,在编辑元素后根本没有调用 onActivityResult()。
我在网上读到,应该得到结果的活动可能由于某种原因被破坏了,但事实并非如此。
非常感谢您的帮助。
【问题讨论】:
-
只有当您使用片段上下文作为 startActivityForResult 但您正在使用 Activity 时,您才会在 Fragment 处收到 onActivityResult ... onActivityResult 将返回到来自适配器的上下文 Activity
-
哇...好吧。我认为覆盖 onActicityResult 的片段将由其调用 startActivityForResult() 的活动自动定向。我什至没有想到这很重要。我想需要多读一点。感谢您的快速帮助。
标签: android android-recyclerview android-viewholder