【问题标题】:Horizontal Recycler view with left and right arrow Indicators带有左右箭头指示器的水平回收器视图
【发布时间】:2017-12-18 08:34:40
【问题描述】:

我正在尝试使用左右箭头指示器实现水平循环视图。因此,如果单击右箭头会出现下一个项目,如果单击左箭头,则会出现上一个项目,并且在列表的末尾,左箭头应该消失。我不知道如何实现这一点。有人可以帮我吗?下面是我的 Horizo​​ntal Recyclerview 适配器。

public class DialogRecyclerViewAdapter extends RecyclerView.Adapter<DialogRecyclerViewAdapter.ViewHolder> {

Context context;

List<UploadImage> dataAdapters;
private SharedPreferences.Editor mSharedPrefEditor;

ImageLoader imageLoader;

public DialogRecyclerViewAdapter(List<UploadImage> getDataAdapter, Context context){

    super();
    this.dataAdapters = getDataAdapter;
    this.context = context;
}

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

    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.cardview, parent, false);

    ViewHolder viewHolder = new ViewHolder(view);

    return viewHolder;
}

@Override
public void onBindViewHolder(ViewHolder Viewholder, int position) {

    final UploadImage dataAdapterOBJ =  dataAdapters.get(position);

    imageLoader = ImageAdapter.getInstance(context).getImageLoader();

    imageLoader.get(dataAdapterOBJ.getImage(),
            ImageLoader.getImageListener(
                    Viewholder.VollyImageView,//Server Image
                    R.drawable.loading_1,//Before loading server image the default showing image.
                    android.R.drawable.ic_dialog_alert //Error image if requested image dose not found on server.
            )
    );

    Viewholder.VollyImageView.setImageUrl(dataAdapterOBJ.getImage(), imageLoader);

    Viewholder.ImageTitleTextView.setText(dataAdapterOBJ.getBrand_name());

    Viewholder.garment_price.setText(dataAdapterOBJ.getGarment_price());


    Viewholder.VollyImageView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(MihuChatApplication.getInstance().getContext());
            mSharedPrefEditor = sharedPref.edit();
            mSharedPrefEditor.putString(Constants.KEY_FROM_CHAT, "fromChatWIndow").apply();


            Intent i=new Intent(MihuChatApplication.getInstance().getContext(), DetailsNewActivity.class);
            i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

            //PACK DATA TO SEND
            i.putExtra("image_title",dataAdapterOBJ.getGarment_name());

            i.putExtra("image_url",dataAdapterOBJ.getImage_full());
            i.putExtra("desc_text", dataAdapterOBJ.getDesc_text());
            //i.putExtra("image_url2", imageLarger);

            i.putExtra("image_price", dataAdapterOBJ.getGarment_price());
            //i.putExtra("disc_price", disc_price);
            //open activity
            MihuChatApplication.getInstance().getApplicationContext().startActivity(i);
        }
    });

}

@Override
public int getItemCount() {

    return dataAdapters.size();
}

class ViewHolder extends RecyclerView.ViewHolder{

    public TextView ImageTitleTextView, garment_price;
    public NetworkImageView VollyImageView ;

    public ViewHolder(View itemView) {

        super(itemView);

        garment_price = (TextView) itemView.findViewById(R.id.garment_price);

        ImageTitleTextView = (TextView) itemView.findViewById(R.id.ImageNameTextView) ;

        VollyImageView = (NetworkImageView) itemView.findViewById(R.id.VolleyImageView) ;

    }
}

}

提前致谢。

【问题讨论】:

  • 我在一年前工作过,我所做的是在末端使用两个可点击的图像,在它们之间使用我的回收站视图,并按照您所说的编写逻辑向左或向右滚动视图,最后隐藏按钮
  • 你能发一些代码让我更好地理解它
  • 目前我没有,如果我有它会更新
  • 好的,提前谢谢

标签: java android android-recyclerview


【解决方案1】:

试试下面的

这里img_LeftScroll是左imageview,img_right_scroll是水平list之间的右imageview,rv_horizo​​ntal是horizo​​ntallist view

然后单击图像视图执行以下操作,希望它有效

 img_LeftScroll.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (horizontalLayoutManagaer.findFirstVisibleItemPosition() > 0) {
                rv_horizontal.smoothScrollToPosition(horizontalLayoutManagaer.findFirstVisibleItemPosition() - 1);
            } else {
                rv_horizontal.smoothScrollToPosition(0);
            }

        }
    });

 img_right_scroll.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            rv_horizontal.smoothScrollToPosition(horizontalLayoutManagaer.findLastVisibleItemPosition() + 1);
        }
    });

【讨论】:

  • 你能告诉我如何在列表末尾隐藏正确的指示符吗?
  • 您可以通过检查horizo​​ntalLayoutManagaer.findLastVisibleItemPosition 是否等于您在右图像视图中单击的列表大小来隐藏右图像视图
  • @AmruthaSaj 它应该是 layout_mangaer.findLastVisibleItemPosition() == modelList.size()-1 然后我们可以隐藏下一个箭头
  • @AmruthaSaj 谢谢......简单而简短的代码......它的工作就像魅力
【解决方案2】:

带有左右箭头指示器的水平回收器视图 -- 我已经通过创建一个带有 recyclerVIew 和两个箭头图像的自定义布局来完成此操作 --

recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
            super.onScrollStateChanged(recyclerView, newState);
            switch (newState) {
                case SCROLL_STATE_DRAGGING:
                    //Indicated that user scrolled.
                    programaticallyScrolled = false;
                    break;
                case SCROLL_STATE_IDLE:
                    if (!programaticallyScrolled) {
                        currentVisibleItem = linearLayoutManager.findFirstCompletelyVisibleItemPosition();
                        handleWritingViewNavigationArrows(false);
                    }
                    break;
                default:
                    break;
            }
        }
    });

隐藏/显示导航箭头

 /**
 * Handles the arrows visibility based on current visible items and scrolls the
 * current visibility item based on param scroll.
 *
 * Scroll - is False if User scrolls the Reycler Manually
 *        - is True means User used arrows to navigate
 *
 * @param scroll
 */
private void handleWritingViewNavigationArrows(boolean scroll) {
    if (currentVisibleItem == (recyclerView.getAdapter().getItemCount() - 1)) {
        rightArrow.setVisibility(View.GONE);
        leftArrow.setVisibility(View.VISIBLE);
    } else if (currentVisibleItem != 0) {
        rightArrow.setVisibility(View.VISIBLE);
        leftArrow.setVisibility(View.VISIBLE);
    } else if (currentVisibleItem == 0) {
        leftArrow.setVisibility(View.GONE);
        rightArrow.setVisibility(View.VISIBLE);
    }
    if (scroll) {
        recyclerView.smoothScrollToPosition(currentVisibleItem);
    }
}

查看示例以获取参考,希望对您有所帮助

https://github.com/RameshBhupathi/RecyclerViewWithLeftAndRightArrowsExample

【讨论】:

    【解决方案3】:

    此代码适用于我的情况:

    btn_to_right.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            p = linearLayoutManager.findFirstVisibleItemPosition() - 1;
            recyclerview.smoothScrollToPosition( p);
            checkVisibility();
        }
    });
    
    
    btn_to_left.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            p = linearLayoutManager.findLastVisibleItemPosition() + 1;
            recyclerview.smoothScrollToPosition(p);
            checkVisibility();
        }
    });
    
    
    public void checkVisibility() {
        if (p < 1) {
            btn_to_right.setVisibility(View.GONE);
            btn_to_left.setVisibility(View.VISIBLE);
        } else if (p >= (recyclerview.getAdapter().getItemCount() - 1)) {
            btn_to_right.setVisibility(View.VISIBLE);
            btn_to_left.setVisibility(View.GONE);
        } else {
            btn_to_right.setVisibility(View.VISIBLE);
            btn_to_left.setVisibility(View.VISIBLE);
        }
    }
    

    【讨论】:

      【解决方案4】:

      隐藏/显示箭头的更简单的方法:

      recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
              @Override
              public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
                  super.onScrollStateChanged(recyclerView, newState);
      
      
                  if (manager.findFirstCompletelyVisibleItemPosition()==0){
                      leftArrow.setVisibility(View.INVISIBLE);
                  }else{
                      leftArrow.setVisibility(View.VISIBLE);
                  }
      
                  if (manager.findLastCompletelyVisibleItemPosition()==list.size()-1){
                      rightArrow.setVisibility(View.INVISIBLE);
                  }else
                      rightArrow.setVisibility(View.VISIBLE);
              }
      
              @Override
              public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
                  super.onScrolled(recyclerView, dx, dy);
              }
          });
      

      【讨论】:

      • 为回收站视图设置的布局管理器。例如:LinearLayoutManager manager = new LinearLayoutManager(this); mRecyclerView.setLayoutManager(manager);
      猜你喜欢
      • 1970-01-01
      • 2016-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多