Recycler View复选框/文本问题

时间:2016-08-03 21:10:35

标签: android android-recyclerview android-adapter android-cardview android-checkbox

我目前使用cardview的回收站视图遇到2个问题。第一个是复选框。复选框似乎一直在检查/取消选中。我知道我需要设置onCheckedChangeListener,只是不确定要放入什么。我的第二个问题是recycler view / cardview中的每个项目有4个字符串和1个复选框,但有时其中一个字符串太大,这搞砸了整个事情..如果字符串太长我有什么办法可以制作它会使cardview变大,所以其中一个单词会出现在第一个单词的下方吗?

这是自定义对象类:

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>

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

对于您的复选框问题:

您需要在holder.check1.setChecked(boolean)中致电onBind。请记住,每个视图都会多次调用onBind。因此,当您滚动并且回收器视图正在回收时,它将重新使用您未指定是否选中它们的复选框。

另外,因为onBind被频繁调用,所以最好不要在那里设置监听器。在视图持有者的构造函数中设置侦听器。

修改

在侦听器存储中,如果选中或不存在该值。在您的案例workout中,这通常存储在您正在显示的对象中。如果您没有该值,则可以使用SparseBooleanArray。跟踪被检查的内容非常有用。

为您的文字问题:

  

有时其中一个字符串太大,这搞砸了整个事情

我不太清楚你的意思。但是看看你的xml,你做了很多事情,直到layout_alignParentToplayout_toLeftOf。我敢打赌,一旦文字太大,那就错了。尝试将根布局更改为LinearLayout或尝试尽可能多地删除这些规则。我打赌你会发现你的错误。