【问题标题】:Recyclerview changing items when is scrolled滚动时Recyclerview更改项目
【发布时间】:2016-04-14 03:40:13
【问题描述】:

谁能给我解释一下,问题是什么?

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

这是我的适配器。

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);
    }
}
}

【问题讨论】:

标签: android android-recyclerview


【解决方案1】:

尝试在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);
    }
}
}

【讨论】:

    【解决方案2】:

    Recyclerview shuffling issue understanding of the concept behind

      @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);在您的适配器构造函数中并覆盖这两个 适配器中的方法。

    【讨论】:

      【解决方案3】:

      您在错误的位置定义了您的项目,在 view holder 中定义您的视图,如下所示

      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);
        }
        

        【讨论】:

          【解决方案5】:

          只需将 recylerView 放在 xml 中的 NestedScroll 视图中,然后添加属性 nestedScrollingEnabled = false。

          然后在你的适配器 onBindViewHolder 添加这一行

          final AcademicVH viewHolder = (AcademicVH)holder;

          将此 viewHolder 对象与您的视图一起使用以设置文本或执行任何类型的 Click 事件。

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

          【讨论】:

            【解决方案6】:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2022-01-01
              • 2015-11-10
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-03-20
              • 1970-01-01
              相关资源
              最近更新 更多