2016-10-25 48 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); 
} 
相關問題