4

I want to have bottom sheet, which display two fragments inside viewpager. I used two Fragments with FragmentPagerAdapter and BottomSheetDialogFragment to build dialog.

My problem was in the viewPager, the second fragment recyclerview dont scroll.

Image of my application displaying

Recyclerview adapter

public class LigneListAdapter extends RecyclerView.Adapter<LigneListAdapter.ListViewHolder> {

Context context;
List<Ligne> lignes = new ArrayList<>();
LayoutInflater inflater;
ListListener listener;

public LigneListAdapter(Context context, List<Ligne> list) {

    this.context = context;
    this.lignes = list;
    //this.listener= (ListListener) context;
    inflater = LayoutInflater.from(context);


}

@Override
public ListViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    View convertView = inflater.inflate(R.layout.ligne_list_row, parent, false);
    ListViewHolder viewHolder = new ListViewHolder(convertView);
    return viewHolder;
}

@Override
public void onBindViewHolder(ListViewHolder holder, int position) {


    holder.ligne_icon.setTag(position);
    holder.ligne_name.setText(lignes.get(position).getNomLigne());

    holder.ligne_name.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
           // listener.nameToChnge(lignes.get((Integer) v.getTag()).getId());


        }
    });

}

@Override
public int getItemCount() {
    return lignes.size();
}

class ListViewHolder extends RecyclerView.ViewHolder {
    TextView ligne_name;
    ImageView ligne_icon;

    public ListViewHolder(View itemView) {
        super(itemView);

        ligne_name = (TextView) itemView.findViewById(R.id.ligne_name);
        ligne_icon= (ImageView) itemView.findViewById(R.id.ligne_icon);

    }
}
}

My first fragment code (same like second)

public class LigneFragment extends Fragment implements ListListener {

private RecyclerView recyclerView;
private LigneDAO ligneDAO ;
private LigneListAdapter adapter;

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    // super.onCreateView(inflater,container,savedInstanceState);

    View v =  inflater.inflate(R.layout.ligne_fragment_list_view, null);
    ligneDAO = new LigneDAO(getContext());
    ligneDAO.open();

    recyclerView = (RecyclerView) v.findViewById(R.id.recycler_list_view);
    adapter = new LigneListAdapter(getContext(), ligneDAO.getAllLignes());
    recyclerView.setAdapter(adapter);
    recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
    ligneDAO.close();
    return v;
}

@Override
public void nameToChnge(String name) {

}

@Override
public void getStationSelected(Station station) {

}
}

FragmentPagerAdapter

public class PagerAdapter extends FragmentPagerAdapter {

public PagerAdapter(FragmentManager fm) {
    super(fm);
}

@Override
public Fragment getItem(int position) {

    Fragment frag=null;
    switch (position){
        case 0:
            frag=new LigneFragment();
            break;
        case 1:
            frag=new StationFragment();
            break;
    }
    return frag;
}

@Override
public int getCount() {
    return 2;
}

@Override
public CharSequence getPageTitle(int position) {
    String title=" ";
    switch (position){
        case 0:
            title="Lignes";
            break;
        case 1:
            title="Stations";
            break;
    }

    return title;
}
}

BottomSheetDialogFragment

public class AlsaBottomDialogFragment   extends BottomSheetDialogFragment {


private static final String TAB_POSITION = "tab_position";

private PagerAdapter adapter;
private  ViewPager viewPager;
private TabLayout tabLayout;

private LinearLayoutManager mLinearLayoutManager;
private AlsaRecyclerAdapter mAdapter;

public AlsaBottomDialogFragment(){

}


private BottomSheetBehavior.BottomSheetCallback mBottomSheetBehaviorCallback = new BottomSheetBehavior.BottomSheetCallback() {

    @Override
    public void onStateChanged(@NonNull View bottomSheet, int newState) {
        if (newState == BottomSheetBehavior.STATE_HIDDEN) {
            dismiss();
        }
    }

    @Override
    public void onSlide(@NonNull View bottomSheet, float slideOffset) {
    }
};

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View root = inflater.inflate(R.layout.bottom_sheet, container);
    tabLayout = (TabLayout) root.findViewById(R.id.tablayout);
    viewPager = (ViewPager) root.findViewById(R.id.viewpager);

    adapter = new PagerAdapter(getChildFragmentManager());
    viewPager.setAdapter(adapter);
    tabLayout.post(new Runnable() {
        @Override
        public void run() {
            tabLayout.setupWithViewPager(viewPager);
        }
    });
    return root;
}


@Override
public void onViewCreated(View contentView, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(contentView, savedInstanceState);
}

@Override
public void setupDialog(Dialog dialog, int style) {
    super.setupDialog(dialog, style);
    View contentView = View.inflate(getContext(), R.layout.bottom_sheet, null);
    dialog.setContentView(contentView);
    CoordinatorLayout.LayoutParams layoutParams =
            (CoordinatorLayout.LayoutParams) ((View) contentView.getParent()).getLayoutParams();
    CoordinatorLayout.Behavior behavior = layoutParams.getBehavior();
    if (behavior != null && behavior instanceof BottomSheetBehavior) {
        ((BottomSheetBehavior) behavior).setBottomSheetCallback(mBottomSheetBehaviorCallback);
    }

}

}

I dont know where are the prolem, help please

MidasLefko
  • 4,499
  • 1
  • 31
  • 44
Trafalger .D
  • 41
  • 2
  • 2
  • This might help you: http://stackoverflow.com/questions/37715822/android-viewpager-with-recyclerview-works-incorrectly-inside-bottomsheet/38281457#38281457 – Timo Bähr Jul 11 '16 at 11:08

1 Answers1

0

Try and set the adapter after you set the recyclerview layout. You set the adapter before the layout rather than afterwards. Not sure if it will help or not.

James Smith
  • 73
  • 10