如何从 RecyclerView.Adapter<CardAdapter.ViewHolder> 打开片段
Posted
技术标签:
【中文标题】如何从 RecyclerView.Adapter<CardAdapter.ViewHolder> 打开片段【英文标题】:How open fragment from RecyclerView.Adapter<CardAdapter.ViewHolder> 【发布时间】:2016-03-22 12:07:07 【问题描述】:1.TabLayout
- tab1 (Fragment1)
- tab2 (Fragment2)
- tab3 (Fragment3)
* RecyclerView + CardView (OnClick)
在CardView
ClickListner 上打开tab3 中的另一个片段。那么如何在tab3中打开fragment呢。
错误在getFragmentManager()
:
FragmentTransaction transaction = getFragmentManager().beginTransaction();
而不是这个,我尝试了:
FragmentTransaction transaction = activity.getFragmentManager().beginTransaction();
FragmentTransaction transaction = itemview.getContext().getFragmentManager().beginTransaction();
但是错误没有解决。
这是我的代码:
public class CardAdapter extends RecyclerView.Adapter<CardAdapter.ViewHolder>
List<NatureItem> mItems;
private int lastPosition = -1;
Context context;
TaskFragment main;
public CardAdapter(Context context,TaskFragment ma)
this.context=context;
main=ma;
public CardAdapter()
super();
mItems = new ArrayList<NatureItem>();
NatureItem nature = new NatureItem();
nature.setName("The Paris Attack 2015");
nature.setDes("Lorem ipsum dolor sit amet.");
nature.setThumbnail(R.drawable.news1);
mItems.add(nature);
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int position)
View v = LayoutInflater.from(viewGroup.getContext())
.inflate(R.layout.custom_list, viewGroup, false);
ViewHolder viewHolder = new ViewHolder(v);
return viewHolder;
@Override
public void onBindViewHolder(ViewHolder viewHolder, int i)
NatureItem nature = mItems.get(i);
viewHolder.tvNature.setText(nature.getName());
viewHolder.tvDesNature.setText(nature.getDes());
viewHolder.imgThumbnail.setImageResource(nature.getThumbnail());
// setAnimation(viewHolder.card,i);
@Override
public int getItemCount()
return mItems.size();
class ViewHolder extends RecyclerView.ViewHolder
private int lastPosition = -1;
public ImageView imgThumbnail;
public TextView tvNature;
public TextView tvDesNature;
// Button btnclear,btncancle;
CardView card;
Activity activity;
Context co;
public ViewHolder(final View itemView)
super(itemView);
imgThumbnail = (ImageView) itemView.findViewById(R.id.img_thumbnail);
tvNature = (TextView) itemView.findViewById(R.id.tv_nature);
tvDesNature = (TextView) itemView.findViewById(R.id.tv_des_nature);
card = (CardView) itemView.findViewById(R.id.card);
card.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
Toast.makeText(itemView.getContext(), "Clicked Card...", Toast.LENGTH_LONG).show();
ShareFragment newFragment = new ShareFragment();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.viewFragments, newFragment);
transaction.addToBackStack(null);
transaction.commit();
);
【问题讨论】:
你使用什么fragment
版本?如果您使用support library
中的那个,您需要获得SupportFragmentManager
。另外,如果您在logcat
中遇到错误,请发布。
/Adapter/CardAdapter.java 错误:找不到符号方法getSupportFragmentManager()
而不是使用上下文访问您的父活动实例。然后它将允许访问片段管理器。您还需要创建接口来调用片段。
@NikitaSukhadiya 你明白我说的了吗?
@PiyushGupta 没有得到...请描述一下我。
【参考方案1】:
在您的 onclick 中按如下方式打开新片段
@Override
public void onClick(View view)
AppCompatActivity activity = (AppCompatActivity) view.getContext();
Fragment myFragment = new MyFragment();
activity.getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, myFragment).addToBackStack(null).commit();
【讨论】:
@SubinBabu 谢谢。希望对您有所帮助。 最佳答案,节省了我的时间。 有帮助...提供甜蜜的解决方案。太好了!【参考方案2】:问题:
Error:cannot find symbol method getSupportFragmentManager()
解决方案:
当您使用adapter
上下文时,对于访问片段管理器,您需要转换您的context
。所以你应该使用这种方式。
YourParentActivity myActivity = (YourParentActivity)context
现在您可以访问片段管理器的方法,例如,
myActivity.getSupportFragmentManager();
但请记住,您的 Fragment
应作为 android.support.app.v4.Fragment
导入,否则可能会出现转换问题。
如果您打开特定标签的片段,那么您应该使用getChildSupportFragmentManager()
而不是getSupportFragmentManager()
注意:如果您想从adapter
类调用fragment
,那么您应该创建interface
并将侦听器传递给您的按钮单击方法并使用该接口实现您的活动。 p>
更新:
您也可以将FragmentManager
传递给您的适配器构造函数。喜欢,
public FragmentManager f_manager;
public CardAdapter(Context context,TaskFragment ma , FragmentManager f_manager)
this.context = context;
this.f_manager = f_manager;
main=ma;
然后你可以在你的适配器类getView()
方法中使用this.f_manager
。
【讨论】:
【参考方案3】:如果您使用了支持库片段或默认片段,请确保在每个地方都使用相同的片段。并谨慎使用“getSupportFragmentManager”或“getFragmentManager”。
在构造函数中传递上下文。
public CardAdapter(Context context)
super();
mItems = new ArrayList<NatureItem>();
NatureItem nature = new NatureItem();
nature.setName("The Paris Attack 2015");
nature.setDes("Lorem ipsum dolor sit amet.");
nature.setThumbnail(R.drawable.news1);
mItems.add(nature);
点击内
....Your Code
ShareFragment newFragment = new ShareFragment();
FragmentTransaction transaction = /* Here is the change.*/context.getFragmentManager().beginTransaction();
transaction.replace(R.id.viewFragments, newFragment);
...Your Code
更新
Inside onClick call mainActivity setFragment method to replace fragment.
((MainActivity) context).setFragment(yourFragment);
public void setFragment(Fragment frag)
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.viewFragments, frag);
【讨论】:
context not working...我添加了这个 import android.support.v4.app.FragmentTransaction;transaction.replace(R.id.viewFragments, frag);
第二个参数类型错误 错误:(108, 20) 错误:找不到合适的替换方法(int,android.support.v4.app .Fragment) 方法 FragmentTransaction.replace(int,android.app.Fragment,String) 不适用(实际参数列表和正式参数列表长度不同) 方法 FragmentTransaction.replace(int,android.app.Fragment) 不适用(实际参数android.support.v4.app.Fragment不能通过方法调用转换为android.app.Fragment)
重新检查是否使用过android.support.v4.app.Fragment....并导入了android.support.v4.app.FragmentTransaction...并使用getSupportFragmentManager().beginTransaction()。 ...
现在出现此错误... 错误:java.lang.NullPointerException:尝试调用虚拟方法'void com.example.MainActivity.setFragment(android.support.v4.app. Fragment)' 在空对象引用上
你已经接近了!检查您传递的“上下文”是否不为空。然后仅使用 ((YourActivity) context).setFragment(yourFragment);【参考方案4】:
要从一个片段移动到另一个片段(来自 RecyclerView MyViewHolder 类),请使用此
Fragment fragment = new AttendanceFragment();
FragmentManager fragmentManager = ((FragmentActivity) mContext).getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.fragment_container, fragment);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
【讨论】:
【参考方案5】:对于使用 Kotlin 的用户,假设您要启动的片段类名为 MyFragment
,并且您将放置此片段的容器的 id 为 fragment_container_view
。您可能会在视图持有者的 bind
方法中执行此操作。
itemView.setOnClickListener
val activity = it.context as? AppCompatActivity
activity?.supportFragmentManager?.commit
addToBackStack(MyFragment::class.toString())
setReorderingAllowed(true)
replace<MyFragment>(R.id.fragment_container_view)
【讨论】:
【参考方案6】:试试这个狙击:
ShareFragment newFragment = new ShareFragment();
MainActivity mainActivity = (MainActivity)itemView.getContext()
mainActivity.getFragmentManager().beginTransaction()
.replace(R.id.viewFragments, newFragment)
.addToBackStack(null)
.commit();
【讨论】:
co.getFragmentManager() 不工作...仍然收到错误。 Co 应该是你的上下文或你的主要活动 我如何将上下文定义为活动..?? getFragmentManager() 在 itemView 的上下文中不存在 已编辑,您只需投射到您的活动中以上是关于如何从 RecyclerView.Adapter<CardAdapter.ViewHolder> 打开片段的主要内容,如果未能解决你的问题,请参考以下文章
我无法从另一个带有 recyclerview.adaper 的片段中打开带有 recyclerview.adapter 的片段
RecyclerView.Adapter.notifyItemMoved(0,1) 滚动屏幕