我有一个带有两个按钮的活动,下一个和上一个以及一个文本视图,我想每次单击时更新文本视图内容下一个或上一个
例如,如果我单击“下一步”,则文本视图应向我显示下一个位置的内容,反之亦然。
我认为我应该使用循环,但是当我尝试执行此操作时会给我一个错误,当我在位置(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);
}
});
答案 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() 中避开昂贵的操作,因为滚动可能会变慢。
更多提示在这里: