当Recyclerview滚动时更改项目

6

有人能解释一下我的问题吗?

当我向下滚动然后回到顶部时,我的项目已被列表中的其他项目更改,如果我再次滚动,则项目又会更改。

这是我的适配器。

public class AcademicAdapter extends RecyclerView.Adapter<AcademicAdapter.AcademicVH> {
    private LayoutInflater inflater;
    private List<AcademicStatus> data;

public AcademicAdapter(List<AcademicStatus> data) {
    this.data = data;
}

@Override
public AcademicVH onCreateViewHolder(ViewGroup parent, int viewType) {
    inflater = LayoutInflater.from(parent.getContext());
    View view = inflater.inflate(R.layout.row_academic_level, parent, false);

    return new AcademicVH(view);
}

@Override
public void onBindViewHolder(AcademicVH holder, int position) {
    View view = inflater.inflate(R.layout.row_container_academic_level, holder.containerData, false);

    TextView txtSubject = (TextView) view.findViewById(R.id.txtSubjectValue);
    TextView txtGroup = (TextView) view.findViewById(R.id.txtGroupValue);
    TextView txtStatus = (TextView) view.findViewById(R.id.txtStatusValue);
    TextView txtFinalNote = (TextView) view.findViewById(R.id.txtFinalNoteValue);
    TextView txtYear = (TextView) view.findViewById(R.id.txtYearValue);

    txtSubject.setText(data.get(position).getSubject());
    txtGroup.setText(data.get(position).getGroup());
    txtStatus.setText(data.get(position).getStatus());
    txtFinalNote.setText(data.get(position).getFinalNote());
    txtYear.setText(data.get(position).getAcademicYear());

    holder.containerData.addView(view);
}

@Override
public int getItemCount() {
    return data.size();
}

public static class AcademicVH extends RecyclerView.ViewHolder {
    private LinearLayout containerData;

    public AcademicVH(View itemView) {
        super(itemView);

        containerData = (LinearLayout) itemView.findViewById(R.id.containerData);
    }
}
}

2
onBindViewHolder 中应该重用 holder,而不是重新 inflate 一个新的。同时,将 findViewById 等视图操作移动到 AcademicVH 中。示例 - tianyu
请参考以下链接:http://www.androidhive.info/2016/01/android-working-with-recycler-view/ - Jigar
非常感谢您。 - Crash
尝试使用这个答案。在我的情况下,它有效。 - ch13mob
6个回答

9

尝试在RecyclerView.ViewHolder上初始化您的视图,并在onCreateViewHolder()中膨胀您的布局,不要在onBindViewHolder()中再次膨胀布局。

public class AcademicAdapter extends RecyclerView.Adapter<AcademicAdapter.AcademicVH> {
    private LayoutInflater inflater;
    private List<AcademicStatus> data;

public AcademicAdapter(List<AcademicStatus> data) {
    this.data = data;
}

@Override
public AcademicVH onCreateViewHolder(ViewGroup parent, int viewType) {

    View mView = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_academic_level, parent, false);
    AcademicVH mViewHold = new ViewHolder(mView);
    return mViewHold;
}

@Override
public void onBindViewHolder(AcademicVH holder, int position) {
     final AcademicStatus mItems=this.data.get(position);


    holder.txtSubject.setText(mItems.getSubject());
    holder.txtGroup.setText(mItems.getGroup());
    holder.txtStatus.setText(mItems.getStatus());
    holder.txtFinalNote.setText(mItems.getFinalNote());
    holder.txtYear.setText(mItems.getAcademicYear());

}

@Override
public int getItemCount() {
    return data.size();
}

public static class AcademicVH extends RecyclerView.ViewHolder {
    public LinearLayout containerData;
    public TextView txtSubject,txtGroup,txtStatus,txtFinalNote,txtYear;

    public AcademicVH(View itemView) {
        super(itemView);

        containerData = (LinearLayout) itemView.findViewById(R.id.containerData);
        txtSubject = (TextView) itemView.findViewById(R.id.txtSubjectValue);
        txtGroup = (TextView) itemView.findViewById(R.id.txtGroupValue);
        txtStatus = (TextView) itemView.findViewById(R.id.txtStatusValue);
        txtFinalNote = (TextView) itemView.findViewById(R.id.txtFinalNoteValue);
        txtYear = (TextView) itemView.findViewById(R.id.txtYearValue);
    }
}
}

8

了解RecyclerView中的乱序问题背后的概念

  @Override
  public void onBindViewHolder(final MyViewHolder holder, int position) {
      holder.setIsRecyclable(false);
  }

 @Override
 public long getItemId(int position) 
 {
        return position;
 }

 @Override
 public int getItemViewType(int position) 
 {
        return position;
 }

在您的适配器构造函数中添加setHasStableIds(true);并在适配器中覆盖这两个方法。

5
您把项目定义在错误的位置,应该在视图持有者内部定义您的视图,并按照以下方式进行操作。
public static class AcademicVH extends RecyclerView.ViewHolder {
private LinearLayout containerData;

public AcademicVH(View itemView) {
    super(itemView);
    TextView txtSubject = (TextView) view.findViewById(R.id.txtSubjectValue);
    TextView txtGroup = (TextView) view.findViewById(R.id.txtGroupValue);
    TextView txtStatus = (TextView) view.findViewById(R.id.txtStatusValue);
    TextView txtFinalNote = (TextView) view.findViewById(R.id.txtFinalNoteValue);
    TextView txtYear = (TextView) view.findViewById(R.id.txtYearValue);
    containerData = (LinearLayout) itemView.findViewById(R.id.containerData);
    }
}

另一个窍门是,当您在onBindViewHolder中使用条件(if)时,应该用(else)将其完整。


4
在您的onBindViewHolder中添加holder.setIsRecyclable(false);
@Override
public void onBindViewHolder(final MyViewHolder holder, final int position) {
    holder.setIsRecyclable(false);
}

2

只需在xml文件中将您的recylerView放入NestedScroll View中,并添加属性nestedScrollingEnabled = false。

在您的适配器 (adapter) 的onBindViewHolder中添加以下这行代码:

final AcademicVH viewHolder = (AcademicVH)holder;

使用此viewHolder对象与您的视图一起setText或执行任何类型的Click事件。

例如: viewHolder.txtSubject.setText("Example");


0

问题出在库 compile 'com.android.support:recyclerview-v7:25.0.0'。 尝试使用 compile 'com.android.support:recyclerview-v7:23.1.1'


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接