从适配器单击切换到片段
Switching to a fragment on click from the adapter
我在项目中有一个 BackStack,为了实现从片段到片段的过渡,我使用以下内容
public void showFragment(@NonNull Fragment fragment) {
showFragment(fragment, true);
}
public void showFragment(@NonNull Fragment fragment, boolean addToBackStack) {
if (curFragment != null && addToBackStack) {
pushFragmentToBackStack(curTabId, curFragment);
}
replaceFragment(fragment);
}
private void replaceFragment(@NonNull Fragment fragment) {
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction tr = fm.beginTransaction();
tr.replace(R.id.content, fragment);
tr.commitAllowingStateLoss();
curFragment = fragment;
}
但是我需要通过单击 recyclerView 中的项目进入片段,为此,我为每个 item
添加了一个位置。
onBindViewHolder
在 Adapter
中添加了这个
@Override
public void onBindViewHolder(MenuViewHolder holder, int position) {
ItemMenu Item = ItemMenuList.get(position);
holder.tv_menu.setText(Item.getMenuText());
holder.getAdapterPosition();
holder.cv_menu.setOnClickListener(v ->
{
switch (Item.getInitialPositon()) {
case 0: {
((MainActivity) requireActivity()).showFragment(Fragment_Tasks.newInstance());
break;
}
case 1: {
break;
}
}
});
}
问题是转换需要 context()
。如何解决?
您可以将 Context
引用传递给您的适配器,也可以使用回调将点击处理作业传递给 activity/fragment。
以回调为例,我们可以定义一个接口:
interface OnItemClickListener {
void onItemClick(...);
}
通过构造函数将其传递到适配器中,然后在您的项目被单击时触发它。所以在 onBindViewHolder
:
holder.cvMenu.setOnClickListener(v -> {
itemClickListener.onItemClick(...);
});
您可以从 ViewHolder 获取上下文
holder.itemView.getContext()
但不是很推荐
最佳做法是在适配器中为 onclick 添加接口,然后将其实现到您的片段中
我在项目中有一个 BackStack,为了实现从片段到片段的过渡,我使用以下内容
public void showFragment(@NonNull Fragment fragment) {
showFragment(fragment, true);
}
public void showFragment(@NonNull Fragment fragment, boolean addToBackStack) {
if (curFragment != null && addToBackStack) {
pushFragmentToBackStack(curTabId, curFragment);
}
replaceFragment(fragment);
}
private void replaceFragment(@NonNull Fragment fragment) {
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction tr = fm.beginTransaction();
tr.replace(R.id.content, fragment);
tr.commitAllowingStateLoss();
curFragment = fragment;
}
但是我需要通过单击 recyclerView 中的项目进入片段,为此,我为每个 item
添加了一个位置。
onBindViewHolder
在 Adapter
中添加了这个
@Override
public void onBindViewHolder(MenuViewHolder holder, int position) {
ItemMenu Item = ItemMenuList.get(position);
holder.tv_menu.setText(Item.getMenuText());
holder.getAdapterPosition();
holder.cv_menu.setOnClickListener(v ->
{
switch (Item.getInitialPositon()) {
case 0: {
((MainActivity) requireActivity()).showFragment(Fragment_Tasks.newInstance());
break;
}
case 1: {
break;
}
}
});
}
问题是转换需要 context()
。如何解决?
您可以将 Context
引用传递给您的适配器,也可以使用回调将点击处理作业传递给 activity/fragment。
以回调为例,我们可以定义一个接口:
interface OnItemClickListener {
void onItemClick(...);
}
通过构造函数将其传递到适配器中,然后在您的项目被单击时触发它。所以在 onBindViewHolder
:
holder.cvMenu.setOnClickListener(v -> {
itemClickListener.onItemClick(...);
});
您可以从 ViewHolder 获取上下文
holder.itemView.getContext()
但不是很推荐
最佳做法是在适配器中为 onclick 添加接口,然后将其实现到您的片段中