Android: 如何解决 CardViews 的视图在 RecyclerView 中滚动?
Android: how to fix CardViews' views scrolling in RecyclerView?
我加载了一个带有 CardView 的 RecyclerView,其中填充了一些 SQLite 数据和一个复选框。初始 UI 屏幕与 CardViews 一起看起来不错:
然后我开始向下滚动,许多 CardView 消失,UI 屏幕只显示一个 CardView。如果我进一步滚动,则整个屏幕会显示另一个 CardView,而不是我预期的许多 CardView:
我在这里错过了什么?
DataModel.java file
public class DataModel implements Serializable {
private static final long serialVersionUID = 1L;
private String todo;
private String note1;
private boolean isSelected;
public DataModel() {
}
public DataModel(String todo, String note1) {
this.todo = todo;
this.note1 = note1;
isSelected = false;
}
public DataModel(String todo, String note1, boolean isSelected) {
this.todo = todo;
this.note1 = note1;
this.isSelected = isSelected;
}
public String getTodo() {
return todo;
}
public void setTodo(String todo) {
this.todo = todo;
}
public String getNote1() {
return note1;
}
public void setNote1(String note1) {
this.note1 = note1;
}
public boolean isSelected() {
return isSelected;
}
public void setSelected(boolean isSelected) {
this.isSelected = isSelected;
}
}
ListAdapter.java file
public class ListAdapter extends RecyclerView.Adapter<ListAdapter.ListViewHolder> {
List<DataModel> dbList = new ArrayList<>();
Context context;
LayoutInflater mLayoutInflater;
public ListAdapter(Context context, List<DataModel> dbList) {
this.context = context;
this.dbList = dbList;
mLayoutInflater = LayoutInflater.from(context);
}
@Override
public ListViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = mLayoutInflater.inflate(R.layout.singlecard_layout, parent, false);
return new ListViewHolder(itemView);
}
public class ListViewHolder extends RecyclerView.ViewHolder {
TextView cardBlankText2;
TextView cardBlankText3;
CheckBox chkSelected;
public ListViewHolder(View itemView) {
super(itemView);
cardBlankText2 = (TextView)itemView.findViewById(R.id.cardBlankText2);
cardBlankText3 = (TextView)itemView.findViewById(R.id.cardBlankText3);
chkSelected = (CheckBox) itemView.findViewById(R.id.chkSelected);
}
}
@Override
public int getItemCount() {
return dbList.size();
}
@Override
public void onBindViewHolder(final ListViewHolder holder, final int position) {
holder.cardBlankText2.setText(dbList.get(position).getTodo());
holder.cardBlankText3.setText(dbList.get(position).getNote1());
holder.chkSelected.setChecked(dbList.get(position).isSelected());
holder.chkSelected.setTag(dbList.get(position));
holder.chkSelected.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
CheckBox cb = (CheckBox) v;
DataModel rowItem = (DataModel) cb.getTag();
// rowItem.setSelected(cb.isChecked());
dbList.get(position).setSelected(cb.isChecked());
}
});
}
}
没有代码我们无法帮助您,但让我假设,您正在使用 RecyclerView
支持 wrap_content
的新支持 Library
,在您的情况下,您的布局列表项高度设置为 match_parent
尝试将 cardview
父级 layout height
替换为 wrap_content
我加载了一个带有 CardView 的 RecyclerView,其中填充了一些 SQLite 数据和一个复选框。初始 UI 屏幕与 CardViews 一起看起来不错:
然后我开始向下滚动,许多 CardView 消失,UI 屏幕只显示一个 CardView。如果我进一步滚动,则整个屏幕会显示另一个 CardView,而不是我预期的许多 CardView:
我在这里错过了什么?
DataModel.java file
public class DataModel implements Serializable {
private static final long serialVersionUID = 1L;
private String todo;
private String note1;
private boolean isSelected;
public DataModel() {
}
public DataModel(String todo, String note1) {
this.todo = todo;
this.note1 = note1;
isSelected = false;
}
public DataModel(String todo, String note1, boolean isSelected) {
this.todo = todo;
this.note1 = note1;
this.isSelected = isSelected;
}
public String getTodo() {
return todo;
}
public void setTodo(String todo) {
this.todo = todo;
}
public String getNote1() {
return note1;
}
public void setNote1(String note1) {
this.note1 = note1;
}
public boolean isSelected() {
return isSelected;
}
public void setSelected(boolean isSelected) {
this.isSelected = isSelected;
}
}
ListAdapter.java file
public class ListAdapter extends RecyclerView.Adapter<ListAdapter.ListViewHolder> {
List<DataModel> dbList = new ArrayList<>();
Context context;
LayoutInflater mLayoutInflater;
public ListAdapter(Context context, List<DataModel> dbList) {
this.context = context;
this.dbList = dbList;
mLayoutInflater = LayoutInflater.from(context);
}
@Override
public ListViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = mLayoutInflater.inflate(R.layout.singlecard_layout, parent, false);
return new ListViewHolder(itemView);
}
public class ListViewHolder extends RecyclerView.ViewHolder {
TextView cardBlankText2;
TextView cardBlankText3;
CheckBox chkSelected;
public ListViewHolder(View itemView) {
super(itemView);
cardBlankText2 = (TextView)itemView.findViewById(R.id.cardBlankText2);
cardBlankText3 = (TextView)itemView.findViewById(R.id.cardBlankText3);
chkSelected = (CheckBox) itemView.findViewById(R.id.chkSelected);
}
}
@Override
public int getItemCount() {
return dbList.size();
}
@Override
public void onBindViewHolder(final ListViewHolder holder, final int position) {
holder.cardBlankText2.setText(dbList.get(position).getTodo());
holder.cardBlankText3.setText(dbList.get(position).getNote1());
holder.chkSelected.setChecked(dbList.get(position).isSelected());
holder.chkSelected.setTag(dbList.get(position));
holder.chkSelected.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
CheckBox cb = (CheckBox) v;
DataModel rowItem = (DataModel) cb.getTag();
// rowItem.setSelected(cb.isChecked());
dbList.get(position).setSelected(cb.isChecked());
}
});
}
}
没有代码我们无法帮助您,但让我假设,您正在使用 RecyclerView
支持 wrap_content
的新支持 Library
,在您的情况下,您的布局列表项高度设置为 match_parent
尝试将 cardview
父级 layout height
替换为 wrap_content