即使数组RecyclerView
中的数据没有更改,滚动TextView
logtime.get(i).getTime()
内的数据也会发生更改。仅当我们将数据放入正在生成的textview中时才会更改动态。
public void onBindViewHolder(PunchCardViewHolder holder, int position) {
PunchCardReport punchCardReport = punchCardReports.get(position);
holder.sNumber.setText(punchCardReport.getmSNumber());
holder.logDate.setText(punchCardReport.getmLogDate());
StringTokenizer stringTokenizer = new StringTokenizer(punchCardReport.getmLogTime(), ",");
List<LogTime> logtime = punchCardReport.getmLogTimeList();
for (int i = 0; i < logtime.size(); i++) {
Log.d(TAG, "onBindViewHolder: "+logtime.get(i).getTime());
}
LinearLayout.LayoutParams dim = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
for (int i = 0; i < logtime.size(); i++) {
TextView textView=new TextView(mContext);
textView.setLayoutParams(dim);
textView.setText(logtime.get(i).getTime());//the problem is here when we put data inside textview
holder.logTime.addView(textView);
}
}
@Override
public int getItemCount () {
return punchCardReports.size();
}
答案 0 :(得分:2)
你的设计完全错了。您在每次调用TextView
时都会创建新的onBindViewHolder()
,这意味着当您滚动回到视图时,会创建一个新的TextView
列表,所以现在你有两组TextView
一个来自最后一个电话,一个来自现在(继续滚动,还会有更多额外的TextViews
。)
应在onCreateViewHolder()
中创建新视图。您获得此行为的原因可能是RecyclerView
使用Scrapped Views
,这意味着它会重复使用之前创建的View
。从而提高性能(因为不需要新的内存分配)。如果您正在寻找嵌套RecyclerView
,请改为使用。
答案 1 :(得分:1)
您可以在onBindViewHolder中添加以下代码。
if(holder.logTime.getChildCount()>0){
holder.logTime.removeAllViews();
}
for (int i = 0; i < logtime.size(); i++) {
TextView textView=new TextView(mContext);
textView.setLayoutParams(dim);
textView.setText(logtime.get(i).getTime());
//the problem is here when we put data inside textview
holder.logTime.addView(textView);
}
答案 2 :(得分:0)
尝试将此行放在onbindViewHolder的开头。
holder.setIsRecyclable(假);
或者,您可以将TextView放在XML文件中。无需在Onbinder中创建动态文本视图。
答案 3 :(得分:0)
您只需添加holder.setIsRecyclable(false);适配器中的onBindViewHolder内部方法