1

我有一個listview,裏面有幾個listitems有spinners(其餘都有複選框)。問題是,每次我撥打spinner.setAdapter(ArrayAdapter);時,列表視圖都會停頓。如果我在getView()中註釋掉該行,則列表視圖可以很好地順利進行,因爲您可以問。使用該行,listview每次遇到新列表時都會出現口吃。Android,爲Spinner設置適配器時出現口吃

我試過一些東西來幫助這個。起初,我認爲這可能是從R.array.somestringarray拉字符串數組的操作,所以我將這些字符串數組加載到另一個數組中,以便在需要之前將它們存儲在內存中。這沒有用。那麼我認爲這是實際創建適配器,因爲我當時的代碼看起來像

ArrayAdapter<String> spinAdapter = new ArrayAdapter<String>(ScoreCounter.this,android.R.layout.simple_spinner_dropdown_item, forAdapter); 
    holder.spin.setAdapter(spinAdapter); 

所以我創建的所有創建的所有ArrayAdapters事先並堅持他們在一個數組,所以我的代碼看起來像這樣:

holder.spin.setAdapter(masterSpinAdapter[position]); 

那還是口吃。看起來設置ArrayAdapter的簡單行爲會導致listview滯後。這裏是我的整個getView():

@Override 
    public View getView(int position, View convertView, ViewGroup parent){ 
     if(convertView==null){ 
      LayoutInflater inflator = ScoreCounter.this.getLayoutInflater(); 
      convertView = inflator.inflate(R.layout.spinner_item , parent, false); 

      ViewHolder holder = new ViewHolder(); 
      holder.cbox = (CheckBox)convertView.findViewById(R.id.scoreCheck); 
      holder.spin = (Spinner)convertView.findViewById(R.id.scoreSpinner); 
      holder.missionTitle = (TextView)convertView.findViewById(R.id.missionTitle); 
      holder.missionDescription = (TextView) convertView.findViewById(R.id.missionDescription); 
      holder.checkListen = new checkListener(); 
      holder.itemListen = new itemListener(); 

      convertView.setTag(holder); 
     } 

     ViewHolder holder = (ViewHolder)convertView.getTag(); 

     if(position==1||position==2||position==5||position==6||position==13||position==15){ 
      holder.spin.setVisibility(0x00000004); 
      holder.spin.setEnabled(false); 
      holder.cbox.setVisibility(0); 
      holder.cbox.setEnabled(true); 

      holder.cbox.setChecked(shouldBeChecked[position]); 

      holder.checkListen.setRow(position); 

      holder.cbox.setOnClickListener(holder.checkListen); 
     }else{ 
      holder.spin.setVisibility(0); 
      holder.spin.setEnabled(true); 
      holder.cbox.setVisibility(0x00000004); 
      holder.cbox.setEnabled(false); 
      holder.spin.setAdapter((ArrayAdapter)masterSpinAdapter[position]); 

      holder.itemListen.setRosPos(position); 

      holder.spin.setOnItemSelectedListener(holder.itemListen); 
      holder.spin.setSelection(spinnerPosition[position]); 
     } 
     holder.missionTitle.setText(missions[position]); 
     holder.missionDescription.setText(descriptions[position]); 

     return convertView; 
    } 

我絕對不會在列表視圖的專家,所以我原本以爲我可能已經在getView做得太多邏輯。然而,如果我只是註釋掉holder.spin.setAdapter(args),那麼listview對於一堆無用的spinners來說是非常順利的。我以前在列表視圖中看過紡紗工。我能做些什麼來防止滾動時出現口吃?我想過使用適配器預設預先創建每個微調器,但我不知道如何將預先創建的微調器對象綁定到視圖ID。

我很想聽聽這方面的一些建議。

回答

0

經過大量測試後,我發現android設置的適配器比很多短的適配器要慢很多。我有一個數字爲-12到36的微調器,它的加載速度比3個項目中總共30個字符的微調器要快得多(不是我所期望的)。我最終只是移動到短列表的按鈕,每個項目更多的字符。不幸的是,我希望我知道爲什麼

相關問題