2015-08-12 6 views
9

Ich habe ViewPager als das erste Element innerhalb einer RecyclerView. Ich möchte FragmentStatePagerAdapter auf die viewpager innerhalb der onBindViewHolder() Methode setzen. Aber ich kann getsupportfragmentmanager() nicht anrufen. Bitte helfen !!. Hier ist mein Code:wie Getsupportfragmentmanager() aus der Adapterklasse aufrufen?

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

Sie müssen es im Konstruktor, um von Aktivität an Adapter/Fragment –

Antwort

3

Zuerst haben Kontext passieren Konstruktor Adapter.

Dann müssen Sie diese Kontextreferenz verwenden, um getSupportFragmentManager zu erhalten.

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

habe ich versucht, diese Option. Aber es hat nicht funktioniert. – Nabin

+0

@Nabin jemals eine Lösung finden? – Burkely91

38

i löste es durch mContext Gießen

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

Mit diesem Vorschlag bekomme ich Laufzeitfehler MainActivity kann nicht in android.support.v4.app.FragmentActivity umgewandelt werden –

+0

Inconvertible-Typen. –

6

Hier können Sie Übergang gesetzt;)

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

Eine andere Lösung ...

Declare Kontext

private Toast mssgeToast; 

private Context ctxContext; 

public MyViewListener(myView pView){ 

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

} 

Weiter ...

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

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

} 

und erklären in OnClickListener. Beispiel:

@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); 
    } 
Verwandte Themen