java - 根据从 Fragment A 收集的数据,使用更少的样板代码从 Activity 启动 Fragment B
问题描述
我有以下设置:
我有一个
Activity
启动一个FragmentA
.
FragmentA
包含一个recyclerView
和一个adapter
。我
interfaceA
在适配器中有一个已实现的适配器,FragmentA
以便通知我单击了哪个位置。interfaceB
我在 中创建了第二个,它在步骤 1中启动FragmentA
的那个中实现。Activity
FragmentA
最后,我基于
FragmentB
从.Activity
interfaceB
一切正常,但是流程很乏味,并且需要大量样板代码。
目标是让activity
启动fragmentB
包含来自 recyclerView 中的单个单击项目的数据FragmentA
。
问题:可以以不同的方式实现吗?
下面的代码:
Activity
启动片段A:
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
类接口A:
public interface OnItemClickListener {
void onItemClick(View view, int position);
}
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
回调以接收事件并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();
}
}
}
解决方案
推荐阅读
- host - 在 Revit API 中确定门主机
- javascript - Vue js 用动态属性设置 v-model
- java - Swing/AWT 中提议项目的 GridBagLayout 或 BorderLayout?
- ag-grid - ag-grid 'IToolPanel' 已声明,但它的值从未被读取
- google-sheets - 按降序填充最近 30 个日期的列
- azure-data-lake - U-SQL 相关子查询
- android - xml 布局的一个组件不显示
- python - 如何使用 Python xlwings 将大量列表复制到 Excel
- cordova - 无法从科尔多瓦视频编辑器插件访问缩略图
- python - 单选按钮和 webapp2