【发布时间】:2016-08-18 19:39:13
【问题描述】:
我有一个带有 RecyclerView 的片段 (FragmentA),其中显示了一些 CardView。我想让cardviews clickable,所以我找到的解决方案是在de适配器类的ViewHolder中实现View.OnClickListener。像这样的:
fragmentAAdapter.java
public class fragmentAViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public fragmentAViewHolder (View itemView) {
super(itemView);
itemView.setOnClickListener(this);
}
@Override
public void onClick(View v) {
//do something..
}
}
onClick() 方法从被点击的卡片视图中获取数据并启动一个显示数据的活动(InfoActivity)。
OnClick() 方法
@Override
public void onClick(View v) {
Intent intent = new Intent(itemView.getContext(), InfoActivity.class);
Bundle mBundle = new Bundle();
mBundle.putParcelable("someData", someData);
intent.putExtras(mBundle);
itemView.getContext().startActivity(intent);
}
在 InfoActivity 中,我可以更新和删除数据。之后,我想完成 InfoActivity 并刷新 FragmentA 以获取新数据。
要关闭活动并刷新上一个片段,我正在尝试使用 startActivityForResult()。像这样:
@Override
public void onClick(View v) {
Intent intent = new Intent(itemView.getContext(), InfoActivity.class);
((Activity) itemView.getContext()).startActivityForResult(intent, 10001);
}
InfoActivity.java
@Override
public void onClick(DialogInterface dialog, int which) {
setResult(InfoActivity.RESULT_OK);
finish();
}
FragmentA.java
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
if ((requestCode == 10001) && (resultCode == InfoActivity.RESULT_OK)) {
FragmentAfragment = new FragmentA();
android.support.v4.app.FragmentTransaction fragmentTransaction =
getFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.fragment_container, fragment);
fragmentTransaction.commit();
}
}
但是当我关闭 InfoActivity 时,什么也没有发生。
问题是setResult(InfoActivity.RESULT_OK)返回结果给适配器类(fragmentAAdapter)而不是FragmentA,所以方法onActivityResult( ) 在 FragmentA 中永远不会被调用。
关闭在fragmentAAdapter的onClick()方法内启动的InfoActivity后如何刷新FragmentA?
更新 - 解决方案
我在 FragmentA 的活动中重写了 onActivityResult() 方法。像这样:
MainActivity.java
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if ((requestCode == 10001) && (resultCode == 10001)) {
FragmentA fragment = new FragmentA();
android.support.v4.app.FragmentTransaction fragmentTransaction =
getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.fragment_container, fragment);
fragmentTransaction.commit();
}
}
在InfoActivity.java中:
@Override
public void onClick(DialogInterface dialog, int which) {
setResult(10001);
finish();
}
每次它关闭一个活动并返回FragmentA时,都会调用MainActivity中的onActivityResult(),并且当条件if((requestCode == 10001) && (resultCode == 10001)) em> 为 true 刷新 FragmentA。
【问题讨论】:
-
您可以在调试模式下轻松验证您的怀疑。只需在
onActivityResult()中放置一个断点,看看它是否命中。如果没有,我们肯定会知道这是问题所在。 -
@Vucko 是的,这就是问题所在。我按照你说的做了,甚至没有调用 onActivityResult()。
-
如果一切都失败了,我可以为不同组件之间的通信提供替代解决方案 - EventBus。
标签: java android android-fragments