回收站视图 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_alignParentToplayout_toLeftOf。我敢打赌,一旦一个文本太大,它们就会有问题。尝试将根布局更改为 LinearLayout 或尝试尽可能多地删除这些规则。我打赌你会在这样做时发现你的错误。