我目前使用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>
感谢您的帮助!
答案 0 :(得分:0)
您需要在holder.check1.setChecked(boolean)
中致电onBind
。请记住,每个视图都会多次调用onBind
。因此,当您滚动并且回收器视图正在回收时,它将重新使用您未指定是否选中它们的复选框。
另外,因为onBind
被频繁调用,所以最好不要在那里设置监听器。在视图持有者的构造函数中设置侦听器。
在侦听器存储中,如果选中或不存在该值。在您的案例workout
中,这通常存储在您正在显示的对象中。如果您没有该值,则可以使用SparseBooleanArray。跟踪被检查的内容非常有用。
有时其中一个字符串太大,这搞砸了整个事情
我不太清楚你的意思。但是看看你的xml,你做了很多事情,直到layout_alignParentTop
或layout_toLeftOf
。我敢打赌,一旦文字太大,那就错了。尝试将根布局更改为LinearLayout
或尝试尽可能多地删除这些规则。我打赌你会发现你的错误。