【问题标题】:How to scroll horizontal recyclerview on click?如何在点击时滚动水平回收器视图?
【发布时间】:2019-01-10 22:23:18
【问题描述】:

实际上我想在水平recyclerview 中添加一个这样的功能,如果它是最后一个位置,它会自动滚动到下一个位置,有时它必须向前移动,有时它必须向后移动,就像 instagram 的过滤器视图一样通过点击自动滚动。我想知道如何执行此任务。目前按我的逻辑它只是向前滚动,但我不知道如何插入向后滚动的逻辑。

代码:

horzRview.addOnItemTouchListener(new RecyclerItemClickListener(ctx, horzRview, new RecyclerItemClickListener.OnItemClickListener() {
        @Override
        public void onItemClick(View view, int position) {

            if(position<adapter.getItemCount()-1)
            horzRview.getLayoutManager().smoothScrollToPosition(horzRview, null, position+1);

            else horzRview.getLayoutManager().smoothScrollToPosition(horzRview, null, position-1);

        }

        @Override
        public void onLongItemClick(View view, int position) {
        }
    }));

【问题讨论】:

  • 使用horzRview.scrollTo(curruntPostion-1)方法滚动后退
  • @SaurabhBhandari 感谢您的回答先生,但什么时候这样做
  • @SaurabhBhandari 不,先生,你不明白我怎么能假设我必须向前或向后移动
  • 然后获取屏幕宽度获取它的中点如果触摸在 mid 之前然后使用 pos-1 或者如果它在 mid 之后使用 pos+1

标签: android android-recyclerview horizontal-scrolling


【解决方案1】:

使用首选项 STAP_TO_START 创建 SmoothScroller:

RecyclerView.SmoothScroller smoothScroller = new 
LinearSmoothScroller(context) {
   @Override protected int getVerticalSnapPreference() {
       return LinearSmoothScroller.SNAP_TO_START;
   }
};

现在你设置滚动的位置(它的位置):

smoothScroller.setTargetPosition(position);

将 SmoothScroller 传递给 LayoutManager:

layoutManager.startSmoothScroll(smoothScroller);

【讨论】:

    【解决方案2】:
    public interface OnItemClickListener {
    void onItemClick(View view , int position);
    }
    //in adapter class
    public class Adpt extends 
    RecyclerView.Adapter<Adpt.ViewHolder> {
    Context context;
    OnItemClickListener onItemClickListener;
    public Adpt(Context context,OnItemClickListener onItemClickListener) {
    this.context = context;
    this.onItemClickListener = onItemClickListener;
    }
    //put your click on itemview 
    holder.itemView.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View view) {
    
          onItemClickListener.onItemClick(view,position);
    
    
      }
    });
    //implement your interface when you will set your adapter
    Adpt adpt = new Adpr(activity,new OnItemCLickListner(){
    // put your logic here
    });
    

    【讨论】:

    • OP 要求 recyclerView 的向后滚动逻辑而不是项目点击监听器。请提供您的答案的描述。
    【解决方案3】:

    我最终做了一个棘手的计算,即我通过平均第一个和最后一个完全可见的项目来获得中间完全可见的项目。然后我应用我的逻辑如下:

    代码:

    horzRview.addOnItemTouchListener(new RecyclerItemClickListener(ctx, horzRview, new RecyclerItemClickListener.OnItemClickListener() {
            @Override
            public void onItemClick(View view, int position) {
    
                int avg =
                        (layoutManager.findFirstCompletelyVisibleItemPosition()+(layoutManager.findFirstCompletelyVisibleItemPosition()+1)+
                        layoutManager.findLastCompletelyVisibleItemPosition())/3;
    
    
                if(position>avg) horzRview.getLayoutManager().smoothScrollToPosition(horzRview, null, position+1);
                else if(position!=0) horzRview.getLayoutManager().smoothScrollToPosition(horzRview, null, position-1);
                else horzRview.getLayoutManager().smoothScrollToPosition(horzRview, null, 0);
    
            }
    
            @Override
            public void onLongItemClick(View view, int position) {
            }
        }));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-28
      相关资源
      最近更新 更多