简体   繁体   English

始终以等于0的位置调用Android BaseAdapter方法getItem

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM