android - 以编程方式生成 recyclerview 项目时重复查看和数据
问题描述
我创建了 recyclerView 和它的适配器。在适配器中,取决于我传递给它的类,行项会自动生成。
这是回收站视图项目`add_row_item:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="4dp"
android:orientation="horizontal">
</LinearLayout>
这是一个主要布局:
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
</data>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:background="@color/md_indigo_50">
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view_item"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scrollbars="vertical">
</android.support.v7.widget.RecyclerView>
<Button
android:id="@+id/save_to_grid"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/recycler_view_item"
android:layout_centerHorizontal="true"
android:layout_margin="10dp"
android:background="@drawable/bg_round"
android:padding="5dp"
android:text="ذخیره"
android:textColor="#424242"
android:visibility="visible" />
</RelativeLayout>
</layout>
这是适配器:
public class RevisitGridAdapter extends RecyclerView.Adapter<RevisitGridAdapter.GridHolder> {
private List<DataGridColumn> column;
public RevisitGridAdapter(List<DataGridColumn> column) {
this.column = column;
}
public int dip2pix(@NonNull Context context, int dip) {
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dip,
context.getResources().getDisplayMetrics());
}
@NonNull
@Override
public GridHolder onCreateViewHolder(@NonNull ViewGroup parent, int i) {
Context context = parent.getContext();
View root = LayoutInflater.from(context).inflate(R.layout.add_row_item, parent, false);
return new GridHolder(root);
}
@Override
public void onBindViewHolder(@NonNull GridHolder holder, int position) {
holder.setPosition(holder, position);
}
@Override
public int getItemCount() {
return column.size();
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getItemViewType(int position) {
return position;
}
class GridHolder extends RecyclerView.ViewHolder {
private TextView tv;
private LinearLayout parent;
public GridHolder(@NonNull View itemView) {
super(itemView);
parent = (LinearLayout) itemView;
}
public void setPosition(GridHolder holder, int position) {
if (!column.get(position).getName().startsWith("CI")) { // todo add EUM
EditText edt = createEditText();
holder.parent.addView(edt);
tv = createTextView();
tv.setText(column.get(position).getHeader());
holder.parent.addView(tv);
} else {
holder.parent.addView(createSpinner());
tv = createTextView();
tv.setText(column.get(position).getHeader());
holder.parent.addView(tv);
}
}
private Spinner createSpinner() {
final Spinner sp = new Spinner(itemView.getContext());
int padding = (int) itemView.getContext().getResources().getDimension(R.dimen.elevation_header);
final LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(0,
LinearLayout.LayoutParams.WRAP_CONTENT, 1.0f);
// layoutParams.setMargins(padding, padding, padding, padding);
sp.setPadding(padding, padding, padding, padding);
sp.setLayoutParams(layoutParams);
return sp;
}
private TextView createTextView() {
final LinearLayout.LayoutParams lparams = new LinearLayout.LayoutParams(dip2pix(itemView.getContext(), 120), LinearLayout.LayoutParams.WRAP_CONTENT);
final TextView textView = new TextView(itemView.getContext());
textView.setLayoutParams(lparams);
return textView;
}
private EditText createEditText() {
final LinearLayout.LayoutParams lparams = new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.WRAP_CONTENT, 1.0f);
final EditText editText = new EditText(itemView.getContext());
editText.setLayoutParams(lparams);
ViewCompat.setBackground(editText,
ContextCompat.getDrawable(itemView.getContext(), com.safarayaneh.map.R.drawable.bg_round));
editText.getBackground().setColorFilter(ContextCompat.getColor(itemView.getContext(),
com.safarayaneh.map.R.color.md_indigo_100), PorterDuff.Mode.SRC_ATOP);
return editText;
}
}
}
当我运行应用程序并且当数据足以在一页中查看时,每个人都认为没问题,但数据超过一页中显示的数据意味着当我滚动页面时出现问题!
问题是当我第一次滚动到 recyclerview 的末尾时一切正常,但是当我滚动到 recyclerview 的第一页时,视图和数据重复重复,并且 recycler 视图完全混乱,如下图所示:
正如您在我的图片数据和视图中看到的那样,图像顶部重复并退出 2 列形状。我的错误是什么?
解决方案
您使用onCreateViewHolder()
错误onBindViewHolder()
。onCreateViewHolder 应该用于创建列表项,onBindViewHolder 应该只用于用数据填充已经创建的视图。原因是,由 onCreateViewHolder 创建的视图被重复用于显示不同项目的数据(因此命名为 RecyclerView)。如果需要为不同类型的数据创建不同类型的视图,则需要实现getItemViewType()
. 然后流程是这样的:
首先,调用您的 getItemViewType() 方法,并根据给定的位置返回所需的类型。如果已经有该类型的视图,可以重用,您的 onBindViewHolder() 方法会直接使用该视图和位置调用。否则,将调用您的 onCreateViewHolder() 方法并创建该类型所需的视图的新实例。之后,再次使用创建的视图和位置调用 onBindViewHolder()。
所以,重复我自己 - onCreateViewHolder() 用于创建视图,onBindViewHolder() 用于将数据(即设置文本等)绑定到已创建的视图。
推荐阅读
- c# - 启动时启动程序时出现拒绝访问错误(C#)
- delphi - Delphi 7 stringGrid第一行内容
- javascript - 使用 Tensorflow JS 执行 mobilenet v2 进行对象检测
- html - 如何在 CSS 网格中动态地流动这些盒子?
- r - 如何获取R中两个表中都不存在的所有行?
- r - 用R中的部分文件名替换主题ID
- java-stream - Kstream 消费者总是重新平衡
- node.js - Dockerizing Sequelize 和 Postgres 不起作用
- roblox - Roblox 克隆的部分不会在随机位置生成
- regex - 如何通过 LibreOffice 的 Calc 中的正则表达式语句捕获公司名称