2016-03-05 18 views
0

我編寫了我自己的ListView BaseAdapter。我有一個ArrayList與23個主題。前七個來自實例遊戲,而另外16個來自實例表。但是如果我運行ListView,我只能得到前七項。如果我不重用convertview(... if(convertview == null || true){...)我得到每23項。有沒有問題時沒有reuising項目?Android ListView - ArrayList只有23個使用了7個項目 - 爲什麼?

package k0f.de.americanfootball; 

import android.content.Context; 
import android.support.v4.content.ContextCompat; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.TextView; 

import java.util.ArrayList; 

/** 
* Created by benjaminbecker on 26.02.16. 
*/ 
public class AmericanFootballAdapter extends BaseAdapter { 

    private final LayoutInflater inflator; 
    private ArrayList<Object> arrayList = new ArrayList<Object>(); 

    public AmericanFootballAdapter(Context context) { 
     inflator = LayoutInflater.from(context); 
    } 

    public void setNewDataGames(ArrayList<Object> arrayList){ 
     this.arrayList=arrayList; 
    } 

    @Override 
    public int getViewTypeCount() { 
     return 2; 
    } 

    @Override 
    public int getCount() { 
     return arrayList.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return arrayList.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder; 
     Context context = parent.getContext(); 

     // falls nötig, convertView bauen 
     // Holder bereits vorhanden 
     if (convertView == null) { 

      // Layoutdatei entfalten 
      if((position%2)==0){ 
       convertView = inflator.inflate(R.layout.listitem_game, parent, 
         false); 
      }else{ 
       convertView = inflator.inflate(R.layout.listitem_table, parent, 
         false); 
      } 

      // Holder erzeugen 
      holder = new ViewHolder(); 

      Object ob = getItem(position); 

      if(ob instanceof AmericanFootballDataGames){ 
       holder = holderGames(holder, convertView, context, (AmericanFootballDataGames) ob); 
       convertView.setTag(holder); 
      } 

      if(ob instanceof AmericanFootballDataTable){ 
       holder = holderTable(holder, convertView, context, (AmericanFootballDataTable) ob); 
       convertView.setTag(holder); 
      } 

     } else { 
      Log.v("Ben","HolderGame"); 
      holder = (ViewHolder) convertView.getTag(); 
      convertView.setTag(holder); 
     } /*else { 
      Log.v("Ben","HolderTable"); 
      holderG = (ViewHolderGame) convertView.getTag(); 
      convertView.setTag(holderG); 
     } 
*/ 
     return convertView; 
    } 

    static class ViewHolder { 
     TextView tv1, tv2, tv3; 
    } 

    private ViewHolder holderGames(ViewHolder holder, View convertView, Context context, AmericanFootballDataGames afdg){ 
     String erg = afdg.getTdheim() + " : " + 
       afdg.getTdgast() + " (" + 
       afdg.getQ1heim() + " : " + 
       afdg.getQ1gast() + " , " + 
       afdg.getQ2heim() + " : " + 
       afdg.getQ2gast() + " , " + 
       afdg.getQ3heim() + " : " + 
       afdg.getQ3gast() + " , " + 
       afdg.getQ4heim() + " : " + 
       afdg.getQ4gast() + ")"; 

     holder.tv2 = (TextView) convertView.findViewById(R.id.game); 
     holder.tv3 = (TextView) convertView.findViewById(R.id.erg); 
     holder.tv1 = (TextView) convertView.findViewById(R.id.date); 

     holder.tv1.setText(afdg.getAnstoss()+System.getProperty("line.separator")+afdg.getDatum()); 
     holder.tv2.setText(afdg.getHeim() + System.getProperty("line.separator") + afdg.getGast()); 
     holder.tv3.setText(erg); 

     if(afdg.getTdheim().toString()=="?") { 
      holder.tv3.setTextColor(ContextCompat.getColor(context, R.color.colorListHalfLight)); 
     }else{ 
      holder.tv3.setTextAppearance(context, android.R.style.TextAppearance_Medium); 
      holder.tv3.setTextColor(ContextCompat.getColor(context, R.color.colorListHalfDark)); 
     } 

     return holder; 
    } 

    private ViewHolder holderTable(ViewHolder holder, View convertView, Context context, AmericanFootballDataTable afdt){ 
     holder.tv2 = (TextView) convertView.findViewById(R.id.game); 
     holder.tv3 = (TextView) convertView.findViewById(R.id.erg); 
     holder.tv1 = (TextView) convertView.findViewById(R.id.date); 
     holder.tv1.setText(Integer.toString(afdt.getPlatz())); 
     holder.tv2.setText(afdt.getMannschaft()); 
     holder.tv3.setText(afdt.getPplus()+" "+afdt.getPminus()); 
     return holder; 
    } 
} 

這是有和沒有表格數據的屏幕。

Without table data With table data

回答

1

你覆蓋getViewTypeCount()返回2,它說,該適配器可以處理兩種不同的意見。如果你這樣做,你也必須覆蓋getItemViewType()返回一個int值,指出哪個視圖類型在給定的位置。然後,您需要在getView()中爲該位置填充正確的視圖,以便該視圖可以正確回收並由ListView重新用於該類型的其他項目。

+0

謝謝你的回答。是的,嘗試了這一點,並忘記刪除線。如果沒有這個參數,ArrayList中的所有對象都不會顯示出來。 – baeckerman83

0

發現我的錯誤。必須在返回convertView之前設置持有者上的文本;而不是在複雜的情況下。

相關問題