简体   繁体   中英

Recyclerview scrolling makes the items update

When I scroll the recycler view and then scroll back the items get interchanged, the data gets interchanged. I have individual items with arraylist of sub items with no specific size. More often than not, when I scroll back there is duplication of sub items and/or interchange of subitems. I have tried moving the dynamic part of the code to oncreateviewholder but that doesnt make any difference .

private LinkedHashMap<String, ArrayList<String>> messages;
private Context mContext;
int k =0;

public static class ViewHolder extends RecyclerView.ViewHolder {
    // each data item is just a string in this case
    public TextView mSmsSender;
    public LinearLayout smsContainer;


    public ViewHolder(View v) {
        super(v);
        mSmsSender = (TextView)v.findViewById(R.id.smsSender);
        smsContainer = (LinearLayout) v.findViewById(R.id.smsContainer);
    }
}

public SmsAdapter(LinkedHashMap<String, ArrayList<String>> messages, Context context){
    this.messages = messages;
    mContext = context;
}

@Override
public SmsAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    // create a new view
    View v = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.sms_message, parent, false);
    // set the view's size, margins, paddings and layout parameters
    ViewHolder vh = new ViewHolder(v);
    final String smsSender = (new ArrayList<String>(messages.keySet())).get(k);
    k++;
    ArrayList<String> sms = messages.get(smsSender);

    for(int i =0;i<sms.size();i++){
        TextView vt = new TextView(mContext);
        RelativeLayout.LayoutParams lp = new RelativeLayout.
                LayoutParams(LinearLayoutCompat.LayoutParams.WRAP_CONTENT,
                LinearLayoutCompat.LayoutParams.WRAP_CONTENT);

        vt.setLayoutParams(lp);
        vt.setPadding(3,3,3,3);
        vt.setText(sms.get(i));
        vh.smsContainer.addView(vt);
    }
    return vh;
}

@Override
public void onBindViewHolder(SmsAdapter.ViewHolder holder, int position) {

        final String smsSender = (new ArrayList<String>(messages.keySet())).get(position);
        holder.mSmsSender.setText(smsSender);

}

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

}

That is because u are not binding the new views. U r creating a new one in every dynamic call. Please carry out ur operations in onBindViewHolder. As for onCreateViewHolder, keep it clean and only inflate the view.

Try this :

private LinkedHashMap<String, ArrayList<String>> messages;
private Context mContext;


public static class ViewHolder extends RecyclerView.ViewHolder {
    // each data item is just a string in this case
    public TextView mSmsSender;
    public LinearLayout smsContainer;

    public ViewHolder(View v) {
        super(v);
        mSmsSender = (TextView)v.findViewById(R.id.smsSender);
        smsContainer = (LinearLayout) v.findViewById(R.id.smsContainer);
    }
}

public SmsAdapter(LinkedHashMap<String, ArrayList<String>> messages, Context context){
    this.messages = messages;
    mContext = context;
}

@Override
public SmsAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    // create a new view
    View v = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.sms_message, parent, false);
    // set the view's size, margins, paddings and layout parameters
    ViewHolder vh = new ViewHolder(v);

    return vh;
}

@Override
public void onBindViewHolder(SmsAdapter.ViewHolder holder, int position) {

        final String smsSender = (new ArrayList<String>(messages.keySet())).get(position);
        holder.mSmsSender.setText(smsSender);



    ArrayList<String> sms = messages.get(smsSender);

    for(int i =0;i<sms.size();i++){
        TextView vt = new TextView(mContext);
        RelativeLayout.LayoutParams lp = new RelativeLayout.
                LayoutParams(LinearLayoutCompat.LayoutParams.WRAP_CONTENT,
                LinearLayoutCompat.LayoutParams.WRAP_CONTENT);

        vt.setLayoutParams(lp);
        vt.setPadding(3,3,3,3);
        vt.setText(sms.get(i));
        vh.smsContainer.addView(vt);
    }

}

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM