Motion control speed to view recycler

I have a RecyclerView in which I have an image, several TextView and 2 ImageButton s. I have 7-8 such lines to display in my Activity . Scrolling is very smooth in versions of Android 4.4.4 and below, but in a lollipop it gives a jitter effect. I think throwing speed control for the RecyclerView will help. I searched for this but found nothing. Instead, I found how to move my gaze to a specific throwing position.

But I want to control the speed of the throw. Can friction be used? And how to use friction.

 menuRecyclerView = (RecyclerView) findViewById(R.id.menuList); menuRecyclerView.setHasFixedSize(true); LinearLayoutManager llm = new LinearLayoutManager(context); menuRecyclerView.setLayoutManager(llm); Scroller sc = new Scroller(context); sc.setFriction(ViewConfiguration.getScrollFriction() * 10); 

This is my adapter for customizing the layout of the Rcycler view.

 import android.content.Context; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Toast; import com.bumptech.glide.Glide; import news.circle.circle.R; public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.CustomViewHolder> { public RecyclerViewAdapter(Context context, List<MenuDescription> listOrder, DatabaseHandlerCart db , List<MenuDescription> vegList, List<MenuDescription> nonVegList, String menuTextData) { this.listOrder = listOrder; this.inflater = LayoutInflater.from(context); this.context = context; imageLoader = new ImageLoader(context); this.db = db; this.vegList = vegList; this.nonVegList = nonVegList; this.completeList = listOrder; this.menuTextData = menuTextData; } @Override public RecyclerViewAdapter.CustomViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if (viewType == TYPE_ITEM) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_view, parent, false); return new CustomViewHolder(view, viewType); } else if (viewType == TYPE_HEADER) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.header, parent, false); return new CustomViewHolder(view, viewType); } return null; } @Override public void onBindViewHolder(final RecyclerViewAdapter.CustomViewHolder holder, int position) { if (holder.Holderid == 1) { final MenuDescription menu = listOrder.get(position - 1); holder.title.setText(menu.getName() + ""); holder.quant.setText(menu.getQuantity() + ""); holder.description.setText(menu.getDescription()); holder.title.setTypeface(Fonts.getFont(context, Constants.AVENIR_REGULAR)); holder.description.setTypeface(Fonts.getFont(context, Constants.AVENIR_REGULAR)); Glide.with(context).load(menu.getFlag_path()).placeholder(R.drawable.ic_order_now).fitCenter().into(holder.image); holder.inc.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub if (Constants.internet) { menu.decrQuantity(); if (menu.getQuantity() == 0) { menu.setDecr_button_visibility(0); try { db.DeleteCartItem(menu.getItem_id()); } catch (SQLException e) { e.printStackTrace(); } } else { try { db.updateQuantity(menu.getQuantity(), menu.getItem_id()); } catch (SQLException e) { e.printStackTrace(); } } holder.quant.setText(menu.getQuantity() + ""); notifyDataSetChanged(); } else { Toast.makeText(context, "Please check your internet connection", Toast.LENGTH_SHORT). } show(); } }); holder.decr.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (Constants.internet) { try { if (!db.CheckIsItemAlreadyInDBorNot(menu.getItem_id(), "cart")) { menu.incrQuantity(); db.addDataToCart(menu); // cart_items.add(menu); holder.quant.setText(menu.getQuantity() + ""); } else { menu.incrQuantity(); db.updateQuantity(menu.getQuantity(), menu.getItem_id()); holder.quant.setText(menu.getQuantity() + ""); } } catch (SQLException | IllegalStateException e) { e.printStackTrace(); } if (menu.getDecr_button_visibility() == 1) { holder.decr.setVisibility(View.VISIBLE); holder.quant.setVisibility(View.VISIBLE); if (total == 1) RecyclerViewMainActivity.bottomBarUp(); notifyDataSetChanged(); } else Toast.makeText(context, "Please check your internet connection", Toast.LENGTH_SHORT).show(); } } }); } } @Override public int getItemCount() { return (null != listOrder ? listOrder.size() + 1 : 0); } @Override public int getItemViewType(int position) { if (isPositionHeader(position)) return TYPE_HEADER; return TYPE_ITEM; } @Override public void onAttachedToRecyclerView(RecyclerView recyclerView) { super.onAttachedToRecyclerView(recyclerView); } private boolean isPositionHeader(int position) { return position == 0; } } 
+7
source share
5 answers

There is one RecyclerView method specifically designed to control the transition speed , you only need to override it to achieve the friction / deceleration effect mentioned in your question.

One simple implementation you could try:

 @Override public boolean fling(int velocityX, int velocityY) { // if FLING_SPEED_FACTOR between [0, 1[ => slowdown velocityY *= FLING_SPEED_FACTOR; return super.fling(velocityX, velocityY); } 
+9
source

This works well to set the maximum speed threshold:

 mRecyclerView.setOnFlingListener(new RecyclerView.OnFlingListener() { @Override public boolean onFling(int velocityX, int velocityY) { if (Math.abs(velocityY) > MAX_VELOCITY_Y) { velocityY = MAX_VELOCITY_Y * (int) Math.signum((double)velocityY); mRecyclerView.fling(velocityX, velocityY); return true; } return false; } }); 
+5
source

RecyclerView does a great job of being super-modular. you can set your own scroller in LayoutManager

You can use https://github.com/apptik/MultiView/tree/master/scrollers

Example:

 RecyclerView.SmoothScroller smoothScroller = new FlexiSmoothScroller(getContext()) .setMillisecondsPerInchSearchingTarget(100f)); smoothScroller.setTargetPosition(targetPos); recyclerView.getLayoutManager().startSmoothScroll(smoothScroller); 

you can check out a few examples: https://github.com/apptik/MultiView/blob/master/app/src/main/java/io/apptik/multiview/ScrollersFragment.java

+1
source

to control the scrolling speed of your recycler See this SO post: Fast scrolling in RecyclerView

Basically, you can override recyclerviews smoothScroll or implement your own onGestureListener and attach it to recyclerView

0
source

I have the same problem. Here is a solution to slow down the roll.

  val maxFling=4000 onFlingListener = object : RecyclerView.OnFlingListener() { override fun onFling(velocityX: Int, velocityY: Int): Boolean { if (velocityY > maxFling) { fling(velocityX, maxFling) return true } else if (velocityY < -maxFling) { fling(velocityX, -maxFling) return true } else { return false } } } 
0
source

All Articles