在我的应用程序中,我使用了viewpager2,用户可以通过点击按钮yes/no回答问题,类似于测验。我尝试将按钮onclicklistener设置为当前页面上的按钮在单击时应该改变颜色(yes=green,no=red)。问题是当我点击按钮时,有时它会改变颜色,有时它不会。否则,即使尚未单击,后面页面中的按钮也会受到影响。如何确保只有当前页面中的按钮会在单击时改变颜色?我的代码中button onclick的实现是错误的还是什么?我检查了日志,没有显示错误。
这是我的myviewpageradapter.java
public class MyViewPagerAdapter extends RecyclerView.Adapter<MyViewPagerAdapter.MyViewHolder> {
Context context;
int[][] question_matrix = new int[][]{
//Visual motor
{R.string.q1,R.string.q1m},
{R.string.q2,R.string.q2m},
//Fine motor
{R.string.q3,R.string.q3m},
{R.string.q4,R.string.q4m},
{R.string.q5,R.string.q5m},
{R.string.q6,R.string.q6m},
//body posture
{R.string.q7,R.string.q7m},
{R.string.q8,R.string.q8m},
{R.string.q9,R.string.q9m},
//shoulder stability
{R.string.q10,R.string.q10m},
{R.string.q11,R.string.q11m},
{R.string.q12,R.string.q12m},
{R.string.q13,R.string.q13m},
//spatial perception
{R.string.q14,R.string.q14m},
{R.string.q15,R.string.q15m},
//cross mid-line
{R.string.q16,R.string.q16m},
{R.string.q16,R.string.q16m},
{R.string.q16,R.string.q16m},
{R.string.q16,R.string.q16m},
{R.string.q16,R.string.q16m},
{R.string.q16,R.string.q16m},
{R.string.q16,R.string.q16m},
{R.string.q16,R.string.q16m},
{R.string.q16,R.string.q16m},
{R.string.q16,R.string.q16m},
{R.string.q16,R.string.q16m},
{R.string.q16,R.string.q16m},
{R.string.q16,R.string.q16m},
{R.string.q16,R.string.q16m},
{R.string.q16,R.string.q16m},
{R.string.q16,R.string.q16m},
{R.string.q16,R.string.q16m},
{R.string.q16,R.string.q16m},
{R.string.q16,R.string.q16m},
{R.string.q16,R.string.q16m},
{R.string.q16,R.string.q16m},
{R.string.q16,R.string.q16m},
{R.string.q16,R.string.q16m},
{R.string.q16,R.string.q16m},
{R.string.q16,R.string.q16m},
{R.string.q16,R.string.q16m},
{R.string.q17,R.string.q17m},
{R.string.q18,R.string.q18m},
//visual skill
{R.string.q19,R.string.q19m},
{R.string.q20,R.string.q20m},
};
public MyViewPagerAdapter(Context context) {
this.context = context;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new MyViewHolder(LayoutInflater.from(context).inflate(R.layout.item_page,parent,false));
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
holder.eQuestion.setText(question_matrix[position][0]);
holder.mQuestion.setText(question_matrix[position][1]);
holder.yes.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
holder.yes.setBackgroundColor(Color.GREEN);
holder.no.setBackgroundColor(Color.LTGRAY);
}
});
holder.no.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
holder.yes.setBackgroundColor(Color.LTGRAY);
holder.no.setBackgroundColor(Color.RED);
}
});
}
@Override
public int getItemCount() {
return question_matrix.length;
}
public class MyViewHolder extends RecyclerView.ViewHolder {
TextView eQuestion,mQuestion;
ConstraintLayout container;
Button yes,no;
ImageView img;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
img = itemView.findViewById(R.id.image_desc);
eQuestion = itemView.findViewById(R.id.eQuestion);
mQuestion = itemView.findViewById(R.id.mQuestion);
container = itemView.findViewById(R.id.container);
yes = itemView.findViewById(R.id.yesBtn);
no = itemView.findViewById(R.id.noBtn);
}
}
}
这是我的item_page.xml,它是此项的布局:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/image_desc"
android:layout_width="300dp"
android:layout_height="200dp"
android:layout_centerHorizontal="true"
android:src="@drawable/ic_q1"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.495"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.152" />
<TextView
android:id="@+id/eQuestion"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/image_desc"
android:layout_gravity="center"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:text="question"
android:textAlignment="center"
android:textColor="@color/black"
android:textSize="18sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/image_desc"
app:layout_constraintVertical_bias="0.108" />
<TextView
android:id="@+id/mQuestion"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/eQuestion"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:text="translation"
android:textAlignment="center"
android:textColor="#3A3939"
android:textSize="15sp"
android:textStyle="italic"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/eQuestion"
app:layout_constraintVertical_bias="0.061" />
<Button
android:id="@+id/noBtn"
android:layout_width="170dp"
android:layout_height="47dp"
android:layout_marginStart="16dp"
android:text="No"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.004"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/mQuestion"
app:layout_constraintVertical_bias="0.69" />
<Button
android:id="@+id/yesBtn"
android:layout_width="170dp"
android:layout_height="47dp"
android:layout_marginEnd="16dp"
android:text="Yes"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/mQuestion"
app:layout_constraintVertical_bias="0.69" />
</androidx.constraintlayout.widget.ConstraintLayout>
2条答案
按热度按时间vwoqyblh1#
如何确保单击时只有当前页面中的按钮会改变颜色
因为viewpager2在下一页更改按钮的颜色时重用布局,所以按钮的颜色是您最后设置的颜色。所以在
onBindViewHolder
必须将按钮的颜色更改为默认值:如果你只是想改变点击按钮的颜色,当它点击你可以使用
StateListDrawable
作为背景xam8gpfp2#
所以我终于找到了答案。其实很简单。就像@mostafa3dmax说的。我必须设置默认颜色
onBindViewHolder
. 对于按钮颜色不重置后,改变页面,我只需要设置viewpager2.setoffscreenpagelimit(int值)
如文件所述:
即使页面在屏幕上不可见,也会创建并添加到视图层次结构中与当前页面不同的页面。超出此限制的页面将从视图层次结构中删除,但viewholders将像往常一样被recyclerview回收。