【问题标题】:How open fragment from RecyclerView.Adapter<CardAdapter.ViewHolder>如何从 RecyclerView.Adapter<CardAdapter.ViewHolder> 打开片段
【发布时间】:2016-03-22 12:07:07
【问题描述】:

1.TabLayout

- tab1 (Fragment1)
- tab2 (Fragment2)
- tab3 (Fragment3)
     * RecyclerView + CardView (OnClick)

CardViewClickListner 上打开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 没有得到...请描述一下我。

标签: android android-fragments android-recyclerview android-viewholder


【解决方案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 的上下文中不存在
        • 已编辑,您只需投射到您的活动中
        猜你喜欢
        • 1970-01-01
        • 2021-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多