6

Can someone explain to me, what the problem is?

When I scroll down and then back to the top, my items were changed for other items in the list, and if I scroll again, the items again are changed.

This is my Adapter.

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);
    }
}
}
cokeman19
  • 2,405
  • 1
  • 25
  • 40
Crash
  • 338
  • 1
  • 2
  • 12
  • 2
    You should reuse `holder` in `onBindViewHolder` but not `inflate` a new one, and move view operations like `findViewById` to `AcademicVH`. [example](https://github.com/xdtianyu/CallerInfo/blob/master/app/src/main/java/org/xdty/callerinfo/view/CallerAdapter.java#L28) – tianyu Apr 14 '16 at 03:50
  • refer this link http://www.androidhive.info/2016/01/android-working-with-recycler-view/ – Jigar Apr 14 '16 at 03:52
  • Thank you so much. – Crash Apr 14 '16 at 04:02
  • Try [this](https://stackoverflow.com/a/38158122/5595925) answer. In my case it work. – ch13mob Nov 10 '17 at 12:22

6 Answers6

9

Try to initialize your view on RecyclerView.ViewHolder and inflate your layout on onCreateViewHolder() and don't inflate again the layout in 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);
    }
}
}
Iharob Al Asimi
  • 52,653
  • 6
  • 59
  • 97
itsa04g9
  • 348
  • 1
  • 10
8

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

Add setHasStableIds(true); in your adapter constructor and Override these two methodes in adapter.

Keshav Gera
  • 10,807
  • 1
  • 75
  • 53
5

you define your item in wrong place, define your View inside of view holder and like below

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

another trick, when you use condition (if) in your onBindViewHolder, you should complete it with (else).

Ashkan
  • 1,357
  • 4
  • 16
  • 37
4

Add holder.setIsRecyclable(false); in your onBindViewHolder

@Override
public void onBindViewHolder(final MyViewHolder holder, final int position) {
    holder.setIsRecyclable(false);
}
slfan
  • 8,950
  • 115
  • 65
  • 78
2

Just put you recylerView in a NestedScroll View in your xml and add the property nestedScrollingEnabled = false.

And on your adapter onBindViewHolder add this line

final AcademicVH viewHolder = (AcademicVH)holder;

Use this viewHolder object with your views to setText or do any kind of Click events.

e.g viewHolder.txtSubject.setText("Example");

0

Problem is with library compile 'com.android.support:recyclerview-v7:25.0.0'. Try to use compile 'com.android.support:recyclerview-v7:23.1.1'.

RITZ XAVI
  • 3,633
  • 1
  • 25
  • 35
HUNTER
  • 1
  • 2