I have a vertical view pager for short news app with poll , ad and insight(horizontal recyclerview), ex inshort news app. when news , poll and ad comes it looks good and scroll works fine but when insight comes with (horizontal recyclerview) then vertical view pager scroll stops working.
//View Pager class
public class VerticalViewPager extends ViewPager {
private GestureDetector mGestureDetector;
View.OnTouchListener mGestureListener;
public VerticalViewPager( Context context) {
super(context);
init();
}
public VerticalViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
mGestureDetector = new GestureDetector(context, new YScrollDetector());
setFadingEdgeLength(0);
init();
}
private void init() {
// The majority of the magic happens here
setPageTransformer(true, new VerticalPageTransformer());
// The easiest way to get rid of the overscroll drawing that happens on the left and right
setOverScrollMode(OVER_SCROLL_NEVER);
}
private class VerticalPageTransformer implements ViewPager.PageTransformer {
@Override
public void transformPage( View view, float position) {
if (position < -1) { // [-Infinity,-1)
// This page is way off-screen to the left.
view.setAlpha(0);
} else if (position <= 0) { // [-1,1]
view.setAlpha(1);
// Counteract the default slide transition
view.setTranslationX(view.getWidth() * -position);
//set Y position to swipe in from top
float yPosition = position * view.getHeight();
view.setTranslationY(yPosition);
view.setScaleX ( 1 );
view.setScaleY ( 1 );
} else if ( position<=1 ){ // (1,+Infinity]
// This page is way off-screen to the right.
view.setTranslationX ( view.getWidth ()*-position );
float scale=0.75f + (1-0.75f)*(1-Math.abs ( position ));
view.setScaleX ( scale );
view.setScaleY ( scale );
}else {
view.setAlpha ( 0 );
}
}
}
/**
* Swaps the X and Y coordinates of your touch event.
*/
private MotionEvent swapXY( MotionEvent ev) {
float width = getWidth();
float height = getHeight();
float newX = (ev.getY() / height) * width;
float newY = (ev.getX() / width) * height;
ev.setLocation(newX, newY);
return ev;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev){
/* boolean intercepted = super.onInterceptTouchEvent(swapXY(ev));
swapXY(ev); // return touch coordinates to original reference frame for any child views
return intercepted;*/
return super.onInterceptTouchEvent(ev) && mGestureDetector.onTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
return super.onTouchEvent(swapXY(ev));
}
// Return false if we're scrolling in the x direction
class YScrollDetector extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
if (Math.abs(distanceY) > Math.abs(distanceX)) {
return true;
}
return false;
}
}
}
//View Pager adaptor class
public class ViewPagerAdaptor extends PagerAdapter {
ArrayList<SliderItems>sliderItems;
LayoutInflater layoutInflater;
Context context;
private ArrayList<Pojo> alBanner;
private ArrayList<Pojo> alPlansB;
public ViewPagerAdaptor( ArrayList<SliderItems>sliderItems, Context context ){
this.sliderItems=sliderItems;
this.context=context;
layoutInflater=(LayoutInflater)context.getSystemService ( Context.LAYOUT_INFLATER_SERVICE );
}
@Override
public int getCount (){
return sliderItems.size ();
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
@NonNull
@Override
public Object instantiateItem ( ViewGroup container , int position ){
switch (sliderItems.get ( position ).getArticleType ( )) {
case "1": {
View itemView = layoutInflater.inflate ( R.layout.layout_insightnews , container , false );
container.addView ( itemView );
ImageView imgBookmark = ( ImageView ) itemView.findViewById ( R.id.img_bookmark );
ImageView imgNews = ( ImageView ) itemView.findViewById ( R.id.img_news );
TextView tvTitle = ( TextView ) itemView.findViewById ( R.id.tv_title );
TextView tvDesc = ( TextView ) itemView.findViewById ( R.id.tv_desc );
TextView tvCat = ( TextView ) itemView.findViewById ( R.id.nfbjeh );
try {
JSONObject jsonObject = new JSONObject ( sliderItems.get ( position ).getMainObject ( ) );
tvTitle.setText ( sliderItems.get ( position ).getTitle ( ) );
tvDesc.setText ( sliderItems.get ( position ).getDesc ( ) );
tvCat.setText ( sliderItems.get ( position ).getCatName ( ) );
if ( !sliderItems.get ( position ).getImages ( ).equals ( "" ) ) {
Glide.with ( context )
.load ( sliderItems.get ( position ).getImages ( ) )
.centerCrop ( )
.into ( imgNews );
}
if ( sliderItems.get ( position ).getIsSaved ( ).equals ( "0" ) ) {
imgBookmark.setImageResource ( R.drawable.bookmark );
} else {
imgBookmark.setImageResource ( R.drawable.bookmarked );
}
imgBookmark.setOnClickListener ( new View.OnClickListener ( ) {
@Override
public void onClick ( View view ){
methodBookmark ( sliderItems.get ( position ).getIds ( ) , imgBookmark );
}//Added News to Bookmark.
} );
} catch (JSONException e) {
e.printStackTrace ( );
}
return itemView;
}
case "2": {
View itemView = layoutInflater.inflate ( R.layout.layout_polllist , container , false );
container.addView ( itemView );
TextView tvYes=(TextView )itemView.findViewById ( R.id.tv_yes );
TextView tvNo=(TextView )itemView.findViewById ( R.id.tv_no );
ImageView imgNews=(ImageView ) itemView.findViewById ( R.id.img_news );
TextView tvTitle=(TextView ) itemView.findViewById ( R.id.tv_title );
TextView tvDesc=(TextView )itemView.findViewById ( R.id.tv_desc );
TextView tvCat=(TextView )itemView.findViewById ( R.id.nfbjeh );
try {
JSONObject jsonObject = new JSONObject ( sliderItems.get ( position ).getMainObject ( ) );
tvTitle.setText ( sliderItems.get ( position ).getTitle () );
tvDesc.setText ( sliderItems.get ( position ).getDesc () );
TextView tvPoll=(TextView )itemView.findViewById ( R.id.tv_question );
tvPoll.setText ( jsonObject.getString ( "question" ) );
tvCat.setText ( sliderItems.get ( position ).getCatName () );
if ( jsonObject.getString ( "status" ).equals ( "1" ) ){
int total=jsonObject.getInt ( "negetive_count" )+jsonObject.getInt ( "possitive_count" );
int percent = 0;
int percentb = 0;
if (total > 0){
percent = jsonObject.getInt ( "negetive_count" ) * 100 / total;
percentb = jsonObject.getInt ( "possitive_count" ) * 100 / total;
tvYes.setText ( percentb+"%" );
tvNo.setText ( percent+"%" );
//Log.v ( "bvghvj",percent+"");
//Toast.makeText ( context, percent+"",Toast.LENGTH_LONG).show ();
}
}
if ( !sliderItems.get ( position ).getImages().equals ( "" ) ){
Glide.with( context)
.load(sliderItems.get ( position ).getImages())
.centerCrop()
.into(imgNews);
}
tvNo.setOnClickListener ( new View.OnClickListener ( ) {
@Override
public void onClick ( View view ){
methodPoll(tvNo,tvYes,sliderItems.get ( position ).getIds (),"0");
}
} );
tvYes.setOnClickListener ( new View.OnClickListener ( ) {
@Override
public void onClick ( View view ){
methodPoll(tvNo,tvYes,sliderItems.get ( position ).getIds (),"1");
}
} );
} catch (JSONException e) {
e.printStackTrace ( );
}
return itemView;
}
case "3": {
View itemView = layoutInflater.inflate ( R.layout.layout_insightmain , container , false );
container.addView ( itemView );
try {
JSONObject jsonObject = new JSONObject ( sliderItems.get ( position ).getMainObject ( ) );
JSONArray jsonArray=jsonObject.getJSONArray ( "insight_image" );
RecyclerView rvInsightView=(RecyclerView )itemView.findViewById ( R.id.rv_insightview );
InsightView_Adaptor insightView_adaptor = new InsightView_Adaptor ( context , getMatchInsightView ( jsonArray ) );
rvInsightView.setAdapter ( insightView_adaptor );
rvInsightView.setNestedScrollingEnabled(false);
rvInsightView.setHasFixedSize(true);
rvInsightView.addOnItemTouchListener(new RecyclerView.SimpleOnItemTouchListener() {
@Override
public boolean onInterceptTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e) {
ViewParent vp = rv.getParent();
int action = e.getAction();
//check if can scroll horizontally both to right and to left
boolean tolLeft = rv.canScrollHorizontally(-1);
boolean tolRight = rv.canScrollHorizontally(1);
if (tolRight || tolLeft) {
if (action == MotionEvent.ACTION_MOVE) {
int historySize = e.getHistorySize();
boolean b = true;
if (historySize > 0) {
float x2 = e.getX();
float y2 = e.getY();
float x1 = e.getHistoricalX(0);
float y1 = e.getHistoricalY(0);
//check if user's touch is not going up or down the screen
//and if he/she's moving right if possible
//or left if possible
b = Math.abs(x2 - x1) > Math.abs(y2 - y1) && ( (tolLeft && (x2 - x1) > 0) || (tolRight && (x2 - x1) < 0) );
}
vp.requestDisallowInterceptTouchEvent(b);
}
return false;
}else {
if (action == MotionEvent.ACTION_MOVE)
vp.requestDisallowInterceptTouchEvent(false);
rv.removeOnItemTouchListener(this);
return true;
}
}
});
final int radius = context.getResources().getDimensionPixelSize(R.dimen.radius);
final int dotsHeight = context.getResources().getDimensionPixelSize(R.dimen.dots_height);
final int color = ContextCompat.getColor(context, R.color.theme_color);
final int colorb = ContextCompat.getColor(context, R.color.white);
rvInsightView.addItemDecoration(new DotsIndicatorDecoration (radius, radius * 4, dotsHeight, colorb, color));
new PagerSnapHelper ().attachToRecyclerView(rvInsightView);
} catch (JSONException e) {
e.printStackTrace ( );
}
return itemView;
} default: {
View itemView = layoutInflater.inflate ( R.layout.layout_ad , container , false );
container.addView ( itemView );
ImageView imgAd=(ImageView ) itemView.findViewById ( R.id.img_news );
if ( !sliderItems.get ( position ).getImages().equals ( "" ) ){
Glide.with( context)
.load(sliderItems.get ( position ).getImages())
.centerCrop()
.into(imgAd);
}
imgAd.setOnClickListener ( new View.OnClickListener ( ) {
@Override
public void onClick ( View view ){
Intent intent=new Intent ( context, WebviewNews.class );
intent.putExtra ( "str_link",sliderItems.get (position).getLinks () );
context.startActivity ( intent );
// context.overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left);
}
} );
return itemView;
}
}
}
private void methodBookmark ( String ids , ImageView imgBookmark ){
RequestQueue myRequestQueue = Volley.newRequestQueue ( context );
StringRequest MyStringRequest = new StringRequest ( Request.Method.GET , context.getResources ( ).getString ( R.string.base_url ) + "bookmark-news/"+ids , new Response.Listener<String> ( ) {
@Override
public void onResponse ( String response ) {
try {
JSONObject jsonObject = new JSONObject ( response );
if ( jsonObject.getString ( "success" ).equals ( "true" ) ) {
Toast.makeText(context ,jsonObject.getString ( "message" ),Toast.LENGTH_LONG).show ();
if ( jsonObject.getString ( "message" ).equals ( "Removed News to Bookmark.") ){
imgBookmark.setImageResource(R.drawable.bookmark);
}else {
imgBookmark.setImageResource(R.drawable.bookmarked);
}
} else {
Toast.makeText(context ,jsonObject.getString ( "message" ),Toast.LENGTH_LONG).show ();
}
} catch (JSONException e) {
e.printStackTrace ( );
}
}
} , new Response.ErrorListener ( ) {
@Override
public void onErrorResponse ( VolleyError error ) {
Toast.makeText(context ,error.getMessage (),Toast.LENGTH_LONG).show ();
}
} ) {
@Override
public Map<String, String> getHeaders () throws AuthFailureError{
Map<String, String> params = new HashMap<String, String> ( );
params.put ( "Authorization" ,"Bearer "+ SPUser.getValue ( context,SPUser.TOKEN ) );
return params;
}
@Override
public HashMap<String, String> getParams () {
HashMap<String, String> params = new HashMap<String, String> ( );
return params;
}
};
RetryPolicy retryPolicy = new RetryPolicy ( ) {
@Override
public int getCurrentTimeout () {
return 50000;
}
@Override
public int getCurrentRetryCount () {
return 0;
}
@Override
public void retry ( VolleyError error ) throws VolleyError {
}
};
myRequestQueue.add ( MyStringRequest ).setRetryPolicy ( retryPolicy );
}
private ArrayList<Pojo> getMatchInsightView ( JSONArray json_Insight ) {
alPlansB = new ArrayList<Pojo> ( );
for ( int i = 0; i < json_Insight.length (); i++ ) {
try {
JSONObject jsonObject=json_Insight.getJSONObject ( i );
Pojo pojo = new Pojo ( );
pojo.setId ( jsonObject.getString ( "insight_id" ) );
pojo.setImages ( jsonObject.getString ( "image" ) );
alPlansB.add ( pojo );
} catch (JSONException e) {
e.printStackTrace ( );
}
}
return alPlansB;
}
private void methodPoll ( TextView tvNo , TextView tvYes , String ids, String strAns ){
ProgressDialog progressDialog = new ProgressDialog ( context );
progressDialog.setTitle ( "Loading..." );
progressDialog.show ();
RequestQueue myRequestQueue = Volley.newRequestQueue ( context );
StringRequest MyStringRequest = new StringRequest ( Request.Method.POST , context.getResources ( ).getString ( R.string.base_url ) + "poll-result" , new Response.Listener<String> ( ) {
@Override
public void onResponse ( String response ) {
progressDialog.dismiss ();
try {
JSONObject jsonObject = new JSONObject ( response );
if ( jsonObject.getString ( "success" ).equals ( "true" ) ) {
JSONObject object =jsonObject.getJSONObject ( "data" );
int total=object.getInt ( "negetive_count" )+object.getInt ( "possitive_count" );
int percent = 0;
int percentb = 0;
if (total > 0){
percent = object.getInt ( "negetive_count" ) * 100 / total;
percentb = object.getInt ( "possitive_count" ) * 100 / total;
tvYes.setText ( percentb+"%" );
tvNo.setText ( percent+"%" );
//Log.v ( "bvghvj",percent+"");
//Toast.makeText ( context, percent+"",Toast.LENGTH_LONG).show ();
}
} else {
Toast.makeText(context ,jsonObject.getString ( "message" ),Toast.LENGTH_LONG).show ();
}
} catch (JSONException e) {
e.printStackTrace ( );
}
}
} , new Response.ErrorListener ( ) {
@Override
public void onErrorResponse ( VolleyError error ) {
progressDialog.dismiss ();
Toast.makeText(context ,error.getMessage (),Toast.LENGTH_LONG).show ();
}
} ) {
@Override
public Map<String, String> getHeaders () throws AuthFailureError{
Map<String, String> params = new HashMap<String, String> ( );
params.put ( "Authorization" ,"Bearer "+ SPUser.getValue ( context,SPUser.TOKEN ) );
return params;
}
@Override
public HashMap<String, String> getParams () {
HashMap<String, String> params = new HashMap<String, String> ( );
params.put ( "poll_id",ids );
params.put ( "answer",strAns );
return params;
}
};
RetryPolicy retryPolicy = new RetryPolicy ( ) {
@Override
public int getCurrentTimeout () {
return 50000;
}
@Override
public int getCurrentRetryCount () {
return 0;
}
@Override
public void retry ( VolleyError error ) throws VolleyError {
}
};
myRequestQueue.add ( MyStringRequest ).setRetryPolicy ( retryPolicy );
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView ((RelativeLayout)object );
}
}