0

当我滚动回收视图,然后向后滚动项目互换,数据被交换。我有单独的子项目列表,没有特定的大小。多数情况下,当我向后滚动时,子项目有重复和/或子项目交换。我已经尝试将代码的动态部分移至oncreateviewholder,但这没有任何区别。Recyclerview滚动使项目更新

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

}

+1

在onBindViewHolder,每次您要创建一个列表,你应该创建它一次,然后就打电话联系上 – lelloman

+0

与@lelloman,新的ArrayList 同意(messages.keySet( ))应该放在构造函数 – anhtuannd

+0

中但是仍然存在相同的问题。 –

回答

1

这是因为ü没有约束力的新观点。在每个动态调用中创建一个新的。请在onBindViewHolder中执行你的操作。至于onCreateViewHolder,请保持干净并且只能膨胀视图。

+0

我曾尝试在onBindViewHolder中也做同样的事情,但也有同样的问题。 –

-1

试试这个:

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(); 
} 
} 
+0

我没有看到没有解释的负面投票。不要拒绝投票。 –