我有以下设置:
我有一个启动
FragmentA
的Activity
。
FragmentA
包含一个recyclerView
和一个adapter
。我在适配器中有一个
interfaceA
,它是在FragmentA
中实现的,因此我会收到点击哪个位置的通知。我在
FragmentA
中创建了第二个interfaceB
,它在启动的
。Activity
中实现第 1 步中的 FragmentA最后,我根据从
interfaceB
获得的数据从Activity
启动FragmentB
。
一切正常,但流程乏味,需要大量样板代码。
目标 是让 activity
启动 fragmentB
,其中包含来自 FragmentA< 中 recyclerView 的单个点击项目的数据
.
问题:能否以不同的方式实现?
代码如下:
Activity
启动 FragmentA:
Fragment fragment = fragmentManager.findFragmentByTag(FragmentA.class.getName());
if (fragment == null) {
fragment = Fragment.instantiate(this, FragmentA.class.getName());
}
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction
.replace(R.id.fragmentLayout, fragment, FragmentA.class.getName())
.addToBackStack(FragmentA.class.getName())
.commit();
在 FragmentA
中,我们有 recyclerView
,interfaceA
在 adapter
中实现:
适配器类:
public class AdapterA extends RecyclerView.Adapter< AdapterA.ViewHolderA> {
//instances
private Context context;
private List<Data> dataList;
private OnItemClickListener onItemListClickListener;
//Constructor
public AdapterA (Context context, List<Data> dataList, OnItemClickListener onItemListClickListener {
this.context = context;
this.dataList = dataList;
this.onItemListClickListener = onItemListClickListener;
}
onCreateViewHolder....
onBindViewHolder....
getItemCount...
class ViewHolderA RecyclerView.ViewHolder {
//instances..
//Constructor...
}
}
接口(interface)
类接口(interface)A:
public interface OnItemClickListener {
void onItemClick(View view, int position);
}
接口(interface)
类接口(interface)B:
public interface SingleItemEventListener {
void onSingleItemClicked(int position);
}
FragmentA
类:
//Instances
private AdapterA adapter;
private RecyclerView recyclerView;
private onSingleItemClicked singleItemEventListener;
onAttach...
onCreateView...
@Override
public void onStart() {
super.onStart();
//Setting adapter
onSetAdapter();
}
private void onSetAdapter() {
List<Data> dataList;
dataList = getData();
adapter = new AdapterA(context, dataList, new OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
singleItemEventListener.onSingleItemClicked(position);
}
});
在 Activity
中,我们正在实现 onSingleItemClicked
回调以接收事件并使用从接口(interface)回调接收到的数据启动 FragmentB
:
ActivityA implements SingleItemEventListener {
@Override
public void onSingleItemClicked(int position) {
Data data = getData(position);
if (data != null) {
Bundle bundle = new Bundle();
bundle.putParcelable("single_data_key", data);
Fragment fragmentB = fragmentManager.findFragmentByTag(FragmentB.class.getName());
if (fragmentB == null && bundle != null) {
fragmentB = Fragment.instantiate(this, FragmentB.class.getName(), bundle);
}
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction
.replace(R.id.FragmentLayout, fragmentB, FragmentB.class.getName())
.addToBackStack(FragmentB.class.getName())
.commit();
}
}
}
最佳答案
添加ViewModel到您的 Activity 并使用它在所有组件、Activity 和两个 fragment 之间进行通信。
您可以从 fragment 中访问 Activity 的 ViewModel
MyViewModel model = ViewModelProviders.of(getActivity()).get(MyViewModel.class);
使用LiveData为了交流,从您的 fragment 向它发布一个 Action ,并在您的 Activity 中收听它以启动另一个 fragment 。
关于java - 根据从 Fragment A 收集的数据使用较少的样板代码从 Activity 启动 Fragment B,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51311133/