回收站视图 checkbox/text 问题
Recycler View checkbox/text issue
我当前使用 cardview 的回收站视图有 2 个问题。第一个是复选框。复选框似乎总是 check/uncheck 自己。我知道我需要设置 onCheckedChangeListener,只是不确定要放入什么。我的第二个问题是回收器 view/cardview 中的每个项目都有 4 个字符串和 1 个复选框,但有时其中一个字符串太大,这会搞砸整个事情。如果字符串太长,我有什么办法吗?可以让它使卡片视图更大,以便其中一个词位于第一个词的下方吗?
这是自定义对象class:
public class Workout{
private String exercise;
private String percent;
private String reps;
private String weight;
private boolean check1;
public Workout(String exercise, String percent, String reps, String weight, boolean check1) {
this.exercise = exercise;
this.percent = percent;
this.reps = reps;
this.weight = weight;
this.check1 = check1;
}
/* accessors omitted for readability */
}
这是适配器:
public class MyRecyclerAdapter extends RecyclerView.Adapter<MyViewHolder> {
Context mContext;
ArrayList<Workout> workout;
public MyRecyclerAdapter(Context context, ArrayList<Workout> workout) {
mContext = context;
this.workout = workout;
}
// INITIALIZE HOLDER
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.workout_item, null);
MyViewHolder holder = new MyViewHolder(view);
return holder;
}
//BIND DATA TO VIEWS
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
final Workout objWorkout = workout.get(position);
holder.exercise.setText(workout.get(position).getExercise());
holder.percent.setText(workout.get(position).getPercent());
holder.reps.setText(workout.get(position).getReps());
holder.weight.setText(workout.get(position).getWeight());
holder.check1.setOnCheckedChangeListener();
//LISTENER
holder.setItemClickListener(new ItemClickListener() {
@Override
public void onItemClick(View view, int pos) {
Toast.makeText(mContext, workout.get(pos).getExercise(),Toast.LENGTH_LONG).show();
}
});
}
@Override
public int getItemCount() {
return workout.size();
}
}
这是自定义项目的 xml:
<android.support.v7.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_width="wrap_content"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:layout_margin="10dp"
card_view:cardCornerRadius="10dp"
card_view:cardElevation="10dp" >
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingTop="15dp"
android:paddingLeft="15dp"
android:paddingRight="15dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall"
android:text="Squat"
android:textSize="20sp"
android:id="@+id/txtExercise"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall"
android:text="%"
android:textSize="20sp"
android:id="@+id/txtPercentage"
android:paddingLeft="30dp"
android:layout_alignParentTop="true"
android:layout_toRightOf="@+id/txtExercise"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall"
android:text="Reps"
android:textSize="20sp"
android:id="@+id/txtReps"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Weight"
android:textSize="20sp"
android:id="@+id/txtWeight"
android:layout_alignParentTop="true"
android:layout_toLeftOf="@+id/check1"
android:layout_toStartOf="@+id/check1"/>
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/check1"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_marginRight="31dp"
android:layout_marginEnd="31dp"
android:checked="false"/>
</RelativeLayout>
感谢您的帮助!
对于您的复选框问题:
您需要在 onBind
中调用 holder.check1.setChecked(boolean)
。请记住,每个视图都会多次调用 onBind
。因此,当您滚动时,回收器视图正在回收,它正在重复使用您未指定是否选中的复选框。
此外,由于 onBind
被频繁调用,所以最好不要在那里设置侦听器。在视图持有者的构造函数中设置监听器。
编辑
在您的侦听器中存储值(无论是否选中)。这通常存储在您正在显示的对象中,在您的情况下 workout
。如果你在那里没有值,你可以使用 SparseBooleanArray。它非常适合跟踪检查的内容和未检查的内容。
对于您的文本问题:
sometimes one of the strings is too large, which screws up the whole thing
我不太清楚你的意思。但是看看你的 xml 你做了很多事情 layout_alignParentTop
或 layout_toLeftOf
。我敢打赌,一旦一个文本太大,它们就会有问题。尝试将根布局更改为 LinearLayout
或尝试尽可能多地删除这些规则。我打赌你会在这样做时发现你的错误。
我当前使用 cardview 的回收站视图有 2 个问题。第一个是复选框。复选框似乎总是 check/uncheck 自己。我知道我需要设置 onCheckedChangeListener,只是不确定要放入什么。我的第二个问题是回收器 view/cardview 中的每个项目都有 4 个字符串和 1 个复选框,但有时其中一个字符串太大,这会搞砸整个事情。如果字符串太长,我有什么办法吗?可以让它使卡片视图更大,以便其中一个词位于第一个词的下方吗?
这是自定义对象class:
public class Workout{
private String exercise;
private String percent;
private String reps;
private String weight;
private boolean check1;
public Workout(String exercise, String percent, String reps, String weight, boolean check1) {
this.exercise = exercise;
this.percent = percent;
this.reps = reps;
this.weight = weight;
this.check1 = check1;
}
/* accessors omitted for readability */
}
这是适配器:
public class MyRecyclerAdapter extends RecyclerView.Adapter<MyViewHolder> {
Context mContext;
ArrayList<Workout> workout;
public MyRecyclerAdapter(Context context, ArrayList<Workout> workout) {
mContext = context;
this.workout = workout;
}
// INITIALIZE HOLDER
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.workout_item, null);
MyViewHolder holder = new MyViewHolder(view);
return holder;
}
//BIND DATA TO VIEWS
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
final Workout objWorkout = workout.get(position);
holder.exercise.setText(workout.get(position).getExercise());
holder.percent.setText(workout.get(position).getPercent());
holder.reps.setText(workout.get(position).getReps());
holder.weight.setText(workout.get(position).getWeight());
holder.check1.setOnCheckedChangeListener();
//LISTENER
holder.setItemClickListener(new ItemClickListener() {
@Override
public void onItemClick(View view, int pos) {
Toast.makeText(mContext, workout.get(pos).getExercise(),Toast.LENGTH_LONG).show();
}
});
}
@Override
public int getItemCount() {
return workout.size();
}
}
这是自定义项目的 xml:
<android.support.v7.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_width="wrap_content"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:layout_margin="10dp"
card_view:cardCornerRadius="10dp"
card_view:cardElevation="10dp" >
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingTop="15dp"
android:paddingLeft="15dp"
android:paddingRight="15dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall"
android:text="Squat"
android:textSize="20sp"
android:id="@+id/txtExercise"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall"
android:text="%"
android:textSize="20sp"
android:id="@+id/txtPercentage"
android:paddingLeft="30dp"
android:layout_alignParentTop="true"
android:layout_toRightOf="@+id/txtExercise"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall"
android:text="Reps"
android:textSize="20sp"
android:id="@+id/txtReps"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Weight"
android:textSize="20sp"
android:id="@+id/txtWeight"
android:layout_alignParentTop="true"
android:layout_toLeftOf="@+id/check1"
android:layout_toStartOf="@+id/check1"/>
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/check1"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_marginRight="31dp"
android:layout_marginEnd="31dp"
android:checked="false"/>
</RelativeLayout>
感谢您的帮助!
对于您的复选框问题:
您需要在 onBind
中调用 holder.check1.setChecked(boolean)
。请记住,每个视图都会多次调用 onBind
。因此,当您滚动时,回收器视图正在回收,它正在重复使用您未指定是否选中的复选框。
此外,由于 onBind
被频繁调用,所以最好不要在那里设置侦听器。在视图持有者的构造函数中设置监听器。
编辑
在您的侦听器中存储值(无论是否选中)。这通常存储在您正在显示的对象中,在您的情况下 workout
。如果你在那里没有值,你可以使用 SparseBooleanArray。它非常适合跟踪检查的内容和未检查的内容。
对于您的文本问题:
sometimes one of the strings is too large, which screws up the whole thing
我不太清楚你的意思。但是看看你的 xml 你做了很多事情 layout_alignParentTop
或 layout_toLeftOf
。我敢打赌,一旦一个文本太大,它们就会有问题。尝试将根布局更改为 LinearLayout
或尝试尽可能多地删除这些规则。我打赌你会在这样做时发现你的错误。