[英]Android BaseAdapter method getItem is always called with position equals 0
My GridView should contains of 7 elements by in result I see only one (the last of data ArrayList). 我的GridView应该包含7个元素,结果我只能看到一个(数据ArrayList的最后一个)。
LevelsAdapter extends BaseAdapter: LevelsAdapter扩展了BaseAdapter:
private TextView star;
private TextView label;
private TextView percent;
Typeface font;
private ArrayList<Level> levels;
LayoutInflater inflater;
public LevelsAdapter(Activity context, ArrayList<Level> levels) {
super();
this.levels = levels;
font = Typeface.createFromAsset(context.getAssets(), "fonts/Boogaloo-Regular.ttf");
inflater = context.getLayoutInflater();
}
@Override
public int getCount() {
return levels.size();
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
Log.d("LevelsAdapter2", "position is "+position+", convertView is "+convertView);
View vi=convertView;
if(convertView==null) vi = inflater.inflate(R.layout.item_level, null);
star = (TextView) vi.findViewById(R.id.star);
percent = (TextView) vi.findViewById(R.id.percent);
label = (TextView) vi.findViewById(R.id.level_number);
star.setTypeface(font);
label.setTypeface(font);
percent.setTypeface(font);
Level lvl = levels.get(position);
percent.setText(lvl.getPercent() + "%");
label.setText("#"+lvl.getId());
return vi;
}
As you see every time when method getView called we log its current in- params. 每次您看到调用getView方法时,我们都会记录其当前参数。 And then LogCat returns strange rows:
然后LogCat返回奇怪的行:
LevelsAdapter2(15508): position is 0, convertView is null
LevelsAdapter2(15508): position is 0, convertView is android.widget.RelativeLayout@41a9d120
LevelsAdapter2(15508): position is 0, convertView is android.widget.RelativeLayout@41a9d120
LevelsAdapter2(15508): position is 0, convertView is android.widget.RelativeLayout@41a9d120
LevelsAdapter2(15508): position is 0, convertView is android.widget.RelativeLayout@41a9d120
LevelsAdapter2(15508): position is 0, convertView is null
LevelsAdapter2(15508): position is 0, convertView is android.widget.RelativeLayout@41ad9770
EDIT: The error was when ArrayList was created and wrong filled. 编辑:错误是当创建ArrayList并错误填充时。 Helped to replace this:
帮助替换了这个:
private void constructLevels() {
Level lvl = new Level();
for (int i=0; i<lvls.length; i++) {
int id = i + 1;
lvl.setId(id);
lvl.setWord(lvls[i]);
}
addLevel(lvl);
}
to this: 对此:
private void constructLevels() {
Level lvl;
for (int i=0; i<lvls.length; i++) {
lvl = new Level();
int id = i + 1;
lvl.setId(id);
lvl.setWord(lvls[i]);
addLevel(i, lvl);
}
}
Replace this: 替换为:
@Override
public Object getItem(int position) {
return position;
}
With this: 有了这个:
@Override
public Object getItem(int position) {
return levels.get(position);
}
Try this 1. replace this method 试试这个1.替换这个方法
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if(convertView==null){
convertView = inflater.inflate(R.layout.item_level, null);
holder = new ViewHolder();
holder.star = (TextView) vi.findViewById(R.id.star);
holder.percent = (TextView) vi.findViewById(R.id.percent);
holder.label = (TextView) vi.findViewById(R.id.level_number);
convertView.setTag(holder);
}else{
holder = (ViewHolder) convertView.getTag();
}
Log.d("LevelsAdapter2", "position is "+position+", convertView is "+holder);
holder.star.setTypeface(font);
holder.label.setTypeface(font);
holder.percent.setTypeface(font);
Level lvl = levels.get(position);
holder. percent.setText(lvl.getPercent() + "%");
holder.label.setText("#"+lvl.getId());
convertView.setTag(holder);
return convertView;
}
2. add this class to your adapter 2.将此类添加到适配器
static class ViewHolder{
TextView star;
TextView percent;
TextView label;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.