【问题标题】:How to move between the elements of recyclerview inside its adapters如何在其适配器内的 recyclerview 元素之间移动
【发布时间】:2018-01-28 15:26:19
【问题描述】:

我无法用我的问题完美地表达这个问题,但基本上我想要实现的是:-

我有包含 textview 的项目的 recyclerview,例如,当项目被点击时;将显示一个自定义对话框,其中包含单击元素的相同内容。

到目前为止一切顺利,在同一个对话框的每一侧都有两个箭头(左右),箭头按钮应该在 recyclerview 项目之间导航并根据新位置更新内容。

这是我所做的:

  @Override
    public void onBindViewHolder(final ViewHolder holder, final int position) {
    holder.tvTitle.setText(data.get(position).getTitle());

    holder.itemView.setOnClickListener(new OnClickListener() {
      @Override
      public void onClick(View view) {

      //Initializing the custom dailog
        final Dialog dialog = new Dialog(context);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialog.getWindow() .setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
        dialog.getWindow().getAttributes().gravity = Gravity.TOP;
        dialog.setContentView(R.layout.dailog);
        dialog.show();

        ImageView RightArrow = (ImageView) dialog.findViewById(R.id.dia_right_arrow);
        ImageView LeftArrow = (ImageView) dialog.findViewById(R.id.dia_left_arrow);
        final TextView textViewTitle = (TextView) dialog.findViewById(R.id.dia_tvTtile);


        textViewTitle.setText(data.get(position).getTitle());

        RightArrow.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {

              int curPosi = 0;  
               if (data.size() != 0) {
                 curPosi = position+1;
              }
         textViewTitle.setText(data.get(position).getTitle());
          }
        });

        LeftArrow.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {

            int curPosi = 0;
            if (data.size() != 0) {
              curPosi = position-1;
            } 
          textViewTitle.setText(data.get(position).getTitle());

          } });
      }});

     }

结果:

当我点击右箭头时,它会 100% 工作,但是如果我再次点击什么都不会发生!

如果随时单击左箭头,则会出现以下异常:

java.lang.ArrayIndexOutOfBoundsException: length=10; index=-1

是否可以实现循环效果,我的意思是当我达到 最后一个索引并再次单击它显示第一个索引,反之亦然 反之亦然..!

有什么帮助吗?

【问题讨论】:

    标签: java android arrays arraylist android-recyclerview


    【解决方案1】:

    问题似乎在于您如何检查点击限制。你可以试试这个

    添加curPosi作为类成员变量

    private int curPosi;
    
    @Override
    public void onBindViewHolder(final ViewHolder holder, final int position) {
    holder.tvTitle.setText(data.get(position).getTitle());
    
    
    
    holder.itemView.setOnClickListener(new OnClickListener() {
      @Override
      public void onClick(View view) {
    
      curPosi = position
    
      //Initializing the custom dailog
        final Dialog dialog = new Dialog(context);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialog.getWindow() .setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
        dialog.getWindow().getAttributes().gravity = Gravity.TOP;
        dialog.setContentView(R.layout.dailog);
        dialog.show();
    
        ImageView RightArrow = (ImageView) dialog.findViewById(R.id.dia_right_arrow);
        ImageView LeftArrow = (ImageView) dialog.findViewById(R.id.dia_left_arrow);
        final TextView textViewTitle = (TextView) dialog.findViewById(R.id.dia_tvTtile);
    
    
        textViewTitle.setText(data.get(position).getTitle());
    
        RightArrow.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {
    
             int lastIndex = data.size()-1;
    
            if (lastIndex == curPosi ) { // this prevents the crash, so if the next button is clicked while the last index is showing it will reset and show the first one..!
              curPosi = 0;
            } else if(curPosi < data.size()) {
              curPosi++;
            }
    
         textViewTitle.setText(data.get(curPosi).getTitle());
          }
        });
    
        LeftArrow.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {
    
           //same thing here with this "if", when the previous button clicked from the first; it will show the last item..!  
             if (curPosi == 0) { 
              curPosi = data.size();
            }
    
            if (curPosi > 0) {
              curPosi--;
            }
    
          textViewTitle.setText(data.get(curPosi).getTitle());
    
          } });
      }});
    
     }
    

    【讨论】:

    • 很抱歉,但这导致了几个问题:(1)它只显示下一个和上一个元素,并且没有通过那些。 (2) 从第一个元素向左单击时;什么都没有发生“它应该显示最后一个”。 (3)从最后一个元素单击右侧时,它给了我这个崩溃java.lang.IndexOutOfBoundsException: Invalid index 8, size is 8
    • 现在好多了,前两个问题现在已经解决了,但是(3)仍然存在,当我在最后一个项目上然后单击下一步(右箭头)它给了我java.lang.IndexOutOfBoundsException: Invalid index 8, size is 8! !我看到了这一点,因为当单击下一个时,我们将curPosi 比导致崩溃的data.size 增加了一个。!那么在这种情况下如何使它进入第一项。就像重置一样!我在另一个之前添加了这个if,但它不起作用if (curPosi == data.size() ) { curPosi = 0; }
    • 没关系,我想通了,我会更新您的解决方案以最终确定答案,非常感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 2020-06-06
    • 2020-07-29
    • 1970-01-01
    • 2017-09-23
    • 1970-01-01
    • 2011-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多