2015-08-12 17 views
9

Mam jako pierwszy element wewnątrz RecyclerView. Chcę ustawić FragmentStatePagerAdapter na viewpager wewnątrz metody onBindViewHolder(). Ale nie mogę zadzwonić pod numer getsupportfragmentmanager(). Proszę pomóc !!. Oto mój kod:jak wywołać metodę getsupportfragmentmanager() z klasy adaptera?

public class CustomListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 
    private Context context; 
    private List<RowItem> rowItemList; 
    private final int VIEW_TYPE_CUSTOM = 0; 
    private final int VIEW_TYPE_NORMAL = 1; 
    NewPagerAdapter mCustomPagerAdapter; 

    public CustomListAdapter(Context context, List<RowItem> rowItemList) { 
     this.context = context; 
     this.rowItemList = rowItemList; 
    } 

    @Override 
    public int getItemViewType(int position) { 
     if (position == 0) 
      return VIEW_TYPE_CUSTOM; 
     else 
      return VIEW_TYPE_NORMAL; 
    } 

    @Override 
    public int getItemCount() { 
     return rowItemList.size()+1; 
    } 

    @Override 
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
     switch (getItemViewType(position)) { 
      case VIEW_TYPE_CUSTOM: 
       recViewHolder1 viewHolderSecond = (recViewHolder1) holder; 
        mCustomPagerAdapter = new NewPagerAdapter(getSupportFragmentManager()); 
        viewHolderSecond.vPager.setAdapter(mCustomPagerAdapter); 
       break; 
      case VIEW_TYPE_NORMAL: 
       recViewHolder2 viewHolderFirst = (recViewHolder2) holder; 
       RowItem rowItem = rowItemList.get(position-1); 
       viewHolderFirst.vName.setText(rowItem.getName()); 
       viewHolderFirst.vImage.setImageResource(rowItem.getImageId()); 
       break; 

     } 
    } 

    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     switch (viewType) { 
      case VIEW_TYPE_CUSTOM: 
       View itemView = LayoutInflater. 
         from(parent.getContext()). 
         inflate(R.layout.pagerlayout, parent, false); 
       return new recViewHolder1(itemView); 
      case VIEW_TYPE_NORMAL: 
       View itemView1 = LayoutInflater. 
         from(parent.getContext()). 
         inflate(R.layout.rowlayout, parent, false); 
       return new recViewHolder2(itemView1); 
     } 
     return null; 
    } 

    @Override 
    public long getItemId(int position) { 
     return super.getItemId(position); 
    } 


    public static class recViewHolder1 extends RecyclerView.ViewHolder { 
     protected static ViewPager vPager; 


     public recViewHolder1(View v) { 
      super(v); 
      vPager = (ViewPager) v.findViewById(R.id.vPager); 
     } 
    } 

    public class recViewHolder2 extends RecyclerView.ViewHolder implements View.OnClickListener { 
     protected TextView vName; 
     protected ImageView vImage; 

     public recViewHolder2(View v) { 
      super(v); 
      v.setOnClickListener(this); 
      vName = (TextView) v.findViewById(R.id.vName); 
      vImage = (ImageView) v.findViewById(R.id.vImage); 
     } } } 
+0

Trzeba przekazać go w konstruktorze do adaptera z działalności/Fragment –

Odpowiedz

3

Najpierw trzeba zdać kontekst adapter konstruktora.

Następnie należy użyć tego odnośnika kontekstowego, aby uzyskać getSupportFragmentManager.

mCustomPagerAdapter = new NewPagerAdapter(context.getSupportFragmentManager()); 
viewHolderSecond.vPager.setAdapter(mCustomPagerAdapter); 
+0

próbowałem tej opcji. Ale to nie zadziałało. – Nabin

+0

@Nabin kiedykolwiek znajdziesz rozwiązanie? – Burkely91

38

Rozwiązałem go oddając mContext

((FragmentActivity)mContext).getSupportFragmentManager().beginTransaction() 
          .replace(R.id.item_detail_container, fragment) 
          .commit(); 
+0

Dzięki tej propozycji otrzymuję błąd runtime MainActivity nie może być rzutowany na android.support.v4.app.FragmentActivity –

+0

Typy inconvertible. –

6

Tutaj można ustawić przejścia;)

public void pushFragment(Fragment newFragment, Context context){ 

    FragmentTransaction transaction = ((FragmentActivity)context).getSupportFragmentManager().beginTransaction(); 
    transaction.replace(R.id.fragment, newFragment); 
    transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
    transaction.addToBackStack(null); 
    transaction.commit(); 

} 
0

Innym rozwiązaniem ...

kontekst Declare

private Toast mssgeToast; 

private Context ctxContext; 

public MyViewListener(myView pView){ 

    this.mView = pView; 
    this.ctxContext = pView.getContext(); 

} 

Następny ...

public void pushFragment(Context context){ 
    FragmentManager fm = ((FragmentActivity)context).getSupportFragmentManager(); 
    PopupClickFragment pcf = new PopupClickFragment(); 

    pcf.show(fm, ""); 
    // FragmentTransaction transaction = ((FragmentActivity)context).getSupportFragmentManager().beginTransaction(); 

} 

i zadeklarować w onClickListener. Przykład:

@Override 
    public void onCellClicked (@NonNull RecyclerView.ViewHolder p_jCellView,int p_nXPosition, 
    int p_nYPosition){ 
     //TODO: AQUI SE DEBE LEVANTAR EL POPUP INSTANCIANDO .SHOW(); 

     pushFragment(ctxContext); 
    } 
Powiązane problemy