2016-10-25 50 views
0

在滚动RecyclerView时,即使logtime.get(i).getTime()数组中的数据没有变化,TextView中的数据也会发生变化。仅当我们将数据放入动态生成的textview中时才会更改。以编程方式在recyclerview内添加textview onbindView适配器

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

尝试将此行放入onbindViewHolder开头。

holder.setIsRecyclable(false);或者,您可以将TextView放入XML文件中。没有必要在Onbinder中创建动态文本视图。

+0

谢谢..这个工程... –

+0

此解决方案可能会导致内存问题。您应该为文本视图和其他视图创建XML。创建视图不建议在OnBindViewHolder()内部。如果你想,我给你演示这个源代码。 –

2

您的设计完全错误。您每次致电onBindViewHolder()时都会创建新的TextView s,这意味着当您滚动回到视图时,会创建一个新的TextView s列表,因此现在您有两组来自上次呼叫的一组TextView s和一个从现在开始的滚动,并会有更多额外的TextViews附加)。

创建新视图应该在onCreateViewHolder()中完成。您得到此行为的原因可能是因为RecyclerView使用Scrapped Views,这意味着它会重新使用前面创建的View。从而提高性能(因为不需要新的内存分配)。如果您正在寻找一个嵌套RecyclerView,那么做。

+0

是的同意。这可能会导致内存泄漏或其他性能问题。 –

0

您可以在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); 
} 
相关问题