onBindViewHolder增加位置onClickListener

时间:2019-07-09 14:16:04

标签: java android

我有一个带有两个按钮的活动,下一个上一个以及一个文本视图,我想每次单击时更新文本视图内容下一个或上一个 例如,如果我单击“下一步”,则文本视图应向我显示下一个位置的内容,反之亦然。 我认为我应该使用循环,但是当我尝试执行此操作时会给我一个错误,当我在位置(i+1)中加1时它可以工作,但它只给我第二个位置,我想得到所有该职位不仅是第二个。我真的不知道我的问题是否很清楚,希望它是:)

onBindViewHolder

@Override
public void onBindViewHolder(@NonNull final MyViewHolder myViewHolder, @SuppressLint("RecyclerView") final int i) {

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

            String nextContent = listItems.get(i).getContent();
            String previousContent = listItems.get(i).getContent();
            Intent intent = new Intent(v.getContext(), Main2Activity.class);
            intent.putExtra("next", nextContent);
            intent.putExtra("prev", previousContent);
            v.getContext().startActivity(intent);

        }
    });
}

Main2Activity

btnNext.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            itemTextView.setText(nextContent);
        }
    });

btnPrev.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            itemTextView.setText(prevContent);
        }
    });

2 个答案:

答案 0 :(得分:0)

循环不是这里的答案,循环是用于自动化某些东西。这是一个事件(用户进行了互动),因此不合适。

您可能想要的算法基本上如下:

  • 用户点击了一个项目
  • 找出商品索引
  • 增加索引
  • 通过索引来查找具有该索引的项目
  • 如果存在,请对其进行处理

但是,您发布的代码中的问题是'nextContent'始终是当前项目。因此,您需要进行以下更改(但要注意边界):

String nextContent = listItems.get(i+1).getContent();
String previousContent = listItems.get(i-1).getContent();

您当前的代码未使用循环,因此应为i的每个值调用一次onBind方法,因此它不应始终是第二项


注释出现后,您将拥有与列表无关的按钮,因此现在要做的是使每次单击RV或Next / Prev中的项目时,都可以存储正确的索引(无权访问i

在活动中:

private int currentTextItem = 0;

public void setCurrentTextItem(int i) {
    currentTextItem = i;
    //the dots here will be how you get the text from the item
    //   probably recyclerView.findViewHolderForAdapterPosition(pos) 
    myTextView.setText( ... );
}

在您的视图持有人代码中:

myViewHolder.cardView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        //(You should have some kind of call back from viewholder to activity)
        activity.setCurrentTextItem(i);
    }
});

然后下一个/上一个:

btnNext.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        setCurrentTextItem(currentTextItem + 1);
    }
});

btnPrev.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        setCurrentTextItem(currentTextItem - 1);
    }
});

答案 1 :(得分:0)

onBindViewHolder 方法中设置点击侦听器是不好的做法

为什么?因为onBindViewHolder每次都被调用,所以视图被回收以使新内容显示在屏幕上。假设您有1000个元素的列表,其中10个元素在屏幕上可见。

将其滚动到末尾=>然后将onBindViewHolder调用990次=>设置990个单击侦听器。

您还希望在 onBindViewHolder()避开昂贵的操作,因为滚动可能会变慢。

更多提示在这里:

Recyclerview(Getting item on Recyclerview)