2016-10-25 2 views
0

Beim Scrollen RecyclerView die Daten innerhalb der TextView ändert sich, obwohl die Daten im Array logtime.get(i).getTime() nicht ändert.Es ändert sich nur, wenn wir die Daten in Textansicht platzieren, die dynamisch generiert.programmatisch Textansicht in Recyclerview onbindView Adapter

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

Antwort

0

Versuchen Sie, diese Zeile in Start von onbindViewHolder setzen.

holder.setIsRecycelable (false);

Oder Sie können Ihre TextView in XML-Datei setzen. In Onbinder muss keine dynamische Textansicht erstellt werden.

+0

Vielen Dank..dies funktioniert ... –

+0

Diese Lösung kann Speicherprobleme verursachen. Sie sollten XML für die Textansicht und andere Ansichten erstellen. Erstellen von View Inside OnBindViewHolder() wird nicht empfohlen. Wenn Sie wollen, gebe ich Ihnen einen Demo-Quellcode dafür. –

2

Ihr Entwurf ist völlig falsch. Sie erstellen neue TextView s bei jedem Anruf an onBindViewHolder() was bedeutet, wenn Sie scrollen zurück zu einer Ansicht eine neue Liste von TextView s sind erstellt, so jetzt haben Sie zwei Sätze von TextView s ein vom letzten Anruf und einer von jetzt (Keep Scrollen und es wird mehr extra TextViews beigefügt werden).

Erstellen neuer Ansichten sollte in onCreateViewHolder() erfolgen. Der Grund, warum Sie dieses Verhalten erhalten, könnte sein, weil RecyclerViewScrapped Views verwendet, was bedeutet, dass es die zuvor erstellten View s wiederverwendet. Dies verbessert die Performance (weil keine neuen Speicherzuweisungen erforderlich sind). Wenn Sie nach einem verschachtelten RecyclerView suchen, dann tun Sie das stattdessen.

+0

ja einverstanden. Dies kann zu Speicherverlusten oder anderen Leistungsproblemen führen. –

0

Sie können den folgenden Code in onBindViewHolder hinzufügen.

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); 
} 
Verwandte Themen