2013-09-24 6 views
2

Я пытаюсь заполнить GridView из макета своей работы в Android, используя пользовательский ArrayAdapter, в котором я переопределил getView(). Когда я запускаю приложение, GridView появляется на экране, но полностью пуст. Я пришел к выводу, что проблема в том, что getView() никогда не вызывается. Я проверил, чтобы ArrayList не был пустым. Я использовал несколько операторов журналов (аналогично System.out.print() для тех, кто не знаком с программированием на Android), и обнаружил, что мой ArrayList, переданный в адаптер, не был пустым, однако метод getCount() моего адаптера всегда возвращал 0. Я попытался просмотреть какой-то исходный код Android, чтобы найти, когда getView() должен быть вызван, что привело к getView() и mObjects. Все это кажется довольно прямым, и я не нашел ничего плохого. Запрещая какое-то анти-чудодейственное объяснение, до сих пор я опустел (вероятно, из-за того, что я был программистом-любителем). Любая помощь будет принята с благодарностью.ArrayAdapter getView() не называется

файл Активность:

import java.util.ArrayList; 

import android.os.Bundle; 
import android.support.v4.app.FragmentActivity; 
import android.util.Log; 
import android.view.*; 
import android.widget.*; 

public class LevelMapActivity extends FragmentActivity implements View.OnClickListener{ 

    public final int TOTAL_LEVELS = 12;//TODO Set TOTAL_LEVELS to figure out how many levels exist. 
    public final int COLUMNS = 5; 

    GridView grid; 
LevelSelectorAdapter adapter; 
ArrayList<LevelSelector> levels; 

@Override 
public void onCreate(Bundle savedInstanceState){ 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_level_map); 

    grid = (GridView)findViewById(R.id.GridView_LevelMap); 
    grid.setNumColumns(COLUMNS); 

    levels = new ArrayList<LevelSelector>(); 

    for(int i=0; i<TOTAL_LEVELS/5; i++){ 
     for(int j=0; j<5; j++){ 
      LevelSelector levelSelector = new LevelSelector(this, i*COLUMNS+j+1); 
      levels.add((i*COLUMNS)+j, levelSelector); 
     } 
    } 
    for(int j=0; j<TOTAL_LEVELS%5; j++){ 
     LevelSelector levelSelector = new LevelSelector(this, TOTAL_LEVELS-(COLUMNS-1)+j); 
     levels.add(j+TOTAL_LEVELS-COLUMNS, levelSelector); 
    } 

    adapter = new LevelSelectorAdapter(this, R.layout.level_selector, levels); 
    grid.setAdapter(adapter); 

}//ends onCreate() 

@Override 
public void onPause(){ 

    // TODO Auto-generated method stub 
    super.onPause(); 

}//ends onPause() 

@Override 
public void onClick(View view){ 

    // TODO Auto-generated method stub 

}//ends onClick() 

}//ends Class 

файл адаптера:

import java.util.ArrayList; 

import android.content.Context; 
import android.util.Log; 
import android.view.*; 
import android.widget.*; 

public class LevelSelectorAdapter extends ArrayAdapter<LevelSelector>{ 

Context context; 
int resource; 
ArrayList<LevelSelector> levelSelectors; 

public LevelSelectorAdapter(Context context, int resource, ArrayList<LevelSelector> levelSelectors){ 

    super(context, resource); 
    this.context = context; 
    this.resource = resource; 
    this.levelSelectors = levelSelectors; 

}//ends LevelSelectorAdapter() 

public static class ViewHolder{ 
    public TextView level; 
    public TextView time; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent){ 

    View view = convertView; 
    ViewHolder holder; 

    if(view == null){ 
     LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     view = inflater.inflate(resource, null); 
     holder = new ViewHolder(); 
     holder.level = (TextView)view.findViewById(R.id.TextView_LevelSelector_Level); 
     holder.time = (TextView)view.findViewById(R.id.TextView_LevelSelector_Time); 
     view.setTag(holder); 
    } 
    else{ 
     holder = (ViewHolder)view.getTag(); 
    } 

    final LevelSelector levelSelector = levelSelectors.get(position); 
    if(levelSelector != null){ 
     holder.level.setText(Integer.toString(levelSelector.getLevel())); 
     holder.time.setText(Integer.toString(levelSelector.getTime())); 
    } 

    return view; 

}//ends getView() 

}//ends Class 

ответ

2

Из-за одной из пути я экспериментировал с адаптером, чтобы попытаться переопределить метод getView(), у меня не было ранее никакой потребности массив передается адаптеру в его конструкторе.
Передача массива в супер-конструктор вызывает его запуск и, следовательно, его использование в методе getCount(). Вот почему getCount() каждый раз выходил в 0, хотя массив не был пустым.

Смежные вопросы