0

我创建了自己的扩展 BaseAdapter 的适配器,并将其用于 GridView。我想获取元素的数量并将其放入 TextView。我在我的适配器中做到了:

@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        View gridView;

        if(convertView == null){
            gridView = new View(context);

            gridView = inflater.inflate(R.layout.grid_element, null);

            ImageView logo = (ImageView) gridView.findViewById(R.id.grid_logo);


            TextView tv = (TextView) gridView.findViewById(R.id.grid_textView1);
            tv.setText(level+position);
        }
        else
            gridView = convertView;

        return gridView;
    }

直到我在启动时获得不在屏幕中的元素,这似乎很好: 在此处输入图像描述

位置就像重置了一样。我怎样才能正确地做到这一点?

4

2 回答 2

2

当 convertView 不为空时,您没有正确设置 TextView。试试这个:

if (convertView == null) {
    gridView = inflater.inflate(R.layout.grid_element, null);
} else {
    gridView = convertView;
}

ImageView logo = (ImageView) gridView.findViewById(R.id.grid_logo);

TextView tv = (TextView) gridView.findViewById(R.id.grid_textView1);
tv.setText(level + position);
于 2013-07-15T13:05:19.030 回答
1

可以帮助新访客。

你必须知道两个主要的事情:

  1. 您需要检查是否convertView为空,以了解列表中的该行是否尚未创建(convertView = null)或正在被适配器回收(convertView != null)。这称为Recycling过程。

  2. 另一个需要知道的重要事情是View Holder Pattern. 调用findViewById()每一行getView()方法对于列表填充来说很重,并且会降低滚动性能。为避免这种情况,请创建一个带有一些视图作为类字段的静态类。findViewById()如果正在创建视图( ),则使用它,并在它被回收时convertView == null从方法中取回它getTag()

`

static class ViewHolder {
    TextView text;
    ImageView icon;
}

ViewHolder holder;
if(convertView == null) {
    convertView = inflater.inflate(resource, root); 
    holder = new ViewHolder();
    holder.icon = (ImageView) convertView.findViewById(R.id.listitem_image);
    holder.text = (TextView) convertView.findViewById(R.id.listitem_text);
    holder.timestamp = (TextView) convertView.findViewById(R.id.listitem_timestamp);
    holder.progress = (ProgressBar) convertView.findViewById(R.id.progress_spinner);
    convertView.setTag(holder);
}

holder = (ViewHolder) convertView.getTag();

// Set here your view's content : 
holder.text.setText("Sample"); 
// ...
于 2014-01-09T20:12:06.940 回答