2015-08-12 12 views
9

Ho il ViewPager come primo elemento all'interno di RecyclerView. Desidero impostare FragmentStatePagerAdapter su viewpager all'interno del metodo onBindViewHolder(). Ma non posso chiamare getsupportfragmentmanager(). Please help !!. Ecco il mio codice:come chiamare getsupportfragmentmanager() dalla classe dell'adattatore?

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

È necessario passare nel costruttore all'adattatore da Activity/Frammento –

risposta

3

Prima di tutto bisogna passare contesto all'adattatore costruttore.

Quindi è necessario utilizzare tale riferimento di contesto per ottenere getSupportFragmentManager.

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

ho provato questa opzione. Ma non ha funzionato. – Nabin

+0

@Nabin mai trovare una soluzione? – Burkely91

38

ho risolto lanciando mContext

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

Con questa proposta viene visualizzato l'errore di runtime MainActivity non può essere trasmesso a android.support.v4.app.FragmentActivity –

+0

tipi non convertibili. –

6

Qui è possibile impostare la transizione;)

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

Un'altra soluzione ...

contesto Declare

private Toast mssgeToast; 

private Context ctxContext; 

public MyViewListener(myView pView){ 

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

} 

Avanti ...

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

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

} 

e dichiarare in onClickListener. Esempio:

@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); 
    } 
Problemi correlati